<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/iphones" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Iphones ]]></title>
                <link>https://www.tomsguide.com/phones/iphones</link>
        <description><![CDATA[ All the latest iphones content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Fri, 03 Jul 2026 10:30:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ The robot voice is gone: How to make Siri sound truly human in iOS 27 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/the-robot-voice-is-gone-how-to-make-siri-sound-truly-human-in-ios-27</link>
                                                                            <description>
                            <![CDATA[ Your iPhone’s Siri just got a massive voice upgrade in iOS 27; here is how to try it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Uz3g2tNA7hVtXpx5AbWxuK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vd4AMmAxn8MgQeFJtcEy57-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Jul 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/vd4AMmAxn8MgQeFJtcEy57-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Siri AI on iPhone]]></media:description>                                                            <media:text><![CDATA[Siri AI on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[Siri AI on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vd4AMmAxn8MgQeFJtcEy57-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For years, Siri's mechanical stutter was a dead giveaway that you were talking to a robot. Not anymore. With iOS 27, Apple has overhauled its virtual assistant using advanced generative audio models that mimic natural human speech patterns. </p><p><strong>Providing you're using an iPhone 17 Pro, iPhone 17 Pro Max or iPhone Air</strong>, your daily interactions will soon feel like a fluid, back-and-forth conversation. This translates to a much smoother, lifelike tone whenever your assistant speaks. </p><p>Ready to give your compatible iPhone a voice lift? Here is how to enable and customize the new Siri.</p><h2 id="make-sure-your-iphone-s-running-ios-27-beta-2">Make sure your iPhone's running iOS 27 Beta 2</h2><p>If you haven't updated your iPhone yet, you'll need to do that before you can try out the new Siri. Before you download anything, <strong>back up your iPhone first</strong> by going to <strong>Settings, Your Name, iCloud, iCloud Backup</strong> and tapping <strong>Back Up Now</strong>.</p><p>If you’ve never used an Apple beta before, you will need to <a href="https://developer.apple.com/get-started/" target="_blank">register for a free developer account</a> to get started. Once you’re signed up and off the Apple Intelligence waitlist, you can update your phone. </p><p>However, if you’ve used any Apple beta in the past, you can skip the registration entirely and download the software. Just <strong>open Settings, go to General, Software Update, Beta Updates, and select the iOS 27 Developer Beta</strong> to begin the installation. </p><h3 class="article-body__section" id="section-how-to-customize-your-siri-voice-in-ios-27"><span>How to customize your Siri voice in iOS 27</span></h3><section class="howto-block">                    <h3>1. Enable the new iOS 27 Siri</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/9NRGGHU43DQuPjAyxvVxgj.jpg"                                        alt="Siri highlighted in iPhone settings"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/9NRGGHU43DQuPjAyxvVxgj.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide )</div></figure>                    <p><p><strong>Open the Settings app</strong> on your iPhone, then <strong>scroll down, and tap</strong> <strong>Siri</strong>. If this is your first time opening these settings since updating to iOS 27, you will need to switch on the upgraded version of the assistant. </p><p><strong>Tap Turn on Siri and select</strong> <strong>Try the New Siri from the prompt</strong> rather than "Use Previous Version." </p></p>                </section><section class="howto-block">                    <h3>2. Toggle on Expressive Voices </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/TXSUpW6Nb3AwDnd33EFb3F.jpg"                                        alt="Siri Expressive Voices Preview toggled on in Beta 2"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/TXSUpW6Nb3AwDnd33EFb3F.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide )</div></figure>                    <p><p>While Siri has offered different accents and genders for a while, the options here sound noticeably more natural.<strong> Tap through the various regional dialects and male or female voice options</strong> to hear how they sound and choose your favorite. </p><p>Next, <strong>switch the Expressive Voices Preview toggle to the on position</strong>. A new Siri voice customization screen will appear, featuring options to adjust the assistant's pace and expressivity. </p></p>                </section><section class="howto-block">                    <h3>3. Preview the personalization settings</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/GBSVL3otu85WcK2fGdLvFo.jpg"                                        alt="Customize your Siri voice"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/GBSVL3otu85WcK2fGdLvFo.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Enabling the preview brings up a brand-new Siri voice customization screen featuring two distinct adjustment sliders: <strong>Pace</strong> <strong>and</strong> <strong>Expressivity</strong>. </p><p>Sliding the Pace bar allows you to speed up or slow down how fast Siri talks, while the Expressivity bar changes the assistant's overall vocal emotion and inflection. Once you have made your choices, you can <strong>tap the</strong> <strong>blue check mark</strong> in the top right corner to save your settings.</p><p><strong>Editor's Note:</strong> You might find that the menus for adjusting pace and expressivity are currently greyed out and marked as "coming soon." Apple is expected to activate these personalization features in a future iOS 27 point update, so watch this space.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evLgmO"></div>                            </div>                            <script src="https://kwizly.com/embed/evLgmO.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-has-a-hidden-liquid-glass-slider-here-is-how-to-find-and-use-it">iOS 27 has a new ‘Liquid Glass’ slider — here is how to find and use it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again">This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-3-new-ios-27-ai-tools-that-will-instantly-save-your-ruined-photos">3 iOS 27 tools that will instantly save your ruined photos</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iOS 27 will help protect you from social engineering scams in real time — here's how ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/ios-27-will-help-protect-you-from-social-engineering-scams-in-real-time-heres-how</link>
                                                                            <description>
                            <![CDATA[ iOS 27's Trust Insights can analyze your actions, and help apps to warn you if it looks like you're about to become the victim of a social engineering scam. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hbpDxgobSfSgcLrbpNiXPV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Jul 2026 10:08:37 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Apple/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:description>                                                            <media:text><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Scams are unfortunately everywhere, and it doesn't matter how clued in you might be, you can't be vigilant 100% of the time — and it only takes one lapse in concentration for the scammers to win. Thankfully our tech is stepping in to offer some extra protection, and <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> is set to make it easier to be notified if you're about to be scammed</p><p>Apple is introducing a new framework called "Trust Insights" in iOS 27, and it's designed to warn apps that you may be falling victim to a social engineering scam. The framework is designed to run "mostly on-device" with the ability to analyze “interaction patterns, timing, context, and basic sensor data.” </p><p>If the framework detects that the user may be getting coached through a scam, Trust Insights will assign a risk level (medium  or high), which will allow apps to add warnings, delays or implement additional levels of verification.</p><p>That last part sounds particularly ingenious to me. Like any kind of unsolicited caller, scammers are usually working from some kind of script, as soon as things go off into unfamiliar territory they may have to start improvising. That makes their job harder, and gives users more of a chance to figure out that something isn't right.</p><h2 id="how-trust-insights-works">How Trust Insights works</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fEYeQL4EHKrcTZiXvo8LJm" name="iPhone iOS 27 LIST_alt3" alt="iOS 27 icon shown on an iPhone screen" src="https://cdn.mos.cms.futurecdn.net/fEYeQL4EHKrcTZiXvo8LJm.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple/Shutterstock)</span></figcaption></figure><p>The problem is that <a href="https://www.tomsguide.com/computing/online-security/what-is-social-engineering">social engineering scams</a> are much harder to automatically detect, because there's no kind of unauthorized access going on. The user is the one doing those actions, even if they're being coached by someone on the other end of a phone call. That's why the Trust Insights framework needs to be able to analyze what's going on.</p><p>Apple has confirmed that the framework doesn't look at the contents of messages, emails or photos. Instead it analyzes the behavioral signals on your devices, and then discards the underlying data before sending a single output value to an Apple server. </p><p>That value can then be combined with information on your Apple account, checking for unusual activity, before making a final decision on whether a scam may be occurring. The analysis itself will cover five key categories:</p><ul><li><strong>Payment:</strong> Including assets, content money or in-game purchases</li><li><strong>Account: </strong>Updating your account details or security information</li><li><strong>Resources use:</strong> Requests that involve costly or constrained infrastructure, such as AI inference</li><li><strong>Communication: </strong>Sending messages. submitting forms and signing documents</li><li><strong>Other:</strong> a broad category designed as a fallback for anything that doesn't fit the other four categories.</li></ul><p>Apple did say that users can switch off Trust Insights in the settings menu, but there may be a cooldown period to stop scammers coaching users into switching it off. Which makes sense, considering that's the first thing a savvy scammer is going to ask you to do.</p><p>Obviously this is going to rely on apps implementing the framework before Trust Insights can do you much good. That said, with the rate at which scams are increasing, and how clever they are at duping even the smartest of people into handing over their money, any extra protection our devices can offer is a good thing. You can learn more about Trust Insights on the <a href="https://developer.apple.com/videos/play/wwdc2026/379/" target="_blank">Apple Developer site</a>.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/tech/i-just-got-both-my-battery-packs-confiscated-at-a-chinese-airport-and-i-wish-id-known-about-this-one-thing-before-flying">I just got both my battery packs confiscated at a Chinese airport, and I wish I’d known about this one thing before flying</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-expects-10-million-people-to-buy-a-usd2-500-iphone-ultra-and-its-a-huge-gamble">Apple expects 10 million people to buy a $2,500 iPhone Ultra — and it's a huge gamble</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-finally-threw-android-users-a-bone-with-this-new-ios-27-photo-feature-heres-how">Apple finally threw Android users a bone with this new iOS 27 photo feature — here's how</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple finally threw Android users a bone with this new iOS 27 photo feature — here's how ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/apple-finally-threw-android-users-a-bone-with-this-new-ios-27-photo-feature-heres-how</link>
                                                                            <description>
                            <![CDATA[ Apple made iCloud Shared Albums available to everyone with iOS 27, and it's about time Apple started tasking non-Apple users a little more seriously. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FkT7peVRxU3hEnRa2ENHkh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Jul 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 logo on iPhone]]></media:description>                                                            <media:text><![CDATA[iOS 27 logo on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 logo on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple is one of those companies that values loyalty, and routinely rewards it with various exclusive perks and features that can only be accessed from an <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">iPhone</a> or some other kind of Apple device. But if you're not an Apple user, or dare to prefer one of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a>, Apple tends to try and ignore your very existence. The same is true for Windows PCs.</p><p>There are occasions where Apple will get a little generous, and throw a bone to the people that don't actively buy its products. Sometimes that involves giving them access to Apple services, like Apple Music or Apple TV, and others it means access to features that Apple had previously kept locked inside the walled garden for its own users. </p><p>Here's the good news:<strong> </strong><a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026"><strong>iOS 27</strong></a><strong> will give Android and Windows users the ability to take full advantage of </strong><a href="https://www.tomsguide.com/how-to/how-to-set-up-an-icloud-shared-photo-library"><strong>iCloud Shared Albums</strong></a><strong> without needing an Apple device</strong>.</p><h2 id="shared-albums-for-everyone">Shared Albums for everyone</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="weyZfBzJovupGzE9GPgujN" name="ios18-photos-recent-days.jpeg" alt="iOS 18 photos recent days" src="https://cdn.mos.cms.futurecdn.net/weyZfBzJovupGzE9GPgujN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>iCloud Shared albums are exactly what they sound like. They are albums, stored within iCloud, that allow multiple people to share photos and videos together. Each album can store up to 5,000 photos and videos, and previously anything added to those albums didn't count towards your iCloud storage limits.</p><p>That'll stop being the case in iOS 27 and<a href="https://www.tomsguide.com/computing/macos/macos-27-the-5-biggest-wwdc-2026-announcements-we-expect"> macOS 27</a>, but we will get to that annoying piece of small print a little later.</p><p>Shared Albums, previously referred to as iCloud Photo Sharing, have existed in some form for a long time. The idea is that you can easily share photos and videos with up to five other people, giving everyone the ability to add and edit photos as they see fit. Better still, Apple Photos didn't cordon off those files into their own separate albums, and instead shows them in your main feed alongside everything else you've shot.</p><p>Sadly, Apple kept unlimited access to those shared albums exclusive to its own devices. So you needed an <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">iPhone</a>, iPad or Mac to be able to get the full shared album experience. Windows users could get limited viewing privileges via the iCloud app, while Android users could view them in their web browser. </p><p>But Apple is changing that with the next wave of OS upgrades. Once you have access to iOS 27 and macOS 27, you'll be able to "upgrade" your shared albums and bring Android and Windows users into the fold — and let them add their own photos just as they would if they owned an iPhone. <strong>These upgrade albums also let everyone share full-resolution, uncompressed files for the first time.</strong></p><p>The downside is that these new upgraded shared albums are apparently <a href="https://www.idownloadblog.com/2026/06/23/shared-icloud-album-consume-icloud-space/" target="_blank">no longer exempt</a> from iCloud storage limits. Instead, it appears that the person who upgrades the album is responsible for everything that gets stored — which is going to be a real pain if your friends insist on posting large video files to the shared album.</p><p>It's not clear why, though my guess would be that Apple doesn't want non-Apple users taking advantage of free iCloud storage when they don't directly contribute to its bottom line. Android phones have no ability to pay for an iCloud subscription, after all, and they don't buy iPhones. </p><p>There are temporary shared albums that remain free for 30 days, but any permanent option is going to cost you money.</p><h2 id="apple-should-be-more-mindful-of-android-and-windows-users">Apple should be more mindful of Android and Windows users</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3087px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="F7GBaENHYbQDSdaXKinKiZ" name="Galaxy S26 Ultra vs iPhone 17 pro Max-LIST" alt="iphone 17 pro max vs samsung galaxy s26 ultra" src="https://cdn.mos.cms.futurecdn.net/F7GBaENHYbQDSdaXKinKiZ.jpg" mos="" align="middle" fullscreen="" width="3087" height="1736" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I get why Apple focuses on its own users over everyone else. These are the people who have iPhones, <a href="https://www.tomsguide.com/best-picks/best-apple-watch">Apple Watches</a>, and probably an iPad or Mac as well, and it's just good business to keep these people happy with a constant string of features and upgrades that make their devices more useful. </p><p>But at the same time there are plenty of things Apple could be doing to try and appeal to non-Apple users as well. <strong>I don't expect Apple to start unlocking exclusive </strong><a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review"><strong>AirPods</strong></a><strong> features, or offering unrestricted Apple Watch access to Android users.</strong> It would just be nice if Apple realized that there are ways it can benefit from opening up to those people as well. </p><p>This could be as simple as adding a remote control feature to the Apple TV app on Android. <a href="https://www.tomsguide.com/entertainment/apple-tv/apples-price-hikes-finally-made-me-pick-up-the-apple-tv-4k-ive-been-eyeing-for-weeks-and-you-can-still-grab-one-at-the-old-price">I recently bought an Apple TV 4K</a>, switching over from Roku despite the fact I knew there wasn't an official virtual remote. Naturally,</p><p>Having an official remote on my <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-review-a-great-phone-but-it-doesnt-feel-like-much-of-an-upgrade">Pixel 10 Pro</a> would be a massive quality of life improvement for watching TV during those occasions when I can't find or reach the actual remote.</p><p>It would also be nice for Apple to offer access to some of its other services, like iCloud, to paying customers off platform. Not because I have any major desire to switch all my cloud storage needs to Apple servers, versus Google's, but because it's nice to have extra options.</p><p>I know what people will say. Having access to Apple services is a selling point for Apple devices, with the cost of entry being the few hundred dollars you spend on your device. Offering too much without that paywall would only devalue Apple's ecosystem — which is not something Apple wants to happen.</p><h2 id="cross-platform-interaction-is-a-work-in-progress">Cross platform interaction is a work in progress</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ptzgAU2RNpxpNjaNbgRrZL" name="Android vs iPhone.shutterstock_2118140306.jpg" alt="Google Messages on Android phone next to Messages app on iPhone" src="https://cdn.mos.cms.futurecdn.net/ptzgAU2RNpxpNjaNbgRrZL.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>We also have to remember that iPhone and Mac users don't exist in a vacuum, and they do interact with Android and Windows users on a regular basis. Ensuring better methods of communication between those groups benefits everyone, including Apple's own users. </p><p><strong>The recent push to add </strong><a href="https://www.tomsguide.com/phones/android-phones/ive-been-waiting-a-decade-for-airdrop-on-android-and-its-finally-fixed-my-biggest-frustration"><strong>AirDrop support to Android's QuickShare</strong></a><strong> is a great example</strong> of this, and while Apple could have shut down Google's attempts to make it happen without discussion, it makes sense to allow Android and iPhone users to be able to share files easily and seamlessly — even though they're on opposing platforms. </p><p>The same is true for the <a href="https://www.tomsguide.com/news/apple-shocker-rcs-messaging-coming-to-iphones-in-2024">addition of RCS messaging support</a>. iMessage only works on iPhones, and messaging Android defaulted to SMS which is unencrypted and compressed shared files within an inch of their life. </p><p>Some have claimed that Apple was forced to add RCS support <a href="https://www.tomsguide.com/phones/iphones/iphones-may-be-getting-rcs-support-because-of-china-not-the-eu">by the Chinese government</a>, but it doesn't change the fact that messaging Android users from an iPhone is far more user-friendly and secure than it was in the past. And that's better for everyone.</p><h2 id="bottom-line">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="K5SQbjBSv85JzgqYxoY5Lm" name="iPhone iOS 27 LIST_alt6" alt="iOS 27 icon shown on an iPhone screen" src="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple/Shutterstock)</span></figcaption></figure><p>There's never going to be true parity between Apple products and those running on other platforms. Apple has invested too much in keeping users tied to the Apple ecosystem and offering too much to people who don't buy iPhones or Macs is just going to make their own platform less appealing. </p><p>This would devalue the Apple experience, and harm the company's bottom line. That means it's never going to happen, and Apple will continue to try and ignore Android, Windows and any other rival platform out there for as long as humanly possible.</p><p>But this doesn't change the fact that there are benefits to allowing better connectivity between Apple devices and those same rivals. It could be a way to draw some extra revenue from people who wouldn't otherwise be Apple customers, or to improve the cross-platform experience for people who are.</p><p>The tides have been turning for this, and iCloud Shared Albums are the latest example of how Apple has figured out that it needs to be more mindful of Android and Windows users. But, as ever, there's always more that can be done.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/tech/i-just-got-both-my-battery-packs-confiscated-at-a-chinese-airport-and-i-wish-id-known-about-this-one-thing-before-flying">I just got both my battery packs confiscated at a Chinese airport, and I wish I’d known about this one thing before flying</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-expects-10-million-people-to-buy-a-usd2-500-iphone-ultra-and-its-a-huge-gamble">Apple expects 10 million people to buy a $2,500 iPhone Ultra — and it's a huge gamble</a></li><li><a href="https://www.tomsguide.com/phones/major-security-holes-in-airdrop-and-quickshare-put-your-phone-at-risk-of-attack-heres-how-to-protect-yourself">Major security holes in AirDrop and QuickShare put your phone at risk of attack — here's how to protect yourself</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple expects 10 million people to buy a $2,500 iPhone Ultra — and it's a huge gamble ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/apple-expects-10-million-people-to-buy-a-usd2-500-iphone-ultra-and-its-a-huge-gamble</link>
                                                                            <description>
                            <![CDATA[ Reports suggest Apple just increased production targets for iPhone Ultra to 10 million units, all while apparently charging $2,500 for each device. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4M8TQBLnbSymwB6vcUESNc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 13:27:52 +0000</pubDate>                                                                                                                                <updated>Thu, 02 Jul 2026 13:32:24 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg">
                                                            <media:credit><![CDATA[Majin Bu on X]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Fold design ]]></media:description>                                                            <media:text><![CDATA[iPhone Fold design ]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Fold design ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It sounds like Apple has very high hopes for the iPhone Ultra, and according to a new report from <a href="https://asia.nikkei.com/business/technology/apple-to-launch-5-new-iphone-models-to-gain-market-share-amid-memory-crunch" target="_blank">Nikkei Asia</a> it's actually increasing its production targets for its first foldable phone. <strong>Previously we'd heard reports that Apple was targeting somewhere between </strong><a href="https://www.tomsguide.com/phones/iphones/foldable-iphone-display-reportedly-beginning-production-ahead-of-2026-launch"><strong>7 and 8 million foldable phones</strong></a><strong>, but that figure may have just risen to 10 million.</strong></p><p>While 10 million seems like a lot, Apple's entire production target for the second half of 2026 is around 85 million new iPhones. </p><p>That apparently includes 70 million <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a>, and will no doubt include the likes of the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17</a>,<a href="https://www.tomsguide.com/phones/iphones/iphone-air-review"> iPhone Air</a> and<a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17e-review"> iPhone 17e</a>, which are still expected to be available beyond the September Apple event. The figure will reportedly not include the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18</a> or <a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-all-the-rumors-so-far">iPhone Air 2</a>, which are not expected to arrive until sometime in early 2027.</p><p>Crucially, <strong>the iPhone Ultra is now predicted to cost as much as $2,500, according to </strong><a href="https://www.tomsguide.com/phones/iphones/usd1-299-iphone-18-pro-max-analyst-now-predicts-usd200-price-hike-for-apples-next-flagship-phone"><strong>analysts at IDC</strong></a><strong>.</strong> Previous estimates suggested that the phone <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-could-cost-less-than-galaxy-z-fold-7-under-usd2-000">could sell for around $2,000</a>, a figure that <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-just-tipped-to-cost-an-obscene-usd2-399-but-it-could-have-this-apple-exclusive">later increased to $2,400</a>. 10 million units would be a very big gamble for Apple. </p><h2 id="iphone-ultra-vs-samsung-s-foldables">iPhone Ultra vs Samsung's foldables</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6kLR5TcVmSPDqEd7kcDncQ" name="Samsung Galaxy Z Fold 8 leaked render" alt="Samsung Galaxy Z Fold 8 leaked render" src="https://cdn.mos.cms.futurecdn.net/6kLR5TcVmSPDqEd7kcDncQ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android Headlines)</span></figcaption></figure><p>10 million is quite small in the grand scheme of things, especially when you consider the fact that Apple is expected to have ordered 220 million iPhone units for the entirety of 2026.</p><p>But it's worth noting that Samsung, the current leader in the foldable phone space outside China, reportedly expected to sell 7 million foldables throughout the year. <strong>Samsung will have four foldable devices this year</strong>, including the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-trifold-review">Galaxy Z TriFold</a> and upcoming <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-vs-galaxy-z-fold-wide-biggest-expected-differences">Galaxy Z Fold 8</a>, complete with a wide design that will go head-to-head with the iPhone Ultra.</p><p><strong>Apple apparently wants to beat Samsung at its own game with a single foldable device.</strong></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ONVEJO"></div>                            </div>                            <script src="https://kwizly.com/embed/ONVEJO.js" async></script><h2 id="can-apple-actually-do-it">Can Apple actually do it?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1964px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="jKyo3FUB76apN2dfooDL9d" name="iPhone Fold render edit 1-2" alt="Renders of the potential iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/jKyo3FUB76apN2dfooDL9d.jpg" mos="" align="middle" fullscreen="" width="1964" height="1105" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: FPT)</span></figcaption></figure><p>There's no doubt that the iPhone Ultra is going to turn some heads, but whether Apple can actually hit those lofty sales targets is another matter. The cost of phones is on the rise, and it's been speculated that the iPhone 18 Pro Max could be as much <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumor-usd200-more-and-now-just-3-colors">as $200 more expensive</a> than the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a>.</p><p><strong>If the $2,500 prediction is accurate, that would be a lot of money to spend on a single smartphone, even if it is Apple's first ever foldable. </strong></p><p>If the $3,500 <a href="https://www.tomsguide.com/computing/vr-ar/apple-vision-pro-feels-more-like-a-dollar3500-accessory-than-a-spatial-computer-heres-why">Apple Vision Pro</a> taught us anything (now $3,700 with price hikes), it's that all the advanced technology in the world can't make up for your device not being affordably priced. Even if Apple is relying on customers signing up for payment plans and trading in older devices, it doesn't change the fact it's reportedly charging over $1,000 more than the most expensive non-folding iPhone.</p><p>The rising cost of components, particularly memory and storage, is out of Apple's hands — and it can only insulate consumers from rising costs by so much. That's why Apple  <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">hiked the prices for iPads and Macs last week</a>. But at the same time, the rumored cost of the iPhone Ultra has <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-could-cost-less-than-galaxy-z-fold-7-under-usd2-000">risen by $500 over the past 12 months</a>. </p><h2 id="what-is-apple-thinking">What is Apple thinking?</h2><p>I have to wonder if, at some point, someone inside Apple's boardrooms has raised their hand and said "Should we really be making so many of these considering how much we're planning to charge?" It's starting to feel as though Apple is totally oblivious to the fact that there is a point where the cost of buying premium devices stops being worth it — and the last thing it needs is millions of unsold iPhone Ultras gathering dust in Apple Store backrooms.</p><p>We're not going to find out how this situation will play out until after the iPhone Ultra is released later this year. Who knows, maybe my concerns are unfounded, and these things will be flying off the shelves faster than Apple can restock. Then again, we could just end up with another Vision Pro fiasco on our hands. </p><p>Let me know what you think in the comments. Would you pay $2,500 for an iPhone Ultra foldable?</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-battery-leak-suggests-big-changes-are-coming-what-we-know">iPhone 18 Pro Max battery leak suggests big changes are coming — what we know</a></li><li><a href="https://www.tomsguide.com/tech/i-just-got-both-my-battery-packs-confiscated-at-a-chinese-airport-and-i-wish-id-known-about-this-one-thing-before-flying">I just got both my battery packs confiscated at a Chinese airport, and I wish I’d known about this one thing before flying</a></li><li><a href="https://www.tomsguide.com/phones/android-phones/android-17-drops-lockscreen-guess-limits-from-1-800-to-20-heres-what-that-means-for-you" target="_blank">Android 17 drops lockscreen guess limits from 1,800 to 20 — here's what that means for you</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone 18 Pro Max battery leak suggests big changes are coming — what we know ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-battery-leak-suggests-big-changes-are-coming-what-we-know</link>
                                                                            <description>
                            <![CDATA[ Apple could be pushing iPhone 18 Pro Max's battery even bigger with a major increase to capacity. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HJKURZZsZjpnUWfH9nFe46</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6HnHMXNAHSBiejiSuSxcSa-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 10:28:10 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6HnHMXNAHSBiejiSuSxcSa-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 17 Pro Max in a London Underground station]]></media:description>                                                            <media:text><![CDATA[iPhone 17 Pro Max in a London Underground station]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 17 Pro Max in a London Underground station]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6HnHMXNAHSBiejiSuSxcSa-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's been a big week for<a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far"> iPhone 18 Pro</a> leaks, following the unauthorized release of what is <a href="https://www.tomsguide.com/phones/iphones/easily-the-biggest-leak-in-apples-history-iphone-18-pro-final-design-may-have-just-been-revealed-in-a-stolen-drop-test-video">reportedly an official drop test of Apple's upcoming flagship</a>. Now we may have just found out exactly how big the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max's</a> batteries are set to be — and it's good news.</p><p>I say batteries because, like last year, Apple is apparently going to release the eSIM-only version of the iPhone 18 Pro Max with a larger battery. According to a now-deleted tweet from X account Fire Universe (via <a href="https://www.gsmarena.com/iphone_18_pro_maxs_exact_battery_capacity_leaks-news-73534.php" target="_blank">GSMArena</a>), the iPhone 18 Pro Max's eSIM model will come with a 5,425 mAh battery. </p><p>Those of you in regions where physical SIM slots are still the norm will apparently have to make do with a smaller 5,235 mAh battery instead.</p><p>Assuming this leak is accurate, that would be a huge leap in battery capacity for Apple's largest iPhone. The eSIM<a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review"> iPhone 17 Pro Max</a> had a 5,088 mAh battery, while the model with a physical card slot had 4,823 mAh. This means we could be looking at a 337 mAh increase for the eSIM model and 412 mAh for the physical SIM variant. </p><p>For reference, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung's Galaxy S26 Ultra</a> has offered the same 5,000 mAh battery as the last several generations of Galaxy flagships. The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-everything-we-know-so-far">Pixel 11 Pro XL</a> is also expected to come with an even <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-11-battery-capacity-just-leaked-and-it-has-me-worried-about-googles-next-flagship">5,000 mAh in its battery</a>, which would be a 200 mAh decrease from the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">10 Pro XL</a>. </p><h2 id="this-is-a-big-change-for-apple">This is a big change for Apple</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gqEeSaw5ynJVqNSsAjFGan" name="iPhone 18 Pro" alt="iPhone 18 Pro dummy models colors" src="https://cdn.mos.cms.futurecdn.net/gqEeSaw5ynJVqNSsAjFGan.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: SonnyDickson)</span></figcaption></figure><p>Historically it was always iPhones that had relatively small batteries, with Android flagships often offering several hundred milliamp hours of extra battery capacity in comparison. So to see the tables turning is quite surprising, even if Apple is still lagging behind brands that have adopted<a href="https://www.tomsguide.com/phones/i-interviewed-honor-and-oneplus-about-their-silicon-carbon-battery-tech-apple-and-google-are-quickly-falling-behind"> silicon carbon battery technology</a> — like OnePlus.</p><p>The fact Apple has opted for smaller batteries hasn't been a major issue over the last few years. There's been a push for energy efficiency and better software optimization, which ensured the largest iPhones had some of the <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">best phone battery life</a> with those smaller batteries. </p><p>Needless to say it's going to be interesting to see how well an iPhone 18 Pro Max fares in battery life testing, if it really does come with up to 5,425 mAh of power reserves. We're not likely to see <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-15-review">OnePlus 15</a> levels of battery life, since the 7,300 mAh battery lasted over 25 hours during testing, but we should hopefully still see a marked improvement compared to <a href="https://www.tomsguide.com/phones/iphones/iphone-17-battery-life-results-are-in-how-do-the-new-iphones-compare-to-other-flagships">iPhone 17 Pro Max's 17 hours and 54 minutes</a>. </p><p>We'll find out more once the iPhone 18 Pro Max is released later this year, but in the meantime check out our official iPhone 18 Pro Max hub for all the latest news and rumors about the phone.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumor-usd200-more-and-now-just-3-colors">iPhone 18 Pro rumor — $200 more and now just 3 colors?</a></li><li><a href="https://www.tomsguide.com/tech/i-just-got-both-my-battery-packs-confiscated-at-a-chinese-airport-and-i-wish-id-known-about-this-one-thing-before-flying">I just got both my battery packs confiscated at a Chinese airport, and I wish I’d known about this one thing before flying</a></li><li><a href="https://www.tomsguide.com/phones/android-phones/android-17-drops-lockscreen-guess-limits-from-1-800-to-20-heres-what-that-means-for-you" target="_blank">Android 17 drops lockscreen guess limits from 1,800 to 20 — here's what that means for you</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone 18 Pro rumor — $200 more and now just 3 colors? ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumor-usd200-more-and-now-just-3-colors</link>
                                                                            <description>
                            <![CDATA[ A new leak claims that Apple will only offer the iPhone 18 Pro in three colors. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6D9DWTrb7nG4dUosW2bNNN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bc3v2xma2LGpb9mYSNpejc-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Wed, 01 Jul 2026 19:36:24 +0000</pubDate>                                                                                                                                <updated>Wed, 01 Jul 2026 19:40:42 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/bc3v2xma2LGpb9mYSNpejc-1280-80.png">
                                                            <media:credit><![CDATA[Macworld]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iphone 18 pro in dark cherry color from macworld]]></media:description>                                                            <media:text><![CDATA[iphone 18 pro in dark cherry color from macworld]]></media:text>
                                <media:title type="plain"><![CDATA[iphone 18 pro in dark cherry color from macworld]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bc3v2xma2LGpb9mYSNpejc-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Suddenly the picture forming about the<a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models" target="_blank"> iPhone</a><a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models"> 18 Pro</a> is one of sacrifices and drawbacks. The most recent rumor indicates that Apple is planning to only release its next flagship with three color options. </p><p>The leak comes from prominent tipster <a href="https://www.weibo.com/5143897135/R6xjQBTqb" target="_blank">Instant Digital on Weibo </a>who says that the iPhone 18 Pro will come in these three hues:</p><ul><li><strong>Dark Cherry</strong></li><li><strong>Light Blue</strong></li><li><strong>Silver-Gray</strong></li></ul><p>Now to be clear, a slate of only three shades is not new. Despite rumors claiming the iPhone 17 Pro would debut in five colors, it <a href="https://www.tomsguide.com/phones/iphones/iphone-17-and-17-pro-colors-these-are-your-options-and-our-favorites">only comes in three</a>: Cosmic Orange, Deep Blue and Silver. </p><p>Last year was actually the first time Apple didn't offer the iPhone in black, and it appears the iPhone 18 Pro will keep that trend in place.</p><p>Meanwhile, like the striking cosmic orange, dark cherry will likely be the standout color. And light blue replaces last year's deep blue. </p><h2 id="more-expensive">More expensive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="edrAXHE9g3bm9Ewc5ZC3R9" name="iPhone 17 Pro review" alt="iPhone 17 Pro review." src="https://cdn.mos.cms.futurecdn.net/edrAXHE9g3bm9Ewc5ZC3R9.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Unfortunately, these new colors are expected to be more expensive the iPhone 17 versions. </p><p><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-launch-date-tipped-in-new-gurman-report-and-we-have-a-fresh-look-at-the-design">Apple recently announced increased prices</a> for all of its MacBooks, iPads, and other devices except the iPhone. But <a href="https://www.tomsguide.com/phones/iphones/analysts-warn-the-iphone-18-price-hike-could-be-worse-than-we-thought">one IDC analyst</a> told Tom's Guide that iPhone 18 Pro, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro Max</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra/Fold</a> could be up to $200 more expensive. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xj3jRe"></div>                            </div>                            <script src="https://kwizly.com/embed/Xj3jRe.js" async></script><p>As an example, the iPhone 18 Pro could start at $1,299 compared to the current $1,099 iPhone 17 Pro base model.</p><p>The foldable iPhone is expected to <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-specs-and-price-leak-and-the-sales-projections-are-absolutely-bonkers-versus-samsung">sell for closer to $1,999</a> for its vanilla model with the highest storage tier hitting $2,400.</p><h2 id="release-date">Release date</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="48s78XNR8Pk2Kag9Sy5LYV" name="iPhone 17 Pro Max-18" alt="iPhone 17 Pro Max" src="https://cdn.mos.cms.futurecdn.net/48s78XNR8Pk2Kag9Sy5LYV.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apple typically launches its iPhone lineup in September. This year's announcement should be unique as we expect Apple will only reveal the iPhone 18 Pro models and its new foldable phone. </p><p>The iPhone 18 and iPhone 18e aren't expected to launch until next Spring.</p><p>This week <a href="https://www.bloomberg.com/news/newsletters/2026-06-28/apple-s-sweeping-price-hikes-bring-the-ai-era-home-m6-m7-touch-macbook-pro" target="_blank">Bloomberg's Mark Gurman</a>, claimed that "the most likely date for the debut of the iPhone 18 Pro, iPhone 18 Pro Max and foldable iPhone is Sept. 8, with Sept. 9 as the runner-up."</p><p>Do any of the iPhone 18 Pro colors excite you, beyond the price? Let us know in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/smart-glasses/apple-is-rethinking-its-future-product-roadmap-after-losing-smart-glasses-chief-to-openai-analysts-say">Apple is 'rethinking its future product roadmap' after losing smart glasses chief to OpenAI, analysts say</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/the-end-of-an-era-apple-is-quietly-ditching-one-of-its-iconic-apple-watch-features-with-watchos-27">The end of an era: Apple is quietly ditching one of its iconic Apple Watch features with watchOS 27</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/for-first-time-since-1984-thinking-about-bailing-on-apple-customers-react-apple-price-hikes">'For the first time since 1984 when I bought my first Mac, I am thinking about bailing on Apple' — customers weigh in on Apple's eye-watering price hikes</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Easily the biggest leak in Apple's history': iPhone 18 Pro final design may have just been revealed in a stolen drop test video ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/easily-the-biggest-leak-in-apples-history-iphone-18-pro-final-design-may-have-just-been-revealed-in-a-stolen-drop-test-video</link>
                                                                            <description>
                            <![CDATA[ Videos allegedly showing a pre-release iPhone 18 Pro undergoing a drop test have been circulating on social media following a vast data breach at an Apple supplier. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8UAjbRVTHXn6SYYLwNoHEC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3aJ35VAJALZ8QTniJFiPH8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Jun 2026 09:41:47 +0000</pubDate>                                                                                                                                <updated>Tue, 30 Jun 2026 10:18:49 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ jeff.parsons@futurenet.com (Jeff Parsons) ]]></author>                    <dc:creator><![CDATA[ Jeff Parsons ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/7z3UTGGrmSokMKxTWHmhjX.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jeff is U.K. Editor-in-Chief for Tom’s Guide looking after the day-to-day output of the site’s British contingent. &lt;/p&gt;&lt;p&gt;Rising early and heading straight for the coffee machine, Jeff loves nothing more than dialling into the zeitgeist of the day’s tech news. A journalist for over a decade, he&#039;s travelled around the world testing and reviewing any gadget he can get his hands on.&lt;/p&gt;&lt;p&gt;Before joining the team at Tom’s Guide, Jeff covered technology and science for two of the U.K.’s biggest national news sites: Metro.co.uk and the Daily Mirror. Memorable moments include getting lost in Vienna in an electric Audi, touring Lockheed Martin’s mile-long jet factory in Fort Worth and filming a Netflix documentary about Elon Musk in West London.&lt;/p&gt;&lt;p&gt;When not plugged into the current news agenda, editing or commissioning a series of articles or debating the merits of Apple vs Android, Jeff can usually be found out for a run trying to shave precious seconds off his PB. Or lifting weights in a vain attempt to offset the ageing process.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/3aJ35VAJALZ8QTniJFiPH8-1280-80.jpg">
                                                            <media:credit><![CDATA[X.com/Ice Universe]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro drop test]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro drop test]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro drop test]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3aJ35VAJALZ8QTniJFiPH8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple is obsessed with preserving as much secrecy as it can before officially revealing the rumored <a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models">iPhone 18 Pro</a>, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro Max</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra/Fold</a> at the Apple Event in September. But the company has just been dealt a huge blow by a data breach at one of its suppliers.</p><div><blockquote><p>More than 200,000 files are believed to have been posted to the dark web following the 'cybersecurity incident' Tata reported last week.</p></blockquote></div><p>Photos, videos and component lists of the upcoming devices have been circulating on social media after one of Apple's India-based suppliers, Tata Electronics, suffered a data breach last week. More than 200,000 files are believed to have been posted to the dark web following the 'cybersecurity incident' Tata reported last week.</p><p>These files include documentation on other products made by Tata, but according to Reuters, drawings of the iPhone 18 Pro circuit board, A20 chip, and supplier lists for components are also among them. </p><p>They also include drop test photos, which is part of customary testing for durability. While it's not been confirmed whether or not any videos are among the leak, one such video is being circulated on social media. Tom's Guide hasn't been able to verify if this video is accurate or merely AI-generated. If genuine, it would give us some huge clues about what to expect in September.</p><p>The clip was <a href="https://x.com/universeice/status/2071801062210859079?s=46" target="_blank">shared on X.com</a> for a brief time before it was taken down by noted leaker Ice Universe, who commented: "This is easily the biggest leak in Apple's history. You're looking at the drop test of the iPhone 18 Pro. Durability seems solid, but it's still surprisingly thick, and the weight remains a concern. The new color looks pretty good, though."</p><p>The video shows an alleged iPhone 18 Pro with a refreshed back design with a metal and glass finish much closer in color than the two-tone look of the iPhone 17.</p><p>In addition, the rear camera lenses appear to protrude further from the chassis than on the iPhone 17 Pro. We're expecting to see the iPhone 18 Pro arrive with the same trio of 48MP units covering main, ultrawide and 4x telephoto duties as the 17 Pro. But unlike the current model, Apple is <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-camera-may-get-this-major-upgrade-but-why-isnt-iphone-18-pro-getting-it-too  ">tipped to introduce a variable aperture</a> feature to the iPhone for the first time with the iPhone 18 Pro.</p><p>The same video, from a different angle, was posted by <a href="https://x.com/evleaks/status/2071681836237901887" target="_blank">EVLeaks</a>. This was also taken down after a few hours.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1434px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="AKgGWZspQzFJvkZ5JpFKF8" name="iPhone 18 Pro drop test 2" alt="iPhone 18 Pro drop test 2" src="https://cdn.mos.cms.futurecdn.net/AKgGWZspQzFJvkZ5JpFKF8.jpg" mos="" align="middle" fullscreen="" width="1434" height="806" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: X.com/EVLeaks)</span></figcaption></figure><p>While both those leakers have pulled their tweets, one from TechKard is still live showing the two videos side-by-side.</p><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">iPhone 18 Pro drop test from recent data breach at Apple supplier Tata Electronics.Via:@evleaks #Apple #iPhone18Pro https://t.co/9ZSojlOLSr pic.twitter.com/wdZs6dKuQP<a href="https://twitter.com/cantworkitout/status/2071844015129903310">June 30, 2026</a></p></blockquote><div class="see-more__filter"></div></div><p>Apple is widely believed to unveil the iPhone 18 Pro and the iPhone 18 Pro Max alongside the iPhone Fold in September. According to the most recent speculation, it could be September 8.</p><p>The company fiercely guards details around upcoming products and will no doubt be investigating to make sure no details of the iPhone Fold are released as part of this leak. It could also significantly damage the relationship between Apple and Tata Electronics, which was created to move the former's supply chain away from China.</p><p>Making component and supplier details public gives everyone from counterfeiters to would-be rivals a glimpse into Apple's dealings. Right now, many iPhone owners thinking about upgrading will be considering cost. <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple recently raised the prices</a> on its MacBooks, iPads and other products and an IDC analyst told us the new Pro iPhones could be priced up to $200 higher.</p><p>Apple hasn't officially commented on the data breach, but a representative from Tata told <a href="https://techcrunch.com/2026/06/22/tata-electronics-a-major-tech-supplier-to-apple-and-tesla-confirms-data-breach/" target="_blank">TechCrunch</a> it had had "no impact on our operations across businesses, which remain unaffected.”</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5v8BO"></div>                            </div>                            <script src="https://kwizly.com/embed/W5v8BO.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/analysts-warn-the-iphone-18-price-hike-could-be-worse-than-we-thought">iPhone 18 Pro price hike could be worse than we thought</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-tipped-for-minor-battery-gains-this-year-but-theres-a-hidden-upgrade-coming">iPhone 18 Pro just tipped for minor battery gains — but there's a hidden upgrade coming</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iOS 27 takes huge leaps with AI, but it's still missing this key feature Android has had for years ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/ios-27-takes-huge-leaps-with-ai-but-its-still-missing-this-key-feature-android-has-had-for-years</link>
                                                                            <description>
                            <![CDATA[ iPhone users are missing out on an Apple's take on Android's Circle to Search, and that needs to change. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">T3R6GCQjageXDnVzGs7reN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Jun 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Apple/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:description>                                                            <media:text><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/phones/iphones/ios-27-11-biggest-features-coming-to-your-iphone">iOS 27</a> seems to be the turning point for Artificial Intelligence on iPhones, thanks to Apple adding a bunch of new features and upgrading Siri to offer AI-chatbot capabilities. AI in the <a href="https://www.tomsguide.com/phones/iphones/i-just-installed-the-ios-27-beta-and-reframe-is-unlike-any-other-ai-feature-ive-come-across">iOS 27 beta</a> is still rather rough around the edges though, especially where Siri is concerned, but it's good to see Apple start to catch up with its rivals. Sadly, there is one feature that Apple seems to have forgotten about — and it's easily my favorite AI-adjacent feature on Android.</p><p>I'm talking about <a href="https://www.tomsguide.com/opinion/circle-to-search-is-my-favorite-galaxy-s24-feature-if-samsung-and-google-dont-screw-it-up">Circle to Search</a>, which landed on the first Android phones back in January of 2024. The feature isn't really an AI feature in and of itself, but it does offer a useful shortcut to <a href="https://www.tomsguide.com/us/google-lens-guide,review-5219.html">Google Lens</a>, which does use AI for a variety of things. We're talking translation, image and text recognition, reverse image search and so on.</p><p>iOS has offered something similar to Google Lens since its inception with Visual Intelligence, which has since been rebranded "<a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri Mode</a>" in iOS 27's camera. But so far, there's no Cupertino equivalent of Circle to Search, and that's something Apple needs to fix.</p><h2 id="circle-to-search-made-google-lens-way-more-convenient">Circle to Search made Google Lens way more convenient</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3CJ2hM5rfHy86RgmQ3qeT6" name="ezgif-1aabc27c3989ce" alt="Circle to search helping in the middle of a game on the Z Fold 7" src="https://cdn.mos.cms.futurecdn.net/3CJ2hM5rfHy86RgmQ3qeT6.gif" mos="" align="middle" fullscreen="" width="800" height="450" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Google )</span></figcaption></figure><p>Google Lens is quite a broad feature, starting life as a camera mode and eventually maneuvering its way into a bunch of different parts of the Android ecosystem. These days, Lens offers real time translation via the Google translate app, image search capabilities in Google Photos and, of course, the dedicated camera mode that is accessible through the standalone app.</p><p>Circle to Search doesn't give you access to the full Google Lens experience. The shortcut doesn't bring you to the camera mode, to scan and look at the world around you. Instead, it's been designed to bring the Google Lens experience to whatever is on your screen. That's useful in itself, but it's the actual mechanism that makes it so valuable to have.</p><p>Circle to Search is activated by pressing and holding at the very bottom of your Android phone screen — the spot you'd swipe up from to return to the home screen. It doesn't matter what you're doing on your phone, this brings up the Lens overlay on your phone screen. This brings up shortcuts to various tools, like song recognition and translation, as well as the headline feature: the ability to circle and search.</p><p>Draw a circle around anything on your screen, and Google's AI will go looking for it across the internet. Sometimes those results are totally useless, and other times they're so impressively accurate that it feels like magic. </p><p>The great thing about Circle to Search is that if you ever come across anything you'd like to know more about, you simply have to perform the gesture and fling a circle around it. There's no need to ask a chatbot for more information or take a screenshot to bring to Google Lens, everything is done on your screen within a few seconds. </p><p>I've never been a big fan of mobile AI, or using my voice to bark commands at my phone, but Circle to Search is so convenient that you can't afford to ignore it. Heck, I even forget that there's AI involved a lot of the time, and it makes very little sense that the iPhone doesn't have an equivalent feature of its own.</p><h2 id="siri-mode-could-learn-a-thing-or-two">Siri Mode could learn a thing or two</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3490px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qdS9MAp79UU3D85qwZjEV6" name="iOS 27 Siri AI" alt="iOS 27 Siri AI running on iPhone 17 Pro." src="https://cdn.mos.cms.futurecdn.net/qdS9MAp79UU3D85qwZjEV6.jpg" mos="" align="middle" fullscreen="" width="3490" height="1963" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>I will preface this part by pointing out that Siri AI is in pretty rough shape right now. Not only is iOS 27 still in beta, but Apple has confirmed that Siri AI will remain in beta even after the stable version of iOS 27 launches later this year. There are definitely some kinks to be worked out of the new AI, and anyone that has used Siri AI will have come across some of them.</p><p>Apple has been working on getting Siri AI ready for over two years now, and the priority has clearly been to make a serviceable version of Siri AI that's available for the public to use. With all the effort focussed on making that happen, and now ensuring all the bugs and wrinkles can be ironed out, it makes sense that other features might fall to the wayside. </p><p>But that doesn't mean that Apple should ignore the concept of bringing a Circle to Search-like feature to iOS in the near future — either as part of a future update to iOS 27 or with iOS 28 next year.</p><p>The new Siri Mode, like Visual Intelligence before it, does a lot of the same things as Google Lens — and the more recent Gemini Live. You point your camera at objects in the real world, and then use Siri to learn about the different things that are within view of your iPhone's camera. This can be done with voice commands, or by using the shutter button and circling specific objects to initiate a Google search.</p><p>Unlike Google Lens, which has always been a standalone thing, iOS 27 beta lets you access Siri Mode via the Action or Camera Control buttons, depending on how you've set them up. This is certainly very convenient, and sure as heck beats the way Google has set up how you access <a href="https://www.tomsguide.com/ai/google-gemini/gemini-live-what-features-are-available-now-and-what-is-coming-soon">Gemini Live</a> on my<a href="https://www.tomsguide.com/phones/google-pixel-phones/ive-been-using-the-pixel-10-pro-for-6-months-heres-what-i-love-and-hate"> Pixel 10 Pro</a>.</p><p>But there's no alternative to Circle to Search. If you want to know about what's on your phone screen, the best that's currently on offer is the ability to ask Siri AI. As I said before, the beta version of Siri AI is still in pretty rough shape, and that means the experience you get by asking about what's on your screen isn't always that great.</p><p>From my use, I've found answers can be vague or sometimes completely wrong. I even asked Siri what was happening on my screen, and it went off to explain exactly what sunscreen was, continuing that explanation every time I repeated my request. It was only later that I found out Siri AI doesn't quite understand the home screen and just starts repeating its last answer every time you try to ask. Or, at least, that's what happened on my <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review" target="_blank">iPhone 17 Pro Max</a> after installing iOS 27 beta 2.</p><p>The equivalent of Circle to Search just doesn't exist on iOS, and that means Android phones have that edge when it comes to discoverability and searching for things they come across. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O9RkLX"></div>                            </div>                            <script src="https://kwizly.com/embed/O9RkLX.js" async></script><h2 id="bottom-line-2">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dHpUy2hZbBQcMSMjVGQhNV" name="iPhone 17 Pro Max-3" alt="iPhone 17 Pro Max shown in hand" src="https://cdn.mos.cms.futurecdn.net/dHpUy2hZbBQcMSMjVGQhNV.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There may be iPhone users out there that don't feel like they need Circle to Search, but having never used an Android phone they don't fully understand what they're missing out on. I didn't really give the feature much thought when it first launched, but only because I didn't fully understand what it was actually capable of doing. </p><p>After more than two years of using it almost every single day, I can tell you, I couldn't live without Circle to Search on a future phone. There are alternative ways of getting the right kind of results, like taking screenshots and running them through Google Lens, but that is far from convenient. There's nothing quite like tapping your thumb against the screen and scrawling around something to get near-instant search results. </p><p>Honestly, it's surprising that Apple hasn't developed its own version our Circle to Search yet — either as a rebranded clone or something it built from scratch. With all the emphasis on adding AI, and all the copy/pasting Android and iOS do with each others' best features, it feels as though the iPhone experience is worse off without it. Here's hoping that things will change in either a future version of iOS 27 or the inevitable iOS 28 upgrade.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-launch-date-tipped-in-new-gurman-report-and-we-have-a-fresh-look-at-the-design">iPhone 18 Pro launch date just tipped in new Gurman report — and we have a fresh look at the design</a></li><li><a href="https://www.tomsguide.com/phones/android-phones/this-hidden-android-feature-can-turbocharge-autocorrect-and-stop-all-your-ducking-mistakes">This hidden Android feature can turbocharge autocorrect and stop all your 'ducking' mistakes</a></li><li><a href="https://www.tomsguide.com/phones/network-carriers/t-mobile-is-forcing-long-time-customers-to-move-to-new-plans-that-cost-more">T-Mobile is forcing long-time customers to move to new plans that cost more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple seeks RAM from blacklisted Chinese company as memory shortage impacts everything — but it may not be enough ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/apple-seeks-ram-from-blacklisted-chinese-company-as-memory-shortage-impacts-everything-but-it-may-not-be-enough</link>
                                                                            <description>
                            <![CDATA[ Apple is attempting to solve supply issues with a new memory supplier for its upcoming iPhones but it may not be enough. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3D76DyFCP3JiNUEtDZuN89</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bc3v2xma2LGpb9mYSNpejc-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Mon, 29 Jun 2026 20:21:40 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/bc3v2xma2LGpb9mYSNpejc-1280-80.png">
                                                            <media:credit><![CDATA[Macworld]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iphone 18 pro in dark cherry color from macworld]]></media:description>                                                            <media:text><![CDATA[iphone 18 pro in dark cherry color from macworld]]></media:text>
                                <media:title type="plain"><![CDATA[iphone 18 pro in dark cherry color from macworld]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bc3v2xma2LGpb9mYSNpejc-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Over the weekend, a big report from the <a href="https://www.ft.com/content/d72a25e2-7bde-4aa9-bd8d-0c4f3d6cb2cb?syn-25a6b1a6=1" target="_blank">Financial Times</a> dropped, claiming that Apple is attempting to alleviate memory constraints by pursuing a company that is currently on the Trump administration's blacklist. </p><p>According to FT, Apple is seeking to get CXMT exempted so it can source RAM from somewhere that isn't one of the big three; Micron, Samsung or SK Hynix. Skyrocketing memory prices forced <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple to raise prices</a> on most of its products last week.</p><p>Apple is technically not barred from buying CXMT chips, but the company has ties to the Chinese military and some Republicans are already making threats against Apple if it decides to move forward.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WValye"></div>                            </div>                            <script src="https://kwizly.com/embed/WValye.js" async></script><p>"Apple choosing to partner with a Chinese military company would be a grave mistake," Congressman John Moolenaar told the Financial Times. "Helping the [Chinese Communist Party] succeed in its plans to dominate critical supply chains will make our country’s tech industry and economy more dependent on China at a time when we must build secure tech supply chains with our allies."</p><p>Outgoing CEO Tim Cook has controversially kissed up to the Trump administration since he took office last year. That includes attending the inauguration, presenting Trump with gaudy statues and discs, and purposely <a href="https://www.bloomberg.com/news/articles/2026-01-28/apple-s-cook-calls-for-deescalation-after-latest-ice-shooting?accessToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb3VyY2UiOiJTdWJzY3JpYmVyR2lmdGVkQXJ0aWNsZSIsImlhdCI6MTc2OTU2OTIxNSwiZXhwIjoxNzcwMTc0MDE1LCJhcnRpY2xlSWQiOiJUOUpZV1BLSUpIOEowMCIsImJjb25uZWN0SWQiOiI1RkQyNjU1NTA2QTI0NjM2QjM1NzBEQkQ5MTY1RkI1NCJ9.AqYevYR3E81ym5MYxexBcWWTTk4mdSixpCtAcOfWLOc&leadSource=uverify%20wall" target="_blank">attending a screening of the Melania</a> movie. Now is the time to see if that attention will be reciprocated.</p><p>Tom's Guide has reached out to Apple about the memory shortage and CXMT specifically. However, Apple is generally tight-lipped about supply chain processes, but if the company responds, we will update this article.</p><h2 id="it-may-not-be-enough">It may not be enough</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="eqquT9N7AF3PToH9JSUGQV" name="Chip 16-9.jpg" alt="Computer chip" src="https://cdn.mos.cms.futurecdn.net/eqquT9N7AF3PToH9JSUGQV.jpg" mos="" align="middle" fullscreen="" width="3000" height="1688" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Morozov Anatoly | Shutterstock)</span></figcaption></figure><p>Supply chain analyst Ming Chi Kuo responded to the CXMT news today saying, "The pressure on Apple has shifted from soaring memory costs to a widening supply gap."</p><p>Kuo stated that memory capacity for consumer electronics is expected to decline 15 to 20% from devices to data centers in 2027 and that number could grow. He went on to say that even if Apple can source from CXMT it "would not materially lower costs or fill the supply gap." But noted that Apple has to secure an additional memory source.</p><p>One claim from replies indicates that Chinese iPhones make up about 16% of Apple's revenue, not nothing but enough to make it relevant. It's possible Apple could utilize CXMT memory in its Chinese iPhones that could perhaps alleviate supply chains for other markets like the US.</p><h2 id="memory-shortage-could-affect-a20-chip">Memory shortage could affect A20 chip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VyCd6uDjXwPFDDCD3YYN9F" name="a20-pro-chip-leaked-image-motherboard@2x-scaled-1" alt="Leaked image of the A20 chip architecture" src="https://cdn.mos.cms.futurecdn.net/VyCd6uDjXwPFDDCD3YYN9F.jpg" mos="" align="middle" fullscreen="" width="800" height="450" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Ice Universe)</span></figcaption></figure><p>A leaked image appeared on <a href="https://weibo.com/5673255066/R60MVk3s1" target="_blank">Weibo from Samsung leaker Ice Universe</a> today that purports to show case the A20 Pro chip that is expected to power the iPhone 18 Pro and iPhone 18 Ultra models. </p><p>The new chip is supposed to use TSMC's new wafer-level multi-chip module (WMCM) technology and the 2nm process. It's different from Apple's normal package-on-package (PoP) designs that put the DRAM on top the application processor. This new method moves the DRAM to the side which should reduce heat during heavy workloads. </p><p>It also appears to have a larger Neural Processing Unit than the A19 Pro, pointing toward improved AI performance. This chip should be 15% faster and 30% more efficient than the A19.</p><p>However, alongside CXMT, Kuo also claimed that Apple will produce 10 to 20% fewer A20 chips due to a lack of LPDDR RAM. Everything is impacted by the memory crisis.</p><p>At best, Kuo believes Apple will get favorable coverage because it tried to get more memory but was constrained by U.S. policies. "That may help ease frustration over price hikes and longer delivery times," Kuo said.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-ultra-may-arrive-running-on-some-of-the-same-chips-as-macbook-pro-heres-why">Apple MacBook Ultra may arrive running on some of the same chips as MacBook Pro — here's why</a></li><li><a href="https://www.tomsguide.com/phones/iphones/this-4-in-1-magsafe-charger-cleverly-tucks-away-a-hidden-secret-that-powers-non-apple-devices">This 4-in-1 MagSafe charger cleverly tucks away a hidden secret that powers non-Apple devices</a></li><li><a href="https://www.tomsguide.com/phones/iphones/analysts-warn-the-iphone-18-price-hike-could-be-worse-than-we-thought">Analysts warn the iPhone 18 price hike could be worse than we thought</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone 18 Pro launch date just tipped in new Gurman report — and we have a fresh look at the design ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/iphone-18-pro-launch-date-tipped-in-new-gurman-report-and-we-have-a-fresh-look-at-the-design</link>
                                                                            <description>
                            <![CDATA[ The iPhone 18 Pro and iPhone 18 Pro Max are tipped to launch Sept. 8 at the Apple event. Here's what to expect. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4FTWY4gdw5Lk8sg7dGeYX9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gqEeSaw5ynJVqNSsAjFGan-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 29 Jun 2026 12:45:44 +0000</pubDate>                                                                                                                                <updated>Mon, 29 Jun 2026 14:58:08 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gqEeSaw5ynJVqNSsAjFGan-1280-80.jpg">
                                                            <media:credit><![CDATA[SonnyDickson]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro dummy models colors ]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro dummy models colors ]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro dummy models colors ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gqEeSaw5ynJVqNSsAjFGan-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models">iPhone 18 Pro</a>, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro Max</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra/Fold</a> are all expected to be unveiled at the Apple Event in September, but we now have a pretty firm date from one of the leading Apple experts.</p><p>In case you haven't been following the latest rumors, the iPhone 18 Pro and Pro Max are both expected to launch this fall, but the regular <a href="https://www.tomsguide.com/phones/iphones/iphone-18-7-biggest-rumors-so-far">iPhone 18</a> is tipped to be unveiled in the spring of 2027 alongside the <a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-all-the-rumors-so-far">iPhone Air 2</a>.</p><p>The bad news is that the iPhone 18 Pro and Pro Max could cost significantly more. <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple recently raised the prices</a> on its MacBooks, iPads and other products, and one IDC analyst told us that the new Pro iPhones could be priced up to $200 higher. So when exactly are they coming?</p><h2 id="iphone-18-pro-and-iphone-ultra-launch-date">iPhone 18 Pro and iPhone Ultra launch date</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7iBdM6RkBx9vY5PWZDt6ef" name="iPhone 18 pro edit" alt="iPhone 18 Pro mockup" src="https://cdn.mos.cms.futurecdn.net/7iBdM6RkBx9vY5PWZDt6ef.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Aptenod / YouTube)</span></figcaption></figure><p>According to <a href="https://www.bloomberg.com/news/newsletters/2026-06-28/apple-s-sweeping-price-hikes-bring-the-ai-era-home-m6-m7-touch-macbook-pro" target="_blank">Bloomberg's Mark Gurman</a>, "the most likely data for the debut of the iPhone 18 Pro, iPhone 18 Pro Max and foldable iPhone is Sept. 8, with Sept. 9 as the runner-up."</p><p>This date makes sense, as Apple typically tends to hold its iPhone launch events in early September. But there's some slight disagreement over the exact date.</p><p>As reported by <a href="https://www.forbes.com/sites/davidphelan/2026/06/28/apple-iphone-18-pro-release-date-why-ios-27-anchors-september-schedule/">Forbes</a>, the iPhone 18 Pro and iPhone 18 Pro launch date will be Wednesday, Sept. 9. This would be the same date as the launch for the <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> Release Candidate software.</p><p>Forbes also argues that because Labor Day falls on Sept. 7, Apple will wait to hold its launch event on Sept. 9. This way, journalists wouldn't be forced to travel on Labor Day itself.</p><h2 id="new-iphone-18-pro-hands-on-with-case-models">New iPhone 18 Pro hands-on with case models</h2><div class="instagram-embed"><blockquote class="instagram-media"  data-instgrm-version="6" style="width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><p><a href="https://www.instagram.com/p/DaItfJxoZGc/" target="_blank">A post shared by Daniel Rotar (@zoneoftech)</a></p><p>A photo posted by  on </p></blockquote></div><p>To help tide you over until the iPhone 18 Pro launch, there's a new hands-on video with case models that's definitely worth a look from <a href="https://www.instagram.com/p/DaItfJxoZGc/" target="_blank">@zoneoftech</a> on Instagram.</p><p>The video covers the 5 biggest changes to the iPhone 18 Pro lineup, starting with the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-leaked-colors-include-a-stunning-new-dark-cherry-option">iPhone 18 Pro colors</a>. </p><p>Apple is keeping silver but is swapping the darker blue for a much lighter blue, and I honestly think it looks better. Unfortunately, it looks like the orange option is leaving, getting replaced by a new dark cherry red. Then there's dark gray, which is basically black.</p><p>In addition, the video points out that the body of the iPhone 18 Pro is 9mm thick, up from 8.8mm. This is apparently to help accommodate <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-tipped-for-minor-battery-gains-this-year-but-theres-a-hidden-upgrade-coming">larger batteries</a>. </p><p>Even though the case models don't turn on, the video repeats the rumor we've heard before that the <a href="https://www.tomsguide.com/phones/iphones/the-iphone-18-pro-series-dynamic-island-could-be-smaller-than-before-and-i-think-thats-a-better-move-than-the-rumored-under-display-cameras">Dynamic Island on the iPhone 18 Pro will be smaller</a> than before. This is due to Face ID tech being placed under the display.</p><p>The camera plateau (aka bump) also looks big next to the iPhone 17 Pro. Apple is reportedly giving us a <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-be-the-first-iphone-to-get-a-variable-aperture-why-that-matters">variable aperture camera</a>, so extra room is needed. </p><p>Last but not least is the price. @zoneoftech predicts that the iPhone 18 Pro will start at $1,300 and the iPhone 14 Pro Max at $1,400. That would be $200 more for both models.</p><p>Would you spend as much as $1,400 on a new iPhone? Let us know in the comments.</p><h2 id="iphone-ultra-what-to-expect">iPhone Ultra: What to expect</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aUJZxCfMMXC3m2nKLVB2dV" name="iPhone Fold final design 1" alt="iPhone Fold design" src="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Majin Bu on X)</span></figcaption></figure><p>The iPhone Ultra/iPhone Fold is likely to be the most high-profile phone in Apple's fall lineup, as it's the company first foldable phone.</p><p>The device is tipped to feature a wide, passport-shaped design with a 5.5-inch cover display and a 7.8-inch main panel.</p><p>The iPhone Ultra should be powered by Apple's new <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-a20-pro-chip-apples-first-2nm-processor-to-power-new-foldable-phone">A20 chip</a> and C2 cellular modem, as well as 12GB of RAM. It's expected to sport <a href="https://www.tomsguide.com/phones/iphones/forget-the-iphone-17-foldable-iphone-tipped-to-debut-next-year-with-four-cameras-touch-id-and-apple-cellular-modem">dual real 48MP cameras</a>. </p><p>Just don't expect Face ID on the iPhone Ultra, as the device should feature a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-could-feature-something-iphone-users-have-been-missing-for-years">Touch ID button</a> on the right side instead.</p><p>Be prepared for some sticker shock, though. Some reports peg the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-just-tipped-to-cost-an-obscene-usd2-399-but-it-could-have-this-apple-exclusive">iPhone Ultra price</a> in the $2,400 to $2,500 range. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/analysts-warn-the-iphone-18-price-hike-could-be-worse-than-we-thought"><strong>iPhone 18 Pro price hike could be worse than we thought</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-tipped-for-minor-battery-gains-this-year-but-theres-a-hidden-upgrade-coming"><strong>iPhone 18 Pro just tipped for minor battery gains — but there's a hidden upgrade coming</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong"><strong>I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This 4-in-1 MagSafe charger cleverly tucks away a hidden secret that powers non-Apple devices ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/this-4-in-1-magsafe-charger-cleverly-tucks-away-a-hidden-secret-that-powers-non-apple-devices</link>
                                                                            <description>
                            <![CDATA[ I've been testing the Mophie StealthCharge 4-in-1 Wireless Charge Stand and it's cleverly designed to better charge my iPhone and my other non-Apple gadgets. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ykG7GBCFZz6fKN6puYdjxX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/BdRRXULhfp38jXvN6HLdFe-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 29 Jun 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/BdRRXULhfp38jXvN6HLdFe-1280-80.jpg">
                                                            <media:credit><![CDATA[John Velasco / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Mophie StealthCharge 4-in-1 Wireless Charge Stand.]]></media:description>                                                            <media:text><![CDATA[Mophie StealthCharge 4-in-1 Wireless Charge Stand.]]></media:text>
                                <media:title type="plain"><![CDATA[Mophie StealthCharge 4-in-1 Wireless Charge Stand.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/BdRRXULhfp38jXvN6HLdFe-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you look around my desk at work, it can sometimes get pretty messy due to the constant rotation of <a href="https://www.tomsguide.com/best-picks/best-magsafe-chargers-for-your-iphone-year">MagSafe chargers</a> I frequently test. While many come and go, there’s been one that has remained a mainstay: the Mophie 3-in-1 Extendable MagSafe Stand.</p><p>I’ve kept it around for good reason, but recently I’ve been putting another model through its paces — one that I’ve ended up keeping by my bedside at home. The Mophie StealthCharge 4-in-1 Wireless Charge Stand is the company's latest addition to its lineup, and it delivers exactly the kind of premium experience you'd expect for the price. In addition to charging all of my favorite Apple devices, it cleverly tucks away a hidden secret that expands its utility.</p><p>After testing it out for the past couple of weeks, I think it's easily one of the best MagSafe chargers around. Here’s why.</p><div class="product"><a data-dimension112="f5d3ce56-a297-47b6-a242-71273088f994" data-action="Deal Block" data-label="Charge your favorite Apple devices wirelessly with this 4-in-1 MagSafe charger from Mophie. It uses StealthCharge technology to ensure your iPhone gets the fastest charge possible, while doing it quietly and keeping it cool during the process. On top of wireless charging pads for the Apple Watch and AirPods, it features a retractable USB-C cable to deliver charges to practically any device." data-dimension48="Charge your favorite Apple devices wirelessly with this 4-in-1 MagSafe charger from Mophie. It uses StealthCharge technology to ensure your iPhone gets the fastest charge possible, while doing it quietly and keeping it cool during the process. On top of wireless charging pads for the Apple Watch and AirPods, it features a retractable USB-C cable to deliver charges to practically any device." data-dimension25="$179.95" href="https://www.mophie.com/collections/wireless-chargers/products/4-in-1-wireless-charge-stand-black" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="joi6qsyZ9oQpkSaPkPvJe4" name="Mophie StealthCharge 4-in-1 Wireless Charge Stand deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/joi6qsyZ9oQpkSaPkPvJe4.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Charge your favorite Apple devices wirelessly with this 4-in-1 MagSafe charger from Mophie. It uses StealthCharge technology to ensure your iPhone gets the fastest charge possible, while doing it quietly and keeping it cool during the process. On top of wireless charging pads for the Apple Watch and AirPods, it features a retractable USB-C cable to deliver charges to practically any device.<a class="view-deal button" href="https://www.mophie.com/collections/wireless-chargers/products/4-in-1-wireless-charge-stand-black" target="_blank" rel="nofollow" data-dimension112="f5d3ce56-a297-47b6-a242-71273088f994" data-action="Deal Block" data-label="Charge your favorite Apple devices wirelessly with this 4-in-1 MagSafe charger from Mophie. It uses StealthCharge technology to ensure your iPhone gets the fastest charge possible, while doing it quietly and keeping it cool during the process. On top of wireless charging pads for the Apple Watch and AirPods, it features a retractable USB-C cable to deliver charges to practically any device." data-dimension48="Charge your favorite Apple devices wirelessly with this 4-in-1 MagSafe charger from Mophie. It uses StealthCharge technology to ensure your iPhone gets the fastest charge possible, while doing it quietly and keeping it cool during the process. On top of wireless charging pads for the Apple Watch and AirPods, it features a retractable USB-C cable to deliver charges to practically any device." data-dimension25="$179.95">View Deal</a></p></div><h2 id="retractable-cable-adds-to-its-utility">Retractable cable adds to its utility</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="wRKxrCFw4eZZWdb4N5e3Ge" name="Mophie StealthCharge 4-in-1 Wireless Charge Stand" alt="Mophie StealthCharge 4-in-1 Wireless Charge Stand." src="https://cdn.mos.cms.futurecdn.net/wRKxrCFw4eZZWdb4N5e3Ge.jpg" mos="" align="middle" fullscreen="" width="2000" height="1124" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Pretty much all the 3-in-1 MagSafe chargers I test do the same thing: provide wireless charging pads for an iPhone, Apple Watch, and AirPods. What separates this Mophie charger from the rest is how it cleverly tucks away a retractable USB-C cord, letting me conveniently power up other devices.</p><p>I personally love this addition. Since I frequently test many of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a> on the market, I often run into devices that lack a magnetic connection for wireless charging. That’s why this retractable cord is so clutch because I can instantly plug in just about anything, then give it a quick tug to retract the cable back into its housing.</p><p>Best of all, the USB-C connection delivers a 60W charging speed — which is more than enough to power a MacBook Air.</p><h2 id="barely-any-heat-buildup">Barely any heat buildup</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="RCiKKqtoj22a9yu8bSxsGe" name="Mophie StealthCharge 4-in-1 Wireless Charge Stand" alt="Mophie StealthCharge 4-in-1 Wireless Charge Stand." src="https://cdn.mos.cms.futurecdn.net/RCiKKqtoj22a9yu8bSxsGe.jpg" mos="" align="middle" fullscreen="" width="2000" height="1124" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Another impressive characteristic is how quiet this charger remains while actively juicing up my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a>. Other MagSafe chargers I’ve tested can sound like jet engines once their internal cooling fans kick in. This one avoids that entirely thanks to an intelligent design that moves the primary charging components down into the base, as opposed to stacking them directly behind the phone.</p><p>As a result, Mophie's design doesn’t just make it whisper-quiet — it also dissipates heat away from the device to maintain peak charging performance. In the long run, keeping temperatures low ensures better battery health and extends the lifespan of my iPhone. Honestly, it’s a massive relief to know the charger can tap into those top-tier 25W MagSafe speeds without making a peep while I’m trying to fall asleep at night.</p><h2 id="quality-construction">Quality construction</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Um8i4xfhZCkSsk6oPW7EFe.jpg" alt="Mophie StealthCharge 4-in-1 Wireless Charge Stand." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TDD7aoCuVhGx8ixgBMAUGe.jpg" alt="Mophie StealthCharge 4-in-1 Wireless Charge Stand." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>Yes, the Mophie StealthCharge 4-in-1 Wireless Charge Stand commands a premium—but it proves that quality is worth paying for. The justification for that high price tag becomes apparent the moment you pick it up. It feels dense and sturdy, a deliberate design choice that keeps the stand firmly grounded on your desk while exuding a high-end aesthetic.</p><p>You won’t find cheap plastic or flimsy joints here. Everything about its construction feels built to last, which is an attribute people often overlook when they are drawn to bargain-bin alternatives on Amazon. There’s a reason Apple showcases and sells Mophie products in its retail stores: the brand consistently prioritizes quality over quantity, and that craftsmanship is exactly why this charger is worth every penny.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Odk8ZW"></div>                            </div>                            <script src="https://kwizly.com/embed/Odk8ZW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Motorola Razr Ultra 2026 review: Better does come at a premium price</a></li><li><a href="https://www.tomsguide.com/phones/simo-solis-lite-hotspot-review">I tested this puck shaped mobile hotspot — and it’s the simplest way to get online</a></li><li><a href="https://www.tomsguide.com/phones/best-early-prime-day-2026-phone-accessories-deals-magsafe-wallets-power-banks-chargers-and-more">I tested 100+ phone accessories in the last year and these are my favorite early Prime Day deals — MagSafe wallets, power banks, chargers, and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tried Siri AI in the iOS 27 CarPlay beta — and this assistant is way more helpful than before ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/i-just-tried-siri-ai-in-the-ios-27-carplay-beta-and-this-assistant-is-way-more-helpful-than-before</link>
                                                                            <description>
                            <![CDATA[ With the iOS 27 developer beta, I've been trying out Siri AI in CarPlay to see what new tricks Apple's AI assistant has to offer while I'm driving. Here's what I found. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YQpRjhEckJFkTFQ4683Zii</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Spea4XZ6f3zkgGZWP3hTp5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 27 Jun 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Vehicle Tech]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Spea4XZ6f3zkgGZWP3hTp5-1280-80.jpg">
                                                            <media:credit><![CDATA[John Velasco / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Siri AI in iOS 27 CarPlay.]]></media:description>                                                            <media:text><![CDATA[Siri AI in iOS 27 CarPlay.]]></media:text>
                                <media:title type="plain"><![CDATA[Siri AI in iOS 27 CarPlay.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Spea4XZ6f3zkgGZWP3hTp5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I have a confession to make. As much as I use CarPlay whenever I’m testing the <a href="https://www.tomsguide.com/best-picks/best-electric-cars-today">best electric cars</a>, I rarely try to interact with Siri. Instead, I’ve found <a href="https://www.tomsguide.com/ai/i-wore-meta-ray-ban-smart-glasses-while-shopping-at-target-7-things-that-were-surprisingly-useful">Meta AI</a> to be way more helpful because it’s something I can access right from my <a href="https://www.tomsguide.com/reviews/ray-ban-meta-smart-glasses">Ray-Ban Meta</a> sunglasses. But the real reason I use it over Siri in CarPlay is simply because of how smart it is.</p><p>Now that I’m running the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developer beta</a> on my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a>, I have access to <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> on all of my drives. Since I’ve been so accustomed to Meta AI, I’m way more critical and have higher expectations for how Apple’s new AI chatbot works. After a week of using it, here’s what I found.</p><h2 id="conversations-are-way-more-fluid">Conversations are way more fluid</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CFZYK8xykipzqTiiomPzq5" name="Siri AI in iOS 27 beta CarPlay" alt="Siri AI in iOS 27 CarPlay." src="https://cdn.mos.cms.futurecdn.net/CFZYK8xykipzqTiiomPzq5.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>What immediately stands out the most is how much more conversational Siri AI is compared to previous versions. Apple has improved Siri's conversational skills over the years, but this update is a huge leap because the assistant sounds more human than ever before — complete with natural inflections and tonal shifts.</p><div><blockquote><p>I actually love interacting with this version of Siri. It’s fun, way more engaging, and has an authentic tone that completely sheds the robotic tendencies of past versions.</p></blockquote></div><p>I asked about upcoming Fourth of July events happening around where I live, and I was really impressed that it recommended three options. However, when I followed up to ask which one it recommended most, Siri AI explicitly said it couldn't pick just one and simply rehashed the options. Additionally, I noticed that I can’t interrupt Siri AI while it's talking like I can on my phone — which I suspect is due to the louder ambient noise within the cabin space.</p><p>Despite this, I actually love interacting with this version of Siri. It’s fun, way more engaging, and has an authentic tone that completely sheds the robotic tendencies of past versions.</p><h2 id="still-needs-better-deep-research">Still needs better deep research</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oqgsbCjiXPr7hTqUyu7Xj5" name="Siri AI in iOS 27 beta CarPlay" alt="Siri AI in iOS 27 CarPlay." src="https://cdn.mos.cms.futurecdn.net/oqgsbCjiXPr7hTqUyu7Xj5.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>On one of my commutes to work, I noticed that Google Maps was forcing me to take the Garden State Parkway instead of my usual route along the New Jersey Turnpike. After double-checking the traffic conditions, I saw that it was completely red along the Turnpike, so I asked Siri AI to find out why.</p><p>I simply asked it to check why there was so much traffic on my route, but it couldn't check live traffic conditions — so that was a bust. After that, I explicitly asked Siri to look up any social media posts or news stories about traffic along the Turnpike. It rattled off a list of things, including ongoing construction near specific exits and various road closures. I doubted those were the actual reasons for the slowdown, and I ended up looking it up myself once I got to work.</p><p>When I finally got to the office, I found out there had been a four-truck crash that morning with one fatality, which explained why the highway was completely red for a long stretch and why Google Maps had rerouted me to the Parkway instead.</p><p>I’m hoping that Siri AI gets better at deep research, especially when it comes to pulling information from third-party apps — but right now, it’s just not there yet.</p><h2 id="siri-ai-remembers-tasks">Siri AI remembers tasks</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1803px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="3CVLkKy5AENT89ipW6XMZc" name="Siri AI in CarPlay iOS 27" alt="Siri AI in CarPlay iOS 27 screenshot." src="https://cdn.mos.cms.futurecdn.net/3CVLkKy5AENT89ipW6XMZc.jpg" mos="" align="middle" fullscreen="" width="1803" height="1014" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Finally, I wanted to see how well Siri AI could jot down notes for me while driving. I had just wrapped up testing the 2026 Mazda CX-5, and rather than waiting until later in the day, I asked Siri AI to log some pros and cons about the SUV.</p><div><blockquote><p>The best part about Siri AI in CarPlay is that it remembers the context of tasks it just performed.</p></blockquote></div><p>The best part about Siri AI in CarPlay is that it remembers the context of tasks it just performed. For example, I initially rattled off a few points, noting how the Mazda now offers a much more modern infotainment experience, but then remembered another detail a couple of minutes later. I asked Siri AI to go back into that note to add the additional comments, and it was smart enough to know exactly which note to update.</p><p>When I got to work later on, I opened the saved note and was surprised to see it had actually attempted a proper layout — complete with a title and bulleted list. While it wasn’t perfect, it gave me a solid starting point. Moving forward, it would be great if Siri could log things directly into a Google Docs file, but this test proved to me that I can finally rely on the assistant to remember and recall information on the fly.</p><h2 id="outlook">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Jjbgx2FaXvJsPzU7gv7qs5" name="Siri AI in iOS 27 beta CarPlay" alt="Siri AI in iOS 27 CarPlay." src="https://cdn.mos.cms.futurecdn.net/Jjbgx2FaXvJsPzU7gv7qs5.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>I have another confession to make: The only reason I gave Siri AI a shot in the first place was that I accidentally left my Ray-Ban Meta sunglasses at home on one of my drives.</p><p>Now, I can confidently say that Siri AI is way more helpful, and I can actually rely on it while driving. As another example of its capabilities, I asked it to look up vehicles similar to the Infiniti QX60 I was driving, specifically comparing it to the <a href="https://www.tomsguide.com/vehicle-tech/2026-genesis-gv80-review">Genesis GV80</a> I previously tested. I loved how it broke down the luxury, three-row SUVs side by side — including granular details like the price differences between trims.</p><p>Moving forward, I’m really looking forward to the potential of broader, cross-app integration with third-party software, because that'll truly be a game-changer behind the wheel. A perfect example would be placing a <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-asked-gemini-on-the-galaxy-s26-to-order-dunkin-donuts-for-me-and-24-minutes-later-it-got-delivered-to-my-door">Dunkin’ Donuts order via voice</a>. While I could technically use the dedicated Dunkin’ CarPlay app, doing so is distracting while driving, and it doesn't offer access to the full menu anyway. I would love to just ask Siri AI to handle the order for me using simple voice instructions.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2aRGe"></div>                            </div>                            <script src="https://kwizly.com/embed/W2aRGe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Motorola Razr Ultra 2026 review: Better does come at a premium price</a></li><li><a href="https://www.tomsguide.com/phones/simo-solis-lite-hotspot-review">I tested this puck shaped mobile hotspot — and it’s the simplest way to get online</a></li><li><a href="https://www.tomsguide.com/phones/best-early-prime-day-2026-phone-accessories-deals-magsafe-wallets-power-banks-chargers-and-more">I tested 100+ phone accessories in the last year and these are my favorite early Prime Day deals — MagSafe wallets, power banks, chargers, and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Analysts warn the iPhone 18 price hike could be worse than we thought ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/analysts-warn-the-iphone-18-price-hike-could-be-worse-than-we-thought</link>
                                                                            <description>
                            <![CDATA[ Apple hiked up a bunch of prices this week, but iPhones were spared. That isn't likely to last long, though. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">k3vBLurmJ4BgR5NtUfkLbP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7iBdM6RkBx9vY5PWZDt6ef-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 27 Jun 2026 05:03:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7iBdM6RkBx9vY5PWZDt6ef-1280-80.jpg">
                                                            <media:credit><![CDATA[Aptenod / YouTube]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro mockup]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro mockup]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro mockup]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7iBdM6RkBx9vY5PWZDt6ef-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The list of tech companies that increased their prices just got a little longer, now that <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple has instigated hefty price hikes</a> on most of its products. <a href="https://www.tomsguide.com/phones/iphones/apple-ceo-tim-cook-confirmed-price-hikes-are-unavoidable-so-get-ready-to-pay-more">Apple CEO Tim Cook warned us this was coming</a>, and now the company has confirmed that the rising cost of memory and storage means it's unable to shoulder the increased cost of components.</p><p>“The rapid expansion of AI data centers has created an extraordinary surge in demand for memory and storage," Apple said in a statement. "We have never seen a component price increase this much, this quickly.” Apple also added that it has “reached a point where we need to begin raising prices on a number of products."</p><p>Emphasis on the word "begin," because Apple already increased the price of almost its entire product lineup. That includes MacBooks, desktop Macs, iPads, Vision Pro and even the less-memory-hungry devices like Apple TV 4K and Homepod.</p><p>The only products that haven't suffered a price hike are iPhones, AirPods and the Apple Watch — and I honestly don't believe that those prices will stay at their current levels for very long.</p><h2 id="iphones-were-spared-but-don-t-expect-it-to-last-long">iPhones were spared, but don't expect it to last long</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="txq3KdVwhYyxHjEbMKvcy7" name="iPhone 18 Pro render 1" alt="iPhone 18 Pro render showing punch hole camera" src="https://cdn.mos.cms.futurecdn.net/txq3KdVwhYyxHjEbMKvcy7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Front Page Tech)</span></figcaption></figure><p>The question as to why Apple has insulated the iPhone from the first wave of price hikes is down to the device's popularity. As analyst Francisco Jeronimo, Vice President of Client Devices at IDC, noted in a statement sent to Tom's Guide, the iPhone is Apple's personal cash cow. Phones make up around 50% of Apple's business, so it makes sense that Apple will do whatever it can to protect iPhone sales volume.</p><p>It should be obvious to everyone that increasing the price of a product is not the route you go down if you want to make your devices more appealing to consumers. </p><p>However, those prices are unlikely to stay static for long. As Jeronimo notes, Apple is likely protecting the iPhone "while it works out how hard it can push prices on the September lineup." Or, in other words, Apple is trying to figure out how much of a price hike it will be able to get away with for the next generation.</p><p>Apple has shown that it isn't safe from <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMageddon</a>, and is unable to absorb the increased cost of components to keep prices consistent. The iPhone also doesn't have any special protection that makes it immune to the increased cost of production, and it's just as susceptible as Apple's other products. </p><p>It's possible that Apple could use iPads, Macs and all the other affected products to subsidize the cost of more popular devices like iPhone and Apple Watch. Then again, considering how popular and important iPhones are to Apple, it's unlikely that these price hikes could bring in enough additional revenue to offset the increased cost of so many devices.</p><p>Nabila Popal, another IDC analyst, <a href="https://www.tomsguide.com/phones/iphones/usd1-299-iphone-18-pro-max-analyst-now-predicts-usd200-price-hike-for-apples-next-flagship-phone">told Tom's Guide</a> the firm has been expecting price increases on the different<a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far"> iPhone 18</a> models: $50 for the iPhone 18 and $100 for the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">Pro Max</a>. But after seeing the iPad and MacBook price hikes, they are more inclined to believe the price could rise as much as $200.</p><p>"My personal instinct says the hike to iPhones may be even higher than what we assumed – perhaps even $200 to the Pro Max models," Popal said. "I think the days of $50 price increases are over."</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYx0ZO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYx0ZO.js" async></script><h2 id="will-it-matter-that-much">Will it matter that much?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TBYraHW2jopiVsMRak8QgV" name="iPhone 18 Pro colors Weibo" alt="iPhone 18 Pro colors: purple, brown, burgundy" src="https://cdn.mos.cms.futurecdn.net/TBYraHW2jopiVsMRak8QgV.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While an iPhone 18 price hike feels inevitable, despite reports of <a href="https://www.tomsguide.com/phones/iphones/iphone-18-tipped-for-cost-cutting-downgrades-heres-what-we-know">aggressive cost cutting to keep prices low</a>, the real question is whether this is going to matter all that much.</p><p>As Francisco Jeronimo notes, iPhone users tend to be a pretty loyal bunch. An Android phone user can jump from one brand to another without much issue, because all those devices run on the same core software. iPhone users generally stick with what they know. Switching ecosystems is awkward, and means abandoning your entire service and app history to start afresh elsewhere. </p><div><blockquote><p>Switching ecosystems is awkward, and that means abandoning your entire service and app history to start afresh elsewhere.</p></blockquote></div><p>You also have to remember that iPhones come with an aura of prestige you don't get with a lot of Android phones. Expensive things feel premium and luxurious, and Jeronimo notes that this makes Apple's customer base less price-sensitive than Android-toting rivals. Especially since the majority of users buy iPhones on an installment plan, and offset the overall cost by trading in their old device.</p><p>Of course, increased prices mean that some customers are going to start upgrading less frequently — which will impact long-term iPhone sales. Then again, considering Apple's been proudly bragging that <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17</a> has been the <a href="https://www.bbc.co.uk/news/articles/ce8pdk3l4d2o">most popular iPhone</a> it's sold, sales would have to drop by a considerable amount before it becomes an emergency.</p><p>Not to mention the fact that Apple is releasing its first foldable phone later this year, with the starting price <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-specs-and-price-leak-and-the-sales-projections-are-absolutely-bonkers-versus-samsung">expected to be somewhere in the region of $2,400</a>. Considering this is the first iPhone of its kind, it gives Apple some extra freedom to dictate how much it will cost. There isn't a lot users can compare the high price tag to, after all, especially if it manages to successfully market the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a> as a more premium device than other foldables on the market.</p><h2 id="bottom-line-3">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2272px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KwwUMqX3DXXqj5wDYpEhRo" name="Screenshot 2026-01-20 at 12.43.51" alt="iPhone 18 Pro leak-based render, showing the rear cameras" src="https://cdn.mos.cms.futurecdn.net/KwwUMqX3DXXqj5wDYpEhRo.jpg" mos="" align="middle" fullscreen="" width="2272" height="1278" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Front Page Tech)</span></figcaption></figure><p>An iPhone price hike was always inevitable, ever since the AI boom kicked off RAMageddon and made the cost of RAM and storage blast off to unprecedented levels. While the company hasn't confirmed any concrete plans to raise prices, and likely won't until the very last second, this week's slew of increases on Apple products means the writing is on the wall.</p><p>The real question is how that will affect the sales of iPhone 18 Pro later this year, and iPhone 18 after it (apparently) <a href="https://www.tomsguide.com/phones/iphone-18-release-just-tipped-for-major-shakeup-heres-when-all-the-new-models-could-launch">arrives in early 2027</a>. While Apple does command a lot of brand loyalty, and a few hundred dollars may not mean much for a multi-year installment plan, we're going to have to wait and see how things pan out — and how much prices will actually increase by.</p><p>But, if Apple thinks it can get away with raising the price of the popular <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">$599 MacBook Neo</a> by $100 so soon after release, it clearly has confidence that some price hikes aren't going to make much of a dent in its bottom line.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/9-tips-to-keep-your-phone-cool-during-a-heatwave-and-prevent-damage">9 tips to keep your phone cool during a heatwave — and prevent damage</a></li><li><a href="https://www.tomsguide.com/phones/simo-solis-lite-hotspot-review">I tested this puck shaped mobile hotspot — and it’s the simplest way to get online</a></li><li><a href="https://www.tomsguide.com/phones/i-tried-this-new-magsafe-wallet-that-looks-better-the-longer-i-use-it-heres-what-it-is">I tried this new MagSafe wallet that looks better the longer I use it — and it's got Find My support built in</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Score an iPhone 17 Pro for free — best last-minute Prime Day iPhone deals ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/score-an-iphone-17-pro-for-free-best-last-minute-prime-day-iphone-deals</link>
                                                                            <description>
                            <![CDATA[ Get yourself a sweet iPhone with these epic Prime Day deals still going on,  which many of them don't require you to trade in an older device to get the savings. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">wG3CkJTcWw3KVVfunqPbYA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bHxM4bf2bToTBn3WN53gEe-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 15:11:01 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Sales Events]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bHxM4bf2bToTBn3WN53gEe-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 17 Pro held in the hand with Prime Day badge.]]></media:description>                                                            <media:text><![CDATA[iPhone 17 Pro held in the hand with Prime Day badge.]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 17 Pro held in the hand with Prime Day badge.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bHxM4bf2bToTBn3WN53gEe-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Today is officially the last day of <a href="https://www.tomsguide.com/live/news/last-minute-prime-day-deals-picked-by-editors-2026">Prime Day</a>, and if you’ve waited until now to look for an iPhone deal, it may be harder to uncover one. Well, I’ve been doing the digging for you — and there are still epic savings out there.</p><p>Not only can you score a <a href="https://www.t-mobile.com/cell-phone/apple-iphone-17-pro" target="_blank" rel="nofollow">free iPhone 17 Pro</a> from a big wireless carrier, but I’m also going to share deals I’ve found that don’t require trade-ins or lengthy contract agreements. There are also some iPhone deals from other retailers, like Best Buy and Walmart, where you can get instant discounts on popular models with no strings attached.</p><h2 class="article-body__section" id="section-best-iphone-prime-day-deals-quick-links"><span>Best iPhone Prime Day deals: Quick links</span></h2><ul><li><strong>iPhone 17 Pro: </strong><a href="https://www.t-mobile.com/cell-phone/apple-iphone-17-pro" target="_blank" rel="nofollow"><strong>free w/unlimited plan @ T-Mobile</strong></a></li><li><strong>iPhone 16e: </strong><a href="https://www.cricketwireless.com/shop/smartphones/apple-iphone-16e-128gb-black" target="_blank" rel="nofollow"><strong>free w/3-month unlimited plan @ Cricket Wireless</strong></a></li><li><strong>iPhone 14: </strong><a href="https://www.amazon.com/Apple-iPhone-14-128GB-Blue/dp/B0BN733951/" target="_blank" rel="nofollow"><strong>was $304 now $299 @ Amazon</strong></a></li><li><strong>iPhone 16: </strong><a href="https://www.boostmobile.com/shop/iphone-16.html" target="_blank" rel="nofollow"><strong>was $729 now $499 @ Boost Mobile</strong></a></li><li><strong>iPhone Air: </strong><a href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-space-black/JJGCQLRKC2" target="_blank" rel="nofollow"><strong>was $999 now $739 @ Best Buy</strong></a></li><li><strong>iPhone 17: was </strong><a href="https://www.totalwireless.com/buy/phones/apple-iphone-17-prepaid" target="_blank" rel="nofollow"><strong>$829 now $699 @ Total Wireless</strong></a></li><li><strong>iPhone 17 Pro Max: </strong><a href="https://www.mintmobile.com/devices/apple-iphone-17-pro-max/11105343/" target="_blank" rel="nofollow"><strong>$1,579 with 1-year unlimited plan included @ Mint Mobile</strong></a></li></ul><h2 class="article-body__section" id="section-the-best-iphone-prime-day-deals-right-now"><span>The best iPhone Prime Day deals right now</span></h2><div class="product"><a data-dimension112="ab7a3329-31a2-4185-9421-8bfaa50379f9" data-action="Deal Block" data-label="iPhone 17 Pro: free w/unlimited plan @ T-Mobile" data-dimension48="iPhone 17 Pro: free w/unlimited plan @ T-Mobile" href="https://www.t-mobile.com/cell-phone/apple-iphone-17-pro" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="eXw4hVAiaxFXNpPHQtPkim" name="iPhone 17 Pro deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eXw4hVAiaxFXNpPHQtPkim.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>iPhone 17 Pro: </strong><a href="https://www.t-mobile.com/cell-phone/apple-iphone-17-pro" target="_blank" rel="nofollow" data-dimension112="ab7a3329-31a2-4185-9421-8bfaa50379f9" data-action="Deal Block" data-label="iPhone 17 Pro: free w/unlimited plan @ T-Mobile" data-dimension48="iPhone 17 Pro: free w/unlimited plan @ T-Mobile" data-dimension25=""><strong>free w/unlimited plan @ T-Mobile</strong></a><br>What I like most about T-Mobile's offer is that you're getting a free iPhone 17 Pro without having to trade in an older device for a discount. Instead, you'll need to sign up for either its Experience Beyond or Experience More plan to get the savings that come in the form of monthly bill credits totaling $1,100 over 24 months.<a class="view-deal button" href="https://www.t-mobile.com/cell-phone/apple-iphone-17-pro" target="_blank" rel="nofollow" data-dimension112="ab7a3329-31a2-4185-9421-8bfaa50379f9" data-action="Deal Block" data-label="iPhone 17 Pro: free w/unlimited plan @ T-Mobile" data-dimension48="iPhone 17 Pro: free w/unlimited plan @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a64ce6ac-6397-412c-9c17-66f23bea38b2" data-action="Deal Block" data-label="Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. When you do that, your total at checkout comes out to be $190 plus tax. For a phone that will be getting iOS 27, it's one of the cheapest models to have access to it." data-dimension48="Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. When you do that, your total at checkout comes out to be $190 plus tax. For a phone that will be getting iOS 27, it's one of the cheapest models to have access to it." data-dimension25="$0.5" href="https://www.cricketwireless.com/shop/smartphones/apple-iphone-16e-128gb-black" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6XDDGA8kCSFrs9m2vXphbQ" name="iphone16e-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6XDDGA8kCSFrs9m2vXphbQ.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. When you do that, your total at checkout comes out to be $190 plus tax. For a phone that will be getting iOS 27, it's one of the cheapest models to have access to it.<a class="view-deal button" href="https://www.cricketwireless.com/shop/smartphones/apple-iphone-16e-128gb-black" target="_blank" rel="nofollow" data-dimension112="a64ce6ac-6397-412c-9c17-66f23bea38b2" data-action="Deal Block" data-label="Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. When you do that, your total at checkout comes out to be $190 plus tax. For a phone that will be getting iOS 27, it's one of the cheapest models to have access to it." data-dimension48="Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. When you do that, your total at checkout comes out to be $190 plus tax. For a phone that will be getting iOS 27, it's one of the cheapest models to have access to it." data-dimension25="$0.5">View Deal</a></p></div><div class="product"><a data-dimension112="170b83ad-a50e-4061-b86b-b22b2979a23d" data-action="Deal Block" data-label="Best Buy is giving the iPhone Air a $260 off instant discount, but the stipulation is that you have it activated on AT&amp;T on Verizon. If you're already with those carriers, then this one's right for you. It's the thinnest model in Apple's lineup and it's on tap to get Siri AI once it arrives, making this Prime Day iPhone deal even better." data-dimension48="Best Buy is giving the iPhone Air a $260 off instant discount, but the stipulation is that you have it activated on AT&amp;T on Verizon. If you're already with those carriers, then this one's right for you. It's the thinnest model in Apple's lineup and it's on tap to get Siri AI once it arrives, making this Prime Day iPhone deal even better." data-dimension25="$739" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-space-black/JJGCQLRKC2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="dm4kNuPysTLWPR7Yz6XnsB" name="iphone-air-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dm4kNuPysTLWPR7Yz6XnsB.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Best Buy is giving the iPhone Air a $260 off instant discount, but the stipulation is that you have it activated on AT&T on Verizon. If you're already with those carriers, then this one's right for you. It's the thinnest model in Apple's lineup and it's on tap to get Siri AI once it arrives, making this Prime Day iPhone deal even better.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-iphone-air-256gb-unlocked-space-black/JJGCQLRKC2" target="_blank" rel="nofollow" data-dimension112="170b83ad-a50e-4061-b86b-b22b2979a23d" data-action="Deal Block" data-label="Best Buy is giving the iPhone Air a $260 off instant discount, but the stipulation is that you have it activated on AT&amp;T on Verizon. If you're already with those carriers, then this one's right for you. It's the thinnest model in Apple's lineup and it's on tap to get Siri AI once it arrives, making this Prime Day iPhone deal even better." data-dimension48="Best Buy is giving the iPhone Air a $260 off instant discount, but the stipulation is that you have it activated on AT&amp;T on Verizon. If you're already with those carriers, then this one's right for you. It's the thinnest model in Apple's lineup and it's on tap to get Siri AI once it arrives, making this Prime Day iPhone deal even better." data-dimension25="$739">View Deal</a></p></div><div class="product"><a data-dimension112="5e6fc1e3-2d77-4730-828b-eaa06537f740" data-action="Deal Block" data-label="It's only one generation old, but the iPhone 16 is still worth getting, especially being at under $500 courtesy of Boost Mobile. You don't need to trade in any device to get the discount, but you will need to activate it on Boost's $60/month unlimited plan. Thankfully, you dictate how long you want to be on that plan." data-dimension48="It's only one generation old, but the iPhone 16 is still worth getting, especially being at under $500 courtesy of Boost Mobile. You don't need to trade in any device to get the discount, but you will need to activate it on Boost's $60/month unlimited plan. Thankfully, you dictate how long you want to be on that plan." data-dimension25="$499" href="https://www.boostmobile.com/shop/iphone-16.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:545px;"><p class="vanilla-image-block" style="padding-top:121.83%;"><img id="pBdAbhak7ruAnS2PrckC9X" name="iPhone 16 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pBdAbhak7ruAnS2PrckC9X.jpg" mos="" align="middle" fullscreen="" width="545" height="664" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's only one generation old, but the iPhone 16 is still worth getting, especially being at under $500 courtesy of Boost Mobile. You don't need to trade in any device to get the discount, but you will need to activate it on Boost's $60/month unlimited plan. Thankfully, you dictate how long you want to be on that plan.<a class="view-deal button" href="https://www.boostmobile.com/shop/iphone-16.html" target="_blank" rel="nofollow" data-dimension112="5e6fc1e3-2d77-4730-828b-eaa06537f740" data-action="Deal Block" data-label="It's only one generation old, but the iPhone 16 is still worth getting, especially being at under $500 courtesy of Boost Mobile. You don't need to trade in any device to get the discount, but you will need to activate it on Boost's $60/month unlimited plan. Thankfully, you dictate how long you want to be on that plan." data-dimension48="It's only one generation old, but the iPhone 16 is still worth getting, especially being at under $500 courtesy of Boost Mobile. You don't need to trade in any device to get the discount, but you will need to activate it on Boost's $60/month unlimited plan. Thankfully, you dictate how long you want to be on that plan." data-dimension25="$499">View Deal</a></p></div><div class="product"><a data-dimension112="567745a0-e4bf-4d20-ae68-046578aa9c56" data-action="Deal Block" data-label="With its upgraded 120Hz Retina Display, the iPhone 17 is a completely revamped base flagship model that's worth getting through Total Wireless. The $699 you end up paying at checkout does require three months of its unlimited plan, which at $195 total, isn't a huge commitment like the 24 or 36 months that other carriers force on you." data-dimension48="With its upgraded 120Hz Retina Display, the iPhone 17 is a completely revamped base flagship model that's worth getting through Total Wireless. The $699 you end up paying at checkout does require three months of its unlimited plan, which at $195 total, isn't a huge commitment like the 24 or 36 months that other carriers force on you." data-dimension25="$699" href="https://www.totalwireless.com/buy/phones/apple-iphone-17-prepaid" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="E8CYL324c2Rhis6hitehx9" name="iPhone 17 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/E8CYL324c2Rhis6hitehx9.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With its upgraded 120Hz Retina Display, the iPhone 17 is a completely revamped base flagship model that's worth getting through Total Wireless. The $699 you end up paying at checkout does require three months of its unlimited plan, which at $195 total, isn't a huge commitment like the 24 or 36 months that other carriers force on you.<a class="view-deal button" href="https://www.totalwireless.com/buy/phones/apple-iphone-17-prepaid" target="_blank" rel="nofollow" data-dimension112="567745a0-e4bf-4d20-ae68-046578aa9c56" data-action="Deal Block" data-label="With its upgraded 120Hz Retina Display, the iPhone 17 is a completely revamped base flagship model that's worth getting through Total Wireless. The $699 you end up paying at checkout does require three months of its unlimited plan, which at $195 total, isn't a huge commitment like the 24 or 36 months that other carriers force on you." data-dimension48="With its upgraded 120Hz Retina Display, the iPhone 17 is a completely revamped base flagship model that's worth getting through Total Wireless. The $699 you end up paying at checkout does require three months of its unlimited plan, which at $195 total, isn't a huge commitment like the 24 or 36 months that other carriers force on you." data-dimension25="$699">View Deal</a></p></div><div class="product"><a data-dimension112="1872d0c4-4b91-4ff6-8538-44f24f7b0508" data-action="Deal Block" data-label="iPhone 17 Pro Max: $1,579 w/1-year of unlimited service included" data-dimension48="iPhone 17 Pro Max: $1,579 w/1-year of unlimited service included" data-dimension25="$" href="https://www.mintmobile.com/devices/apple-iphone-17-pro-max/11105343/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="pTkyQcdfEYJToGvsVdVJfD" name="iPhone 17 Pro Max deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pTkyQcdfEYJToGvsVdVJfD.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>iPhone 17 Pro Max: </strong><a href="https://www.mintmobile.com/devices/apple-iphone-17-pro-max/11105343/" target="_blank" rel="nofollow" data-dimension112="1872d0c4-4b91-4ff6-8538-44f24f7b0508" data-action="Deal Block" data-label="iPhone 17 Pro Max: $1,579 w/1-year of unlimited service included" data-dimension48="iPhone 17 Pro Max: $1,579 w/1-year of unlimited service included" data-dimension25="$"><strong>$1,579 w/1-year of unlimited service included</strong></a><br>Mint Mobile has my favorite deal on the iPhone 17 Pro Max. Don't be too shocked by the $1,579 cost you need to shell out for this offer because it comes with one year of unlimited data. Plus, you're getting the next storage option up with 512GB memory. When you pay that amount at checkout, you won't need to worry about service for another year.<a class="view-deal button" href="https://www.mintmobile.com/devices/apple-iphone-17-pro-max/11105343/" target="_blank" rel="nofollow" data-dimension112="1872d0c4-4b91-4ff6-8538-44f24f7b0508" data-action="Deal Block" data-label="iPhone 17 Pro Max: $1,579 w/1-year of unlimited service included" data-dimension48="iPhone 17 Pro Max: $1,579 w/1-year of unlimited service included" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="56c5db4d-930f-41e9-ba43-e15512ffea53" data-action="Deal Block" data-label="Amazon doesn't sell new iPhones directly. Instead, you'll find an assortment of renewed models with discounts. If you need to spend as little as possible, this iPhone 14 deal is worth looking at for $299. It's still an unlocked model that's ready to activate on any carrier." data-dimension48="Amazon doesn't sell new iPhones directly. Instead, you'll find an assortment of renewed models with discounts. If you need to spend as little as possible, this iPhone 14 deal is worth looking at for $299. It's still an unlocked model that's ready to activate on any carrier." data-dimension25="$299" href="https://www.amazon.com/Apple-iPhone-14-128GB-Blue/dp/B0BN733951/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ULz7jjnZqnUTGGv5cXmiGK" name="iPhone 14 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ULz7jjnZqnUTGGv5cXmiGK.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Amazon doesn't sell new iPhones directly. Instead, you'll find an assortment of renewed models with discounts. If you need to spend as little as possible, this iPhone 14 deal is worth looking at for $299. It's still an unlocked model that's ready to activate on any carrier.<a class="view-deal button" href="https://www.amazon.com/Apple-iPhone-14-128GB-Blue/dp/B0BN733951/" target="_blank" rel="nofollow" data-dimension112="56c5db4d-930f-41e9-ba43-e15512ffea53" data-action="Deal Block" data-label="Amazon doesn't sell new iPhones directly. Instead, you'll find an assortment of renewed models with discounts. If you need to spend as little as possible, this iPhone 14 deal is worth looking at for $299. It's still an unlocked model that's ready to activate on any carrier." data-dimension48="Amazon doesn't sell new iPhones directly. Instead, you'll find an assortment of renewed models with discounts. If you need to spend as little as possible, this iPhone 14 deal is worth looking at for $299. It's still an unlocked model that's ready to activate on any carrier." data-dimension25="$299">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ $1,299 iPhone 18 Pro Max?! Analyst now predicts $200 price hike for Apple's next flagship phone ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/usd1-299-iphone-18-pro-max-analyst-now-predicts-usd200-price-hike-for-apples-next-flagship-phone</link>
                                                                            <description>
                            <![CDATA[ With Apple raising prices on nearly every device it makes, an analyst tells us that the iPhone 18 Pro Max could be much more expensive. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hg6NNTq7yo6ptM2bknckXF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GLaF4NQUMZx2XdzonS5Dbi-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 00:20:36 +0000</pubDate>                                                                                                                                <updated>Thu, 02 Jul 2026 13:39:04 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/GLaF4NQUMZx2XdzonS5Dbi-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 17 Pro and Pro Max]]></media:description>                                                            <media:text><![CDATA[iPhone 17 Pro and Pro Max]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 17 Pro and Pro Max]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GLaF4NQUMZx2XdzonS5Dbi-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Surprisingly, when <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple announced across the board price hikes</a> for its entire product lineup, the iPhone was left untouched. That may not last long, though.</p><p>While Apple didn't announce iPhone price increases, it's likely those are coming. The iPhone is Apple's biggest revenue driver making up over 60% of the company's sales since 2008 accordign to this<a href="https://www.businessofapps.com/data/apple-statistics/" target="_blank"> Business of Apps report. </a>And now finally, Apple is proving that it's not immune to <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMaggedon</a>.</p><p>Analysts at IDC predict that Apple will announce price increases at a later date. Nabila Popal of IDC told Tom's Guide that the company had been forecasting $100 increases for the Pro models and $50 for the base ones. </p><p>However, it appears the price hikes to the iPad and Mac laptops were much larger than expected. </p><p>"My personal instinct says the hike to iPhones may be even higher than what we assumed – perhaps even $200 to the Pro Max models," Popal said. "I think the days of $50 price increases are over."</p><p>If that comes to fruition, here's how it would look:</p><div ><table><caption>Potential iPhone 18 prices</caption><thead><tr><th class="firstcol " ><p>Model</p></th><th  ><p>Current iPhone 17 price</p></th><th  ><p>Predicted price</p></th></tr></thead><tbody><tr><td class="firstcol " ><p>iPhone 18</p></td><td  ><p>from $799</p></td><td  ><p>$899</p></td></tr><tr><td class="firstcol " ><p>iPhone 18 Air</p></td><td  ><p>from $999</p></td><td  ><p>$1,099</p></td></tr><tr><td class="firstcol " ><p>iPhone 18 Pro</p></td><td  ><p>from $1,099</p></td><td  ><p>$1,299</p></td></tr><tr><td class="firstcol " ><p>iPhone 18 Pro Max</p></td><td  ><p>from $1,199</p></td><td  ><p>$1,399</p></td></tr><tr><td class="firstcol " ><p>iPhone 18 Ultra</p></td><td  ><p>N/A</p></td><td  ><p>$2,500</p></td></tr></tbody></table></div><p>Popal believes today's announcement is a way for Apple to "cushion" the idea of price increases for the iPhone. IDC also believes that the foldable iPhone Ultra is likely to cost $2,500 for the cheapest model — up from <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-could-cost-less-than-galaxy-z-fold-7-under-usd2-000">previously reported estimates of $2,000</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-just-tipped-to-cost-an-obscene-usd2-399-but-it-could-have-this-apple-exclusive">$2,400</a>.</p><p>Especially since this year's phone might drive iPhone owners to upgrade, since the recently announced AI-powered <a href="https://www.tomsguide.com/phones/iphones/only-the-iphone-17-pro-and-iphone-17-air-get-apples-most-powerful-on-device-apple-intelligence-model-heres-what-that-means">Siri upgrade will only be available on iPhone 17 Pro</a> models and later. That leaves out the popular iPhone 16 models and even the iPhone 15 Pro models, the oldest ones that currently support Apple Intelligence.</p><h2 id="price-hikes-are-becoming-the-norm">Price hikes are becoming the norm</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:60.20%;"><img id="Uy8Chuw8oY5jPoc7HyGMKd" name="Xbox Series X where to buy stock.jpg" alt="Where to buy Xbox Series X" src="https://cdn.mos.cms.futurecdn.net/Uy8Chuw8oY5jPoc7HyGMKd.jpg" mos="" align="middle" fullscreen="" width="2000" height="1204" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>As AI drains the world of memory and storage, it's become increasingly common for companies to announce price hikes to combat the ongoing shortage. At around the same time Apple announced its price increases, Microsoft also revealed that <a href="https://www.tomsguide.com/gaming/xbox/microsoft-blames-components-crisis-for-rising-xbox-prices-amidst-ai-greed-which-has-been-partly-caused-by-microsoft">Xbox price hikes are coming</a>, again.</p><p>Both Apple and Microsoft blamed "components crisis" for the rising dollar signs. </p><p>"We believe the situation is not bound to be better, at least for the next two years," Counterpoint's VP of Research Neil Shah, told Tom's Guide. Shah added that companies will likely start pushing premium products as consumers reject weaker "budget" models and their new higher costs.</p><p>Apple, like its Windows rival, is not blameless here. Despite its seeming ineptitude at getting AI to work, the company has invested in the ubiquitous technology in the last couple of years. </p><p>Since 2024 its had partnerships with OpenAI and this year with Google to integrate the company's AI models into Apple Intelligence. Meanwhile, they hired and fired various AI builders to create Apple Intelligence.</p><p><a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-was-apples-ai-renaissance-but-theres-one-very-important-feature-still-missing-from-ios-27">WWDC 2026 showed</a> that Apple may have finally figured it out.</p><p>Unfortunately, investing in AI means you're putting money towards the greedy dragons that are AI-focused datacenters, which hoard memory chips like Smaug. Only we don't seem to have a Bard to kill the beast.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/live/news/apple-deals-to-beat-the-price-hike">LIVE: I'm tracking every Apple deal to beat the price hikes. Buy now, because they’ll never be this cheap again</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/ready-to-ditch-your-apple-smartwatch-i-picked-the-best-garmin-alternatives-for-each-apple-watch">Ready to ditch your Apple smartwatch? I picked the best Garmin alternatives for each Apple Watch</a></li><li><a href="https://www.tomsguide.com/ai/apple-is-ending-support-for-16-devices-heres-the-chatgpt-prompt-that-tells-you-what-to-do-next">Apple is ending support for 16 devices — here’s the ChatGPT prompt that tells you what to do next</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Which Prime Day Apple deals are actually worth it? Here are the 7 products that got 4 stars or higher in our testing ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/sales-events/which-prime-day-apple-deals-are-actually-worth-it-here-are-the-7-products-that-got-4-stars-or-higher-in-our-testing</link>
                                                                            <description>
                            <![CDATA[ Prime Day is offering generous savings on many Apple devices I've tested and used. From iPhones to AirPods, these are my favorite deals going on right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SH7jowpW35n9a4uBynqw5Q</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8dfbzMF7vX9srFWT5s3Ddf-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 24 Jun 2026 17:23:53 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sales Events]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/8dfbzMF7vX9srFWT5s3Ddf-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A bunch of Apple gadgets with Prime Day badge.]]></media:description>                                                            <media:text><![CDATA[A bunch of Apple gadgets with Prime Day badge.]]></media:text>
                                <media:title type="plain"><![CDATA[A bunch of Apple gadgets with Prime Day badge.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8dfbzMF7vX9srFWT5s3Ddf-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you have ever tried shopping for a new iPhone, MacBook, or Apple Watch, you already know the obvious truth: Apple gadgets rarely go on sale. With <a href="https://www.tomsguide.com/sales-events/live/75-best-prime-day-deals-still-live-this-weekend-apple-kindle-tvs-and-more">Prime Day</a> happening right now, there are deep discounts on some of my favorite Apple gear that I religiously use on the daily.</p><p>Whether it’s upgrading to a new iPhone to keep up with your content creation, staying productive with a MacBook, or just kicking back to listen to music with a pair of AirPods, you’ll find an awesome deal on many popular Apple devices. And it’s not just Amazon either, as many other retailers are offering equally generous savings.</p><p>Here are the best Apple Prime Day deals that my colleagues and I have tested — available right now.</p><h2 class="article-body__section" id="section-best-apple-prime-day-deals-quick-links"><span>Best Apple Prime Day deals: Quick links</span></h2><ul><li><strong>Apple iPhone 17 Pro: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3726747/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>was $999 now free w/unlimited plan @ T-Mobile</strong></a><strong></strong></li><li><strong>Apple AirTag 2: </strong><a href="https://www.amazon.com/gp/aw/d/B0GJTFXNRX/" target="_blank" rel="nofollow"><strong>was $29 now $24 @ Amazon</strong></a><strong></strong></li><li><strong>Apple iPhone Air MagSafe Battery: </strong><a href="https://www.amazon.com/Apple-iPhone-Air-MagSafe-Battery/dp/B0FQFH9BST/" target="_blank" rel="nofollow"><strong>was $99 now $59 @ Amazon</strong></a><strong></strong></li><li><strong>Apple AirPods Pro 3: </strong><a href="https://www.amazon.com/Apple-Cancellation-Translation-Headphones-High-Fidelity/dp/B0FQFB8FMG" target="_blank" rel="nofollow"><strong>was $249 now $179 @ Amazon</strong></a><strong></strong></li><li><strong>Apple Watch SE 3: </strong><a href="https://www.amazon.com/dp/B0FQFW7M9H" target="_blank" rel="nofollow"><strong>was $249 now $199 @ Amazon</strong></a></li><li><strong>Apple iPad Air M5: </strong><a href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQV9W97Q" target="_blank" rel="nofollow"><strong>was $599 now $519 @ Amazon</strong></a><strong></strong></li><li><strong>Apple MacBook Pro M5: </strong><a href="https://www.amazon.com/dp/B0FWD623D1?" target="_blank" rel="nofollow"><strong>was $1,699 now $1,549 @ Amazon</strong></a><strong></strong></li></ul><h2 class="article-body__section" id="section-top-apple-prime-day-discounts-available-right-now"><span>Top Apple Prime Day discounts available right now</span></h2><div class="product"><a data-dimension112="d13c3095-8d6c-4e3b-a612-8675d24478f4" data-action="Deal Block" data-label="AirTag 2" data-dimension48="AirTag 2" data-dimension25="$24" href="https://www.amazon.com/gp/aw/d/B0GJTFXNRX/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="EzmCNB37HYZTKq3XSMqvTY" name="Apple AirTag 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EzmCNB37HYZTKq3XSMqvTY.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Hear me out! I tested the <a href="https://www.tomsguide.com/phones/apple-airtag-2-review" data-dimension112="d13c3095-8d6c-4e3b-a612-8675d24478f4" data-action="Deal Block" data-label="AirTag 2" data-dimension48="AirTag 2" data-dimension25="$24">AirTag 2</a> and it's really the most findable tracker ever released. What makes it superior compared to the handful of trackers I've tested is the improved Precision Finding performance thanks it a new Ultra Wideband chip. I put it to the test against the original one and it really has extended range that lets me better track down its location. You can also use your Apple Watch to find it too.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0GJTFXNRX/" target="_blank" rel="nofollow" data-dimension112="d13c3095-8d6c-4e3b-a612-8675d24478f4" data-action="Deal Block" data-label="AirTag 2" data-dimension48="AirTag 2" data-dimension25="$24">View Deal</a></p></div><div class="product"><a data-dimension112="da1a0810-77bb-4ecd-9d17-2c7c970d55e6" data-action="Deal Block" data-label="iPhone 17 series: free w/ unlimited @ T-Mobile" data-dimension48="iPhone 17 series: free w/ unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3726747/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="pTkyQcdfEYJToGvsVdVJfD" name="iPhone 17 Pro Max deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pTkyQcdfEYJToGvsVdVJfD.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>iPhone 17 series: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3726747/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="da1a0810-77bb-4ecd-9d17-2c7c970d55e6" data-action="Deal Block" data-label="iPhone 17 series: free w/ unlimited @ T-Mobile" data-dimension48="iPhone 17 series: free w/ unlimited @ T-Mobile" data-dimension25=""><strong>free w/ unlimited @ T-Mobile</strong></a><br>I test dozens of phones, but the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a> has remained as my daily driver for a number of reasons. Not only does it capture photos and videos well, but it's going to get better once iOS 27 releases later this year along with Siri AI. For a flagship, you can't beat this one. And yes, I prefer it over the 17 Pro Max for its smaller, more pocketable size.<a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3726747/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="da1a0810-77bb-4ecd-9d17-2c7c970d55e6" data-action="Deal Block" data-label="iPhone 17 series: free w/ unlimited @ T-Mobile" data-dimension48="iPhone 17 series: free w/ unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="b1ec588e-cc30-42b6-94c6-c59fd6fd4e94" data-action="Deal Block" data-label="AirPods Pro 3" data-dimension48="AirPods Pro 3" data-dimension25="$179" href="https://www.amazon.com/Apple-Cancellation-Translation-Headphones-High-Fidelity/dp/B0FQFB8FMG" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:62.13%;"><img id="4AoVNM5Nik73yu7v2EMfEa" name="Apple AirPods Pro 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4AoVNM5Nik73yu7v2EMfEa.png" mos="" align="middle" fullscreen="" width="1500" height="932" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Besides my iPhone 17 Pro, the other things I carry with me when I go to work are the <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review" data-dimension112="b1ec588e-cc30-42b6-94c6-c59fd6fd4e94" data-action="Deal Block" data-label="AirPods Pro 3" data-dimension48="AirPods Pro 3" data-dimension25="$179">AirPods Pro 3</a>. As much as I prefer the smaller and more discreet-looking Pixel Buds Pro 2, the AirPods Pro 3 offer superior noise cancellation that does a better job of drowning out the noise. It's something I easily notice while riding the subway in New York City, especially when the wheels screech along the rails. I don't hear any of those shrill tones when I'm wearing them.<a class="view-deal button" href="https://www.amazon.com/Apple-Cancellation-Translation-Headphones-High-Fidelity/dp/B0FQFB8FMG" target="_blank" rel="nofollow" data-dimension112="b1ec588e-cc30-42b6-94c6-c59fd6fd4e94" data-action="Deal Block" data-label="AirPods Pro 3" data-dimension48="AirPods Pro 3" data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="de69350c-b740-49b9-bb40-ac0ce6bdc5ec" data-action="Deal Block" data-label="11-inch iPad Air" data-dimension48="11-inch iPad Air" data-dimension25="$519" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQV9W97Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Since I prefer traveling as light as possible, the <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review" data-dimension112="de69350c-b740-49b9-bb40-ac0ce6bdc5ec" data-action="Deal Block" data-label="11-inch iPad Air" data-dimension48="11-inch iPad Air" data-dimension25="$519">11-inch iPad Air</a> suits me perfectly because it has everything I want in a tablet: a skinny design paired with incredible power from its M3 chip. Even you crave more utility, I highly recommend buying a keyboard case as well so that it practically transforms into a laptop.<a class="view-deal button" href="https://www.amazon.com/Apple-iPad-Air-11-inch-M4/dp/B0GQV9W97Q" target="_blank" rel="nofollow" data-dimension112="de69350c-b740-49b9-bb40-ac0ce6bdc5ec" data-action="Deal Block" data-label="11-inch iPad Air" data-dimension48="11-inch iPad Air" data-dimension25="$519">View Deal</a></p></div><div class="product"><a data-dimension112="55820e15-252a-4191-b4b2-54429066f4c4" data-action="Deal Block" data-label="Apple Watch SE 3" data-dimension48="Apple Watch SE 3" data-dimension25="$199" href="https://www.amazon.com/dp/B0FQFW7M9H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1250px;"><p class="vanilla-image-block" style="padding-top:120.00%;"><img id="P5u4zYQs5ZvG5TAnrthGhE" name="Apple Watch SE 3 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/P5u4zYQs5ZvG5TAnrthGhE.jpg" mos="" align="middle" fullscreen="" width="1250" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want a simple smartwatch that has all the basics and doesn't cost a fortune, then check out the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-se-3-review" data-dimension112="55820e15-252a-4191-b4b2-54429066f4c4" data-action="Deal Block" data-label="Apple Watch SE 3" data-dimension48="Apple Watch SE 3" data-dimension25="$199">Apple Watch SE 3</a>. It's under $200 right now courtesy of Amazon and I think it's more than worth it for most people. That's because it functions as an everyday fitness tracker for whenever you exercise. Plus, I really enjoy being able to keep my iPhone in my pocket for small things like notifications, replying to messages, and quickly glancing the subject lines of emails that I get.<a class="view-deal button" href="https://www.amazon.com/dp/B0FQFW7M9H" target="_blank" rel="nofollow" data-dimension112="55820e15-252a-4191-b4b2-54429066f4c4" data-action="Deal Block" data-label="Apple Watch SE 3" data-dimension48="Apple Watch SE 3" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="0f016a80-543e-4676-afe8-5bb9c5c2997b" data-action="Deal Block" data-label="As much as I lean on an iPad for most things, you'll get even more work accomplished with the M5-powered 14-inch version of the MacBook Pro. Compared to an iPad, this MacBook is  way better suited for when I have to edit 4K videos I've captured and stitch them together for a reel." data-dimension48="As much as I lean on an iPad for most things, you'll get even more work accomplished with the M5-powered 14-inch version of the MacBook Pro. Compared to an iPad, this MacBook is  way better suited for when I have to edit 4K videos I've captured and stitch them together for a reel." data-dimension25="$1549" href="https://www.amazon.com/dp/B0FWD623D1?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:60.53%;"><img id="GnpQTG2JTWSenJyfrWydnm" name="MacBook Pro M5 deals" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GnpQTG2JTWSenJyfrWydnm.jpg" mos="" align="middle" fullscreen="" width="1500" height="908" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>As much as I lean on an iPad for most things, you'll get even more work accomplished with the M5-powered 14-inch version of the MacBook Pro. Compared to an iPad, this MacBook is  way better suited for when I have to edit 4K videos I've captured and stitch them together for a reel.<a class="view-deal button" href="https://www.amazon.com/dp/B0FWD623D1?" target="_blank" rel="nofollow" data-dimension112="0f016a80-543e-4676-afe8-5bb9c5c2997b" data-action="Deal Block" data-label="As much as I lean on an iPad for most things, you'll get even more work accomplished with the M5-powered 14-inch version of the MacBook Pro. Compared to an iPad, this MacBook is  way better suited for when I have to edit 4K videos I've captured and stitch them together for a reel." data-dimension48="As much as I lean on an iPad for most things, you'll get even more work accomplished with the M5-powered 14-inch version of the MacBook Pro. Compared to an iPad, this MacBook is  way better suited for when I have to edit 4K videos I've captured and stitch them together for a reel." data-dimension25="$1549">View Deal</a></p></div><div class="product"><a data-dimension112="e5e7e10c-856b-45ff-9b9b-0060b827a1f8" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$59" href="https://www.amazon.com/Apple-iPhone-Air-MagSafe-Battery/dp/B0FQFH9BST/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="aXPgnejKp5Lfbmxxi982dn" name="Apple iPhone Air MagSafe Battery ​​​​​​​ deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aXPgnejKp5Lfbmxxi982dn.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I briefly used the <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review" data-dimension112="e5e7e10c-856b-45ff-9b9b-0060b827a1f8" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$59">iPhone Air</a>, and if there's one thing I can tell you about it, it's that the battery life is on the shorter side. Fortunately, you can easily extend it with this MagSafe Battery specifically designed for the iPhone Air, which snaps onto the back to provide up to a 65% battery boost.<a class="view-deal button" href="https://www.amazon.com/Apple-iPhone-Air-MagSafe-Battery/dp/B0FQFH9BST/" target="_blank" rel="nofollow" data-dimension112="e5e7e10c-856b-45ff-9b9b-0060b827a1f8" data-action="Deal Block" data-label="iPhone Air" data-dimension48="iPhone Air" data-dimension25="$59">View Deal</a></p></div><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Phones&view_mode=savings_squad&widget_title=Top+Prime+Day+phone+deals%2C+as+picked+by+us&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = mode === 'savings_squad' ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += 12;              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I used to find my iPhone's Shortcuts app intimidating — then iOS 27 changed everything ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/i-used-to-find-my-iphones-shortcuts-app-intimidating-then-ios-27-changed-everything</link>
                                                                            <description>
                            <![CDATA[ With iOS 27, you can get Apple Intelligence to design custom shortcuts — here's how. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">QrK6yJRhkLwKADXTVX573m</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 21 Jun 2026 07:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Apple/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:description>                                                            <media:text><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For a long time, my iPhone's Shortcuts app sat completely untouched. Every time I opened it, I was staring down an overwhelming maze of workflows, actions, and conditional logic — concepts that felt way too close to coding for my liking. So, I did what a lot of us do: I gave up on it entirely.</p><p>But <a href="https://www.tomsguide.com/phones/iphones/ios-27-11-biggest-features-coming-to-your-iphone">iOS 27</a> completely changed how I use my phone, thanks to a new Apple Intelligence feature called Describe a Shortcut. Instead of forcing you to manually construct complex workflows, the AI lets you prompt exactly what you want your iPhone to do, and it builds the shortcut for you in seconds.</p><p>If you want to try it out yourself, you'll just need the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 beta</a> running on an iPhone 15 Pro or newer to get started.</p><h2 id="download-ios-27-beta-to-access-apple-intelligence-shortcuts">Download iOS 27 beta to access Apple Intelligence shortcuts</h2><p>First, back up your iPhone by going to <strong>Settings, Your Name, iCloud, iCloud Backup</strong> and tapping <strong>Back Up Now</strong>.</p><p>If you’ve never used an Apple beta before, you'll need to <a href="https://developer.apple.com/get-started/" target="_blank">register for a free developer account</a> to get started. Once you’ve done that and are off the Apple Intelligence waitlist, you can update your phone. </p><p>If you’ve used any Apple beta in the past, you can skip the registration entirely and download iOS 27 straight away. Just open <strong>Settings</strong>, go to <strong>General, Software Update,  Beta Updates</strong>, and <strong>select the iOS 27 Developer Beta</strong>.</p><section class="howto-block">                    <h3>How to create shortcuts with Apple Intelligence</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/f8Bm5YF24eqBiKzQxdgMYi.jpg"                                        alt="How to use Apple Intelligence to build custom iPhone shortcuts"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/f8Bm5YF24eqBiKzQxdgMYi.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p><strong>Open the Shortcuts app and tap the New Shortcut button</strong> at the bottom. Instead of the traditional workflow builder with manual actions, you'll see a text field asking what you want the shortcut to do. </p><p>Type a natural description of the action. I, for example, used: "At 10:00 PM, turn on 'Do Not Disturb', set the screen brightness to 15%, and turn on Dark Mode." Once you've done this, <strong>press the arrow</strong>. Apple Intelligence analyzes your prompt, then constructs the entire shortcut with all the necessary actions. </p><p>The beauty of describing shortcuts is that you can be as specific as your situation requires. You could build a morning workflow that opens your calendar, plays a specific playlist, and sends a text. You could create a work mode that silences notifications, closes distracting apps, and locks your phone until you toggle it off. </p><p>The more detailed your description, the more precisely Apple Intelligence understands what you need. Keep in mind that because this is still a beta, you may experience a little trial and error, but so far, so good. </p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eJk2yW"></div>                            </div>                            <script src="https://kwizly.com/embed/eJk2yW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-has-a-hidden-liquid-glass-slider-here-is-how-to-find-and-use-it">iOS 27 has a new ‘Liquid Glass’ slider — here is how to find and use it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-3-new-ios-27-ai-tools-that-will-instantly-save-your-ruined-photos">The 3 new iOS 27 AI tools that will instantly save your ruined photos</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again">This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple says iOS 27 runs much smoother than iOS 26 — we put it to the test ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/apple-says-ios-27-runs-much-smoother-than-ios-26-we-put-it-to-the-test</link>
                                                                            <description>
                            <![CDATA[ Our real-world testing of the iOS 27 developer beta looks to see if Apple's claim that its new software is much more responsive than iOS 26. We put it to the test. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NkWcHxGCYQAMCGdfWCrj58</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qdS9MAp79UU3D85qwZjEV6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 21 Jun 2026 06:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qdS9MAp79UU3D85qwZjEV6-1280-80.jpg">
                                                            <media:credit><![CDATA[John Velasco / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 Siri AI running on iPhone 17 Pro.]]></media:description>                                                            <media:text><![CDATA[iOS 27 Siri AI running on iPhone 17 Pro.]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 Siri AI running on iPhone 17 Pro.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qdS9MAp79UU3D85qwZjEV6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Companies often brag about speed improvements with new software releases, and Apple is no exception. During its <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> keynote, the company unveiled its new <a href="https://www.tomsguide.com/phones/iphones/ios-27-11-biggest-features-coming-to-your-iphone">iOS 27</a> software, which is slated to arrive later this year — but Apple took a fair amount of time to highlight the software's responsiveness.</p><p>Apple made a bold claim, saying that a major architecture overhaul is designed to optimize system resources and maximize efficiency. The result? iOS 27 is a much more responsive operating system than its predecessor. Apple even explicitly stated that <strong>apps launch 30% faster on iOS 27</strong> than on iOS 26, among other claims about the new software.</p><p>We wanted to put these claims to the test, so my colleagues and I took two <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17</a> models — one running <a href="https://www.tomsguide.com/phones/iphones/ios-26-review-new-features-liquid-glass">iOS 26</a> and the other running the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developer beta</a> — to compare exactly how the software performs across different tasks. Is it really faster? Here’s what we found out.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="the-test">The test</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XsiTj7kxY5xtiZMvD3h7ud" name="Apple iPhone 17 review" alt="Apple iPhone 17 review." src="https://cdn.mos.cms.futurecdn.net/XsiTj7kxY5xtiZMvD3h7ud.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>For this iOS 27 vs. iOS 26 speed comparison, we ran a total of seven tests — performing three passes for each one and recording the average. For all the launch tests, we cleared all apps from memory to ensure a clean slate. Here’s the barrage of tests we conducted:</p><ul><li><strong>Safari:</strong> Time taken to launch the browser.</li><li><strong>Photos:</strong> Time taken to open the Photos app.</li><li><strong>Camera:</strong> Time taken to load the Camera app.</li><li><strong>Google Maps:</strong> Time from initial launch to when the map fully loads.</li><li><strong>AirDrop (Small File):</strong> Transfer time of a 160 MB MP4 file from a MacBook Pro to the iPhone.</li><li><strong>AirDrop (Large File):</strong> Transfer time of a 6.74 GB MP4 file from a MacBook Pro to the iPhone.</li><li><strong>Hard Drive:</strong> Transfer time of a 6.74 GB Tears of Steel 4K file from an external Thunderbolt drive to the iPhone.</li></ul><h2 id="the-results">The results</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>iOS 26 Speed (Minutes:Seconds.Miliseconds)</strong></p></td><td  ><p><strong>iOS 27 Speed (Minutes:Seconds.Miliseconds)</strong></p></td><td  ><p><strong>Difference (Seconds)</strong></p></td><td  ><p><strong>% Improvement</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Safari</strong></p></td><td  ><p>00:00.24</p></td><td  ><p>00:00.21</p></td><td  ><p>0.03</p></td><td  ><p>+12.5%</p></td></tr><tr><td class="firstcol " ><p><strong>Photos </strong></p></td><td  ><p>0:00.39</p></td><td  ><p>00:00.32</p></td><td  ><p>0.07</p></td><td  ><p>+17.9%</p></td></tr><tr><td class="firstcol " ><p><strong>Camera </strong></p></td><td  ><p>00:00.24</p></td><td  ><p>00:00.23</p></td><td  ><p>0.01</p></td><td  ><p>+4.2%</p></td></tr><tr><td class="firstcol " ><p><strong>Google Maps</strong></p></td><td  ><p>00:00.88</p></td><td  ><p>00:00.53</p></td><td  ><p>0.35</p></td><td  ><p>+39.8%</p></td></tr><tr><td class="firstcol " ><p><strong>AirDrop Small File (160MB MP4)</strong></p></td><td  ><p>0:11.13</p></td><td  ><p>00:10.60</p></td><td  ><p>0.53</p></td><td  ><p>+4.8%</p></td></tr><tr><td class="firstcol " ><p><strong>AirDrop Large File (6.74 GB MP4)</strong></p></td><td  ><p>5:39.17</p></td><td  ><p>5:22.21</p></td><td  ><p>16.96</p></td><td  ><p>+5.0%</p></td></tr><tr><td class="firstcol " ><p><strong>Hard Drive</strong></p></td><td  ><p>3:12.82</p></td><td  ><p>3:06.04</p></td><td  ><p>6.78</p></td><td  ><p>+3.5%</p></td></tr></tbody></table></div><p>After averaging our times for each test, the data reveals a clear picture: there’s definitely a speed improvement across the board. Is it a massive one? Not really. Let’s start by looking at some of the core apps. Safari dropped from 0.24 seconds down to 0.21 seconds (a 12.5% improvement), while opening the Photos app saw an even larger 17.9% speed bump, dropping from 0.39 seconds to 0.32 seconds. The Camera app saw a smaller but welcome optimization, shaving off a fraction of a second to load in 0.23 seconds.</p><p>The single biggest speed improvement in our testing came from Google Maps. On iOS 26, launching the app and waiting for the full interface to load took nearly a full second at 0.88 seconds. On iOS 27, that exact same process took a mere 0.53 seconds. That’s a staggering 39.8% reduction in wait time, more than backing up Apple’s claim of apps launching 30% faster.</p><p>Another notable comment about iOS 27’s responsiveness came from Stacey Ford, VP of OS Program Management at Apple, who stated during the keynote that users could expect up to 80% faster AirDrop speeds. However, our real-world testing painted a more modest picture. When transferring a small 160MB MP4 video file from a MacBook Pro to the iPhone, iOS 27 shaved the time down from 11.13 seconds to 10.60 seconds. With the larger 6.74GB file over AirDrop, it took 5 minutes and 39 seconds on iOS 26, but dropped to 5 minutes and 22 seconds on iOS 27 — saving you 17 seconds in a pinch.</p><p>Finally, there’s the wired transfer test, where we hooked the iPhone 17 up to an external Thunderbolt drive to move that same 6.74GB Tears of Steel video file. Just like everything else, the improvement was there, but minor. The transfer clocked in at 3 minutes and 12 seconds on iOS 26, and dropped to 3 minutes and 6 seconds on iOS 27 — resulting in a minuscule 3.5% speed bump.</p><h2 id="the-real-world-difference">The real world difference</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gEtj6Knu3kZnoSeCRH6ZnQ" name="iOS 27 beta.GIF" alt="iOS 27 beta showing Reframe tool." src="https://cdn.mos.cms.futurecdn.net/gEtj6Knu3kZnoSeCRH6ZnQ.gif" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Based on our testing, individual results will vary, but one thing is certain: iOS 27 delivers a tangible speed boost. Personally, the most immediate change I noticed when making the jump from iOS 26 to the iOS 27 developer beta was the sheer responsiveness of the interface. My iPhone 17 Pro’s 120Hz Super Retina XDR display already delivers incredibly fluid animations, but it’s impressive to see that they feel even smoother under iOS 27.</p><p>Apple’s under-the-hood optimizations deserve plenty of praise, especially since support for the new software stretches all the way back to the <a href="https://www.tomsguide.com/reviews/iphone-11">iPhone 11</a>. That spans an impressive six generations, which is particularly notable given Apple's confirmation a couple years back that <a href="https://www.tomsguide.com/phones/iphones/apple-reveals-how-long-iphones-will-get-support-and-its-less-than-google-and-samsung">iPhones are guaranteed a minimum of five years of software support</a>.</p><p>Of course, this shot of adrenaline to the system's speed and responsiveness is just a small fraction of what makes the upgrade compelling. With a massive wave of new Apple Intelligence features and a completely overhauled Siri AI playing a larger role than ever, iOS 27 proves that Apple’s software isn't just getting faster — it's getting smarter too. If this beta is any indication of the final release, your iPhone is about to feel brand new all over again.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2anNe"></div>                            </div>                            <script src="https://kwizly.com/embed/W2anNe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again">This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again</a></li><li><a href="https://www.tomsguide.com/phones/iphones/airpods-finally-get-a-custom-eq-in-ios-27-here-is-how-to-fix-your-sound">AirPods finally get a custom EQ in iOS 27 — here is how to fix your sound</a></li><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iOS 27 has a bunch of changes, including a refined Liquid Glass design — but how much has changed from iOS 26? ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/ios-27-has-a-bunch-of-changes-including-a-refined-liquid-glass-design-but-how-much-has-changed-from-ios-26</link>
                                                                            <description>
                            <![CDATA[ iOS 27 beta is already trying to fix iOS 26's biggest mistakes, but how much has Liquid Glass changed with the new update? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rSEKoLVhVNgFWLufdirLVT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 21 Jun 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Apple/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:description>                                                            <media:text><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's fair to say that <a href="https://www.tomsguide.com/phones/iphones/ios-26-complaints-are-piling-up-should-you-wait-to-upgrade">Liquid Glass was rather controversial</a> following its debut at WWDC 2025. It's no surprise that such a drastic change caused loyal iPhone users to complain; the same thing happened when iOS 7 made similarly drastic changes back in 2013. But this didn't change the fact that the backlash was so severe that <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">Apple has made a point to tweak Liquid Glass</a> in <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a>.</p><p>The effect hasn't been removed, so any diehard Liquid Glass haters are going to be disappointed. But Apple has made some changes that could prove beneficial to those of you with valid criticisms about Liquid Glass and how the transparency effects actually work. Not only is there a new slider to control how the transparency effects work, but Apple also claims it has adjusted how Liquid Glass elements look on screen. </p><p>But just how much has changed compared to <a href="https://www.tomsguide.com/phones/iphones/ios-26-review-new-features-liquid-glass">iOS 26</a>? I decided to compare the newly-released iOS 27 beta with last year's software to find out.</p><h2 id="why-people-hated-liquid-glass">Why people hated Liquid Glass</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rxsgRZSfu6Yndy7FUJ6UKW" name="liquid-glass-dark-mode" alt="app icons in dark mode in liquid glass in iOS 26" src="https://cdn.mos.cms.futurecdn.net/rxsgRZSfu6Yndy7FUJ6UKW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Beyond the people who criticize change simply because they don't like change, what was the deal with Liquid Glass, and <a href="https://www.tomsguide.com/phones/iphones/ios-26-complaints-are-piling-up-should-you-wait-to-upgrade">why did people hate it so much</a>?</p><p>The reduced readability was a common complaint, with multiple users complaining about blurry icons and the icons themselves having a strange "tilted" look that you can't ever unsee. Dark mode drew some particular ire from users, with some people complaining that the slight glow around Liquid Glass icons was distracting — and in some cases caused dizziness.</p><p>Others noted that the keyboard experience wasn't consistent across apps, with third-party apps frequently defaulting back to the old pre-iOS 26 keyboard design instead of the one infused with Liquid Glass effects. Those with older phones also experience inconsistent performance, and even Apple itself said that upgrading to iOS 26 would cause temporary issues with battery life and performance.</p><p>Those issues were supposed to fix themselves, but it seems people have a long memory for problems that occur when changes they already don't like happen.</p><p>The main complaint when Liquid Glass first appeared after the release of the iOS 26 beta was that the effect couldn't be switched off. Apple did actually change this later on, offering binary "clear" and "tinted" options within the settings, while early adopters found there was a "reduce transparency" toggle hidden in the accessibility menu.  </p><h2 id="what-apple-says-has-changed">What Apple says has changed</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aygmtQLWrQo6eSTgUyZSCc" name="WWDC 2026 — June 8 _ Apple 10-11 screenshot" alt="Liquid Glass slider at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/aygmtQLWrQo6eSTgUyZSCc.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The main change that's come to Liquid Glass in the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 beta</a> is the addition of a slider, which controls the strength of the Liquid Glass effect across your entire system. This is a big change compared to the binary on/off toggle that was available in iOS 26.</p><p>On one end of the spectrum, you have the full Liquid Glass effect, which offers a translucent appearance to icons, windows and other system elements. On the other end, things turn almost completely opaque, though you can still see some remnants of the background.</p><p>Apple has also promised huge improvements to readability. Part of this involves new darkened edges around Liquid Glass elements, which, when combined with brighter highlights, make them stand out more from the background. That should make them more visible and easier to focus on.</p><p>Another major change is the way that iOS 27 treats background elements behind Liquid Glass icons. According to Apple, the system is now able to disperse more complex background content more effectively, which improves the appearance of the top-layer icons and windows. Icons are also supposed to be sharper and more defined, with new refraction features for developers to take advantage of. </p><p>That is a lot of stuff to change, but how noticeable are these improvements compared to last year?</p><h2 id="how-things-have-actually-changed-to-liquid-glass-in-ios-27-beta">How things have actually changed to Liquid Glass in iOS 27 beta</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bGoJ2Eh8V8CE9HmVq7FNZF" name="LG clear" alt="liquid glass comparison ios 27 vs ios 26" src="https://cdn.mos.cms.futurecdn.net/bGoJ2Eh8V8CE9HmVq7FNZF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Upon loading up the iOS 27 beta on my iPhone 17 Pro Max, I don't think I could have pointed out any big differences in the way Liquid Glass looks. Other than the<a href="https://www.tomsguide.com/phones/iphones/ios-27-has-a-hidden-liquid-glass-slider-here-is-how-to-find-and-use-it"> new slider menu</a>, of course, since iOS 27 brought it up during the initial boot-up process.</p><p>Looking closely, a lot of the effects are quite subtle, but when you know what to look for, they end up being the kind of changes that you just can't unsee. The first thing I noticed was that the transparency effects seem to have been ramped up for the iOS 27 beta.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uDgFc9NnZQpRqmXaGEAKYF" name="LG app drawer" alt="liquid glass comparison ios 27 vs ios 26" src="https://cdn.mos.cms.futurecdn.net/uDgFc9NnZQpRqmXaGEAKYF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Even with all the transparency switched on, Liquid Glass on iOS 26 retains a frosted glass-looking effect on transparent windows and icons. The iOS 27 beta makes these a lot more transparent, which means you can actually see what's supposed to be in the background with greater clarity. Whether it's the design of my couch or text that happens to be visible underneath, it's all a lot clearer.</p><p>Though there is still something of a warping effect in places, as though you're not quite looking through perfectly smooth glass.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="f2oRYdw8P9Fw4zkzQrZMYF" name="LG search" alt="liquid glass comparison ios 27 vs ios 26" src="https://cdn.mos.cms.futurecdn.net/f2oRYdw8P9Fw4zkzQrZMYF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The extra clarity works really well in a lot of places, notably the app list, since it means the screen isn't dominated by a blurry version of your background, but there are instances where it doesn't really work. </p><p>The search bar at the bottom of the home screen really stood out to me, since it's almost invisible and quite hard to read in iOS 27. In iOS 26, the frosted background makes it stand out much more clearly, with the small size not affecting the rest of your viewing experience. Personally, I also prefer the lesser transparency in other in-app menus, notably the camera app. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fhsNFxLCpNBhpUUQpHWoYF" name="lgglow" alt="liquid glass comparison ios 27 vs ios 26" src="https://cdn.mos.cms.futurecdn.net/fhsNFxLCpNBhpUUQpHWoYF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>iOS 26's icons are also a lot brighter, with a glowing effect that feels rather distracting. For an app like Google Photos, it makes the whole icon look like it's appearing in some kind of religious vision in a Hollywood movie. The iOS 27 icon still glows a little bit, but that's the actual design Google rolled out for the app — it even makes an appearance on Android phones.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2rLF9GtPaFRRN2bx5u7tLF" name="tinted" alt="liquid glass comparison ios 27 vs ios 26" src="https://cdn.mos.cms.futurecdn.net/2rLF9GtPaFRRN2bx5u7tLF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The tinted effect is a lot more pronounced with the iOS 27 beta, too, which is beneficial for those people like me who still don't like the tweaked Liquid Glass design. There never seemed to be much of a difference when you set Liquid Glass to tinted in iOS 26, but that's no longer the case. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qAa6VkwzQCT6cLW9aL2VAF" name="LG slider" alt="liquid glass comparison ios 27 vs ios 26" src="https://cdn.mos.cms.futurecdn.net/qAa6VkwzQCT6cLW9aL2VAF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Not only does iOS 27's increased transparency make the contrast between the two extremes more noticeable, but there's also a stronger tint this time around. Apple's also done things in such a way that it blocks out the background elements, rather than simply blurring them.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X16z2e"></div>                            </div>                            <script src="https://kwizly.com/embed/X16z2e.js" async></script><h2 id="outlook-2">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Z5AREXkHH3WuxG2NVDBMVA" name="iOS 27" alt="iOS 27 logo on iPhone" src="https://cdn.mos.cms.futurecdn.net/Z5AREXkHH3WuxG2NVDBMVA.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple/Shutterstock)</span></figcaption></figure><p>It's clear that the changes Apple has made to Liquid Glass for the iOS 27 beta aren't just token alterations to try and appease critics until they get used to the new design. The alterations are quite subtle, but it does seem as though Apple cares whether people like the look of iOS — even if it means toning down some of the design elements that appeared last year.</p><p>Whether this is enough to satisfy Liquid Glass's harshest critics isn't clear. Personally, I still don't like all the transparency effects Apple has employed. Even with tinting set to maximum, it doesn't quite beat the opaque menus that are ubiquitous on other software platforms. While I appreciate the fact that Apple is making Liquid Glass look nicer, I still don't see the appeal of having transparent icons and windows all over the place. But that's just my opinion.</p><p>I assume Apple will continue to tweak Liquid Glass over the coming months, ahead of the release of the stable version of iOS 27 this fall. That's how beta testing works, and it's likely that the Liquid Glass we see now isn't going to stick around forever. However, as the design stands now, I definitely see some improvements to the look of iOS, even if it's not something I actually like using.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/apple-finally-brings-built-in-drawing-tools-to-ios-27-messages-heres-how-to-try-it">Apple finally brings built-in drawing tools to iOS 27 Messages — here's how to try it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-ceo-tim-cook-confirmed-price-hikes-are-unavoidable-so-get-ready-to-pay-more">Apple CEO Tim Cook confirmed price hikes are 'unavoidable' — so get ready to pay more</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-20-may-come-with-two-different-screen-sizes-and-launch-alongside-iphone-ultra-2">iPhone 20 may come with two different screen sizes — and launch alongside iPhone Ultra 2</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I spent a week with Siri AI — here are my honest pros and cons ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons</link>
                                                                            <description>
                            <![CDATA[ Apple says iOS 27 runs much smoother than iOS 26 — we put it to the test. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">onCU6ky8Nsu67KfM7Qcg7a</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vd4AMmAxn8MgQeFJtcEy57-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 20 Jun 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/vd4AMmAxn8MgQeFJtcEy57-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Siri AI on iPhone]]></media:description>                                                            <media:text><![CDATA[Siri AI on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[Siri AI on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vd4AMmAxn8MgQeFJtcEy57-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Ever since I started using <a href="https://www.tomsguide.com/ai/google-gemini/google-gemini-everything-you-need-to-know">Google Gemini</a> more than a year ago, it’s transformed the way I use some of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a> on the market. But now that Apple is finally stepping up in the AI wars with its revamped <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a> in <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a>, it’s moving past an outdated experience to give us something truly intelligent — an assistant that doesn’t just listen, but actually understands.</p><p>I’ve been using the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developer beta</a> for a week now, which grants access to a beta version of Siri AI. Because I test many of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a> for a living, my expectations for this upgraded AI chatbot are naturally high after spending so much time with rivals like ChatGPT and Gemini.</p><p>Obviously, there’s still a long way to go before Siri AI is polished enough for the masses — but I can already tell you that the outlook is bright for iPhone users. Here’s why.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="on-screen-contextual-awareness-it-s-a-smart-step-forward">On-screen contextual awareness: It’s a smart step forward</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1794px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="iopeLDvPGawviRJFdMxca5" name="iOS 27 Siri AI" alt="iOS 27 Siri AI running on iPhone 17 Pro." src="https://cdn.mos.cms.futurecdn.net/iopeLDvPGawviRJFdMxca5.jpg" mos="" align="middle" fullscreen="" width="1794" height="1009" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>This is easily the first thing I noticed when I started using Siri AI on my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a>. No matter what I’m doing, it feels like it's aware of what’s on my screen and tries to create actionable tasks based on it. I say "tries" because it’s not always spot on.</p><p>For example, it will suggest creating a reminder inside Messages, but when I select it, I’m still required to manually input all the details. For a supposedly advanced AI, I would think it’d be smart enough to handle the typing for me — but it isn’t, at least not in this beta.</p><p>Despite this limitation, there are other areas where Siri AI is incredibly helpful. When I’m going through emails in either the native Mail app or Gmail, I can lean on Siri AI to quickly create calendar events. It works just like Gemini, analyzing the email’s content and pulling all the pertinent information straight into the calendar invite.</p><p>It's a similar story when using the updated Camera app in iOS 27, which combines <a href="https://www.tomsguide.com/phones/iphones/apple-intelligences-best-feature-gains-new-powers-in-ios-26-whats-new-with-visual-intelligence">Visual Intelligence</a> with Siri AI to give me details about whatever I'm pointing my lens at — whether it's an unfamiliar weed in my backyard or the specific type of fuel required for the car I'm testing. While it’s great at serving up relevant information, it still lacks the fluid, continuous conversational experience I get with Gemini Live or Meta AI. And it stumbles a lot with follow up questions, but I can't stress enough how it's in beta.</p><h2 id="dedicated-siri-app-keeps-my-requests-contained">Dedicated Siri app keeps my requests contained</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="AQd9M94gYxf4QcSgTUG2vD" name="Siri AI - app" alt="Siri AI app screenshots." src="https://cdn.mos.cms.futurecdn.net/AQd9M94gYxf4QcSgTUG2vD.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple has introduced a dedicated Siri app that acts as a hub to organize all of my past requests, ongoing AI tasks, and contextual history. It’s a clean, well-designed space that lets me easily jump back into a previous request to follow up on a project.</p><p>For everyday tasks, like checking my grammar or researching a topic deeper, I’ve found it pretty reliable. In one instance, I asked Siri AI to scan one of my electric car reviews on the site to pull efficiency results for a specific model — the <a href="https://www.tomsguide.com/vehicle-tech/evs/2026-audi-rs-etron-gt-review">2026 Audi RS e-tron GT</a> — and compare it to the <a href="https://www.tomsguide.com/vehicle-tech/evs/2025-lucid-air-touring-pros-and-cons">Lucid Air Touring</a> I also tested. To my amazement, it handled all the research flawlessly with accurate results, saving me a tremendous amount of time I'd otherwise spend manually pulling up the pages in Safari.</p><p>However, the gap widens when you push the app's creative boundaries. I’m big on using AI chatbots for photo editing, specifically for removing backgrounds or requesting complex generative edits. I gave Siri AI a photo of the <a href="https://www.tomsguide.com/vehicle-tech/evs/2026-subaru-trailseeker-review">Subaru Trailseeker</a> and asked it to change the background to a beach setting, but it couldn’t execute the request — nor could it handle basic photo adjustments within the Siri app interface.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="9dB5g3MM9zRJLK94vL6tCT" name="Gemini app - infographic" alt="Gemini app infographic." src="https://cdn.mos.cms.futurecdn.net/9dB5g3MM9zRJLK94vL6tCT.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>By contrast, with the Gemini app on my iPhone, I can upload a PDF of a car’s monroney window sticker and ask it to instantly generate a clean infographic summarizing the specs and pricing. While Gemini continues to impress me with what it delivers, the same request to Siri AI hit a brick wall, with the assistant simply unable do it. These are the kinds of missing capabilities that keep me tethered to third-party tools like Gemini, and it's something Apple desperately needs to address down the road.</p><h2 id="task-automation-is-still-restricted-to-native-apps">Task automation is still restricted to native apps</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="wAE8fFX7aja8bXcvUbNBYC" name="Siri AI - automation" alt="Siri AI automation screenshots." src="https://cdn.mos.cms.futurecdn.net/wAE8fFX7aja8bXcvUbNBYC.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If there’s one feature that truly proves how far mobile intelligence has come over the last few years, it’s <a href="https://www.tomsguide.com/ai/google-gemini/gemini-now-rivals-chatgpt-in-another-key-feature-heres-how-to-schedule-ai-tasks">Gemini’s task automation</a> — which, in my opinion, remains the absolute gold standard. To put it into perspective: I recently used my <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a> to ask Gemini to <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-asked-gemini-on-the-galaxy-s26-to-order-dunkin-donuts-for-me-and-24-minutes-later-it-got-delivered-to-my-door">order me a coffee and a donut from Dunkin’ via DoorDash</a>. With a single voice command, the assistant handled the entire checkout process for me — though it did take over two minutes to execute.</p><p>Naturally, I wanted to put Siri AI to the exact same test on my iPhone, but it failed to deliver. This level of cross-app execution simply isn't possible right now, largely because third-party developers have yet to build out the necessary integrations to let Siri take the wheel. For the time being, Siri AI’s automation capabilities are strictly confined to Apple's native apps, which acts as a massive handicap for the revamped assistant.</p><p>Then again, this limitation isn't entirely surprising. When Samsung debuted its <a href="https://www.tomsguide.com/phones/android-phones/i-tested-the-samsung-galaxy-s25s-gemini-cross-app-actions-heres-how-it-went">Cross App Actions</a> with the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s25-review">Galaxy S25</a> last year, it was similarly restricted to native applications out of the gate. While it’s understandable that Siri AI is trapped in the same early-stage predicament, the bar has already been set by Google. Apple simply cannot afford to trail the competition for long.</p><h2 id="outlook-3">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4261px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4cqirDCAJYjLWj5tj4aAt6" name="iOS 27 Siri AI" alt="iOS 27 Siri AI running on iPhone 17 Pro." src="https://cdn.mos.cms.futurecdn.net/4cqirDCAJYjLWj5tj4aAt6.jpg" mos="" align="middle" fullscreen="" width="4261" height="2397" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Ultimately, my week’s worth of using Siri AI proves that Apple has built a solid foundation. The contextual awareness is a massive leap forward compared to old Siri, and the system-wide integration feels incredibly polished. But as it stands today, it’s simply nowhere near as robust, versatile, or capable as Google Gemini.</p><p>Being in beta clearly emphasizes how a lot can change with the experience as developers get their hands on Siri AI integration. This is a promising start to a new era for Apple, but if you’re looking for a true powerhouse AI assistant to revolutionize your entire digital workflow, I don’t think you'll be abandoning Gemini just yet.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evLgmO"></div>                            </div>                            <script src="https://kwizly.com/embed/evLgmO.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/i-tried-ios-27-clean-up-vs-galaxy-ai-photo-assist-in-a-7-round-test-and-i-was-surprised-with-how-close-it-was">I pitted iOS 27 Clean Up vs Galaxy AI in a 7-round eraser showdown — Apple makes it close, but here's where it stumbles</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/siri-ai-will-shoot-down-any-attempts-to-try-and-date-it-but-other-chatbots-arent-always-so-forthright">Siri AI will shoot down any attempts to try and date it — but other chatbots aren't always so forthright</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple CEO Tim Cook confirmed price hikes are 'unavoidable' — so get ready to pay more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/apple-ceo-tim-cook-confirmed-price-hikes-are-unavoidable-so-get-ready-to-pay-more</link>
                                                                            <description>
                            <![CDATA[ Apple's being hit hard by the RAM and storage shortages, and that means prices are going to go up. We just don't know when. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xLjSQiixt7BrMwCXwpEhe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CdTtQuj4TKzWRHKDdBQ8EE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 11:00:47 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/CdTtQuj4TKzWRHKDdBQ8EE-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tim Cook holding an iPhone 17 Pro Max]]></media:description>                                                            <media:text><![CDATA[Tim Cook holding an iPhone 17 Pro Max]]></media:text>
                                <media:title type="plain"><![CDATA[Tim Cook holding an iPhone 17 Pro Max]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CdTtQuj4TKzWRHKDdBQ8EE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Back in May, Apple CEO Tim Cook confirmed that the company was having to deal with <a href="https://www.tomsguide.com/phones/iphones/apple-confirms-significantly-higher-memory-costs-and-that-means-iphone-and-mac-price-hikes-are-almost-certainly-on-the-way">"significantly higher memory costs" </a>that likely meant price hikes would be happening in the near future. Now, speaking to the <a href="https://www.wsj.com/tech/apple-price-increases-memory-supply-199845b1?mod=hp_trendingnow_article_pos2" target="_blank">Wall Street Journal</a>, Cook has confirmed that those price hikes are going to happen.</p><p>"Unfortunately, price increases are unavoidable,” Cook said to the WSJ. “We’re doing our best to mitigate the huge increases that are being passed to us, and we’ve been trying to shield our customers from the increases, but the situation has become unsustainable.” </p><p>Cook also confirmed that memory and storage costs are issues for Apple at the moment, particularly the DRAM which is being increasingly used by AI servers. “There’s less supply at a time when consumers want devices and the memory guys are passing along huge price increases,” he said “We definitely need memory pricing and supply to return to reasonable levels for consumer products. That’s the bottom line.” </p><p>Cook didn't offer any specifics about future price increases, though. So we have no idea when they might happen, which devices will be affected, or how much more money Apple will ask people to pay.</p><h2 id="apple-price-hikes-what-we-know">Apple price hikes — what we know</h2><p>We've already seen at least one relative price increase, with Apple <a href="https://www.techradar.com/computing/apples-mac-mini-now-has-a-higher-starting-price-as-it-discontinues-the-entry-level-model-and-slides-down-to-the-mid-range" target="_blank">scrapping </a>the $599 <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a> with 256GB of storage. That means the cheapest Mac mini you can currently buy is the $799 model with 512GB of storage space.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NPkgT3FdyUHiFWrEfxaAZo" name="Mac mini M4-05-LIST2" alt="The Mac mini M4 on top of a desk riser shelf" src="https://cdn.mos.cms.futurecdn.net/NPkgT3FdyUHiFWrEfxaAZo.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The 256GB Mac Mini M4 was scrapped by Apple. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It's possible that price hikes could happen as early as this September, with the release of the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18 Pro</a> and foldable iPhone Ultra. The iPhone 18 Pro and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">Pro Max</a> are both expected to come with at least 12GB of RAM, and with the cost of RAM skyrocketing, it wouldn't be surprising to see the current prices rise to compensate.</p><p>There have been rumors that the standard <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18</a> could <a href="https://www.tomsguide.com/phones/iphones/iphone-18-tipped-for-cost-cutting-downgrades-heres-what-we-know">limit the amount of RAM to help cut costs</a>, but I don't see that happening with the Pro models. Apple has already confirmed that <a href="https://www.tomsguide.com/phones/iphones/only-the-iphone-17-pro-and-iphone-17-air-get-apples-most-powerful-on-device-apple-intelligence-model-heres-what-that-means">12GB of memory is required</a> to access all the newest <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a> and Apple Intelligence features, and it would be a very bad look if the newest Pro-tier iPhones weren't able to access them all.</p><p>Cook confirmed that Apple is prepared to use its cash reserves to help boost the supply of memory, and noted that more capacity is needed — even if it means potentially loosening restrictions about Chinese RAM providers. However, Cook also confirmed that it wouldn't be building its own production facilities to mitigate the damage caused by RAMageddon. “We can’t do everything,” said Cook. “We know what we’re good at.” </p><p>Apple used to have a lot of purchasing power, which it utilized to leverage cheaper prices for the many components it needs. If it's feeling the squeeze of the memory shortages, then things must be pretty bad. Apple may not be willing to confirm when price hikes will happen, but it's important that we all prepare ourselves to have to pay even more for our fruit-themed devices.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-3-new-ios-27-ai-tools-that-will-instantly-save-your-ruined-photos">The 3 new iOS 27 AI tools that will instantly save your ruined photos</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-20-may-come-with-two-different-screen-sizes-and-launch-alongside-iphone-ultra-2">iPhone 20 may come with two different screen sizes — and launch alongside iPhone Ultra 2</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iOS 27 has a new ‘Liquid Glass’ slider — here's how to find it and use it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/ios-27-has-a-hidden-liquid-glass-slider-here-is-how-to-find-and-use-it</link>
                                                                            <description>
                            <![CDATA[ Forget the old presets: iOS 27 fixes a major iPhone customisation complaint by introducing a 'liquid glass' slider. Here is how to unlock total control. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JWnr9JN2AhiyAovUPQaoJP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aygmtQLWrQo6eSTgUyZSCc-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 06:15:00 +0000</pubDate>                                                                                                                                <updated>Fri, 19 Jun 2026 12:21:05 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/aygmtQLWrQo6eSTgUyZSCc-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Liquid Glass slider at WWDC 2026]]></media:description>                                                            <media:text><![CDATA[Liquid Glass slider at WWDC 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Liquid Glass slider at WWDC 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aygmtQLWrQo6eSTgUyZSCc-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple’s Liquid Glass design gave the iPhone a sleek, frosted aesthetic in <a href="https://www.tomsguide.com/phones/iphones/ios-26s-new-liquid-glass-icons-are-here-how-to-enable-them-on-your-iphone">iOS 26,</a> but the rigid preset options left many users wanting more control. Fortunately, <a href="https://www.tomsguide.com/phones/iphones/ios-27-11-biggest-features-coming-to-your-iphone">iOS 27</a> addresses this by replacing those old presets with a continuous customization slider. </p><p>This new tool gives you granular control over the transparency and tint of blurred interface elements across the entire operating system. Whether you want a completely clear view of your wallpaper or a heavy, high-contrast tint that improves text readability, you can now dial in your exact preference. </p><p>Here is how to find and use the new feature.</p><h2 id="you-ll-need-to-be-running-ios-27">You'll need to be running iOS 27 </h2><p>Because iOS 27 is currently in its early testing phase, you will need the developer beta installed to access this feature. If you aren't enrolled yet, you can sign up for free via the Apple Developer Program. </p><p>Otherwise, if you've downloaded a beta in the past, simply head to <strong>Settings, General,  Software Update, and Beta Updates</strong> on your iPhone to toggle it on.</p><section class="howto-block">                    <h3>Where to find the Liquid Glass slider on iPhone </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/ZxkUxkMi34qHPLFn5Tp2CZ.jpg"                                        alt="Liquid glass settings on iPhone"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/ZxkUxkMi34qHPLFn5Tp2CZ.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Locating the new control takes only a moment. First,<strong> open the Settings app on your iPhone and scroll down to select the Appearance menu</strong>. Then <strong>tap Liquid Glass. </strong></p><p>Inside this section, you will see the new Liquid Glass slider prominently displayed where the old "Clear" and "Tinted" toggle buttons used to live.</p></p>                </section><section class="howto-block">                    <h3>How to adjust the Liquid Glass slider </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/UQ98FkNG6uR8qoVpLAYRAn.jpg"                                        alt="Liquid glass slider in iOS 27 highlighted "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/UQ98FkNG6uR8qoVpLAYRAn.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Operating the slider is incredibly intuitive because the interface updates in real time as you interact with it. </p><p>To use it, <strong>simply drag the slider to the left to increase transparency, or slide it to the right to increase the depth of the tint</strong>. </p><p>Because the spectrum is entirely continuous, you can stop at any point to achieve a perfectly balanced middle-ground setting. As you move your finger, keep an eye on the background of the Settings app itself to preview exactly how the system-wide blur is reacting. </p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eJk2yW"></div>                            </div>                            <script src="https://kwizly.com/embed/eJk2yW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again">This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again</a></li><li><a href="https://www.tomsguide.com/phones/iphones/airpods-finally-get-a-custom-eq-in-ios-27-here-is-how-to-fix-your-sound">AirPods finally get a custom EQ in iOS 27 — here is how to fix your sound</a></li><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The 3 new iOS 27 AI tools that will instantly save your ruined photos ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/the-3-new-ios-27-ai-tools-that-will-instantly-save-your-ruined-photos</link>
                                                                            <description>
                            <![CDATA[ iOS 27 adds three AI-powered editing tools to the Photos app that fix common photo mistakes without needing a third-party editor. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uAvmGihTWibWAKHSbKKxMa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 logo on iPhone]]></media:description>                                                            <media:text><![CDATA[iOS 27 logo on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 logo on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've taken thousands of photos, and, because I'm not a photographer, almost all of them have one small problem. The horizon tilts slightly left. My subject is too far away. Someone's elbow creeps into the frame at the last second. Normally I'd either accept the imperfect shot or spend time in a editing app trying to fix it. iOS 27 changes that entirely. </p><p>Apple's built three editing tools directly into Photos that solve these exact problems. Of course, as this is Apple Intelligence, it won't always fix everything perfectly — but they handle the most common photo mistakes remarkably well.</p><p>You'll need the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 beta </a>running on your iPhone to access them right now. Here's what's new in your Photos app. </p><section class="howto-block">                    <h3>1. How to use Reframe to fix camera angles</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/oksPjbgUoqJiipkNJDeGWH.jpg"                                        alt="How to Reframe photos in iOS 27 on iPhone"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/oksPjbgUoqJiipkNJDeGWH.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Reframe solves the problem of imperfect framing that you can't fix by retaking the shot. You got the moment, but the angle was slightly off, or a sign crept into the top of a portrait. </p><p><strong>Open your photo in the Photos app and enter editing mode</strong>. Next, tap tools and <strong>choose Reframe</strong>. <strong>Then touch and drag the image to shift the perspective</strong> as if you'd physically moved the camera before pressing the shutter. </p><p>A blur appears around the edges of the original image as you move it. When you find the perspective you prefer,<strong> tap Save</strong>. Apple's AI automatically generates new content to fill in those gaps, keeping the result consistent with the scene. </p></p>                </section><section class="howto-block">                    <h3>2. How to use Extend to add missing space</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/DWkaP5iCxiuWmtzhezpkS6.jpg"                                        alt="How to extend Photos on iPhone in iOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/DWkaP5iCxiuWmtzhezpkS6.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Extend lets you add space around image edges that wasn't there when you took the photo. This solves tight crops where you couldn't back up far enough. It also fixes tilted horizons by extending the top or bottom of a landscape shot, giving the AI more room to level things out. </p><p><strong>Open the photo in editing mode and select Extend </strong>from the Apple Intelligence Tools. The interface lets you <strong>pinch and drag the edges of the image</strong>. Apple's AI understands what should fill those spaces and generates matching content. </p><p>You can adjust how much you extend on each side.</p></p>                </section><section class="howto-block">                    <h3>3. How to use the upgraded Clean Up tool</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/jvApU88Bdwtis85TknE3zk.jpg"                                        alt="How to use upgraded Clean Up in iOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/jvApU88Bdwtis85TknE3zk.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Cleanup removes unwanted objects from photos. The iOS 27 version handles complex backgrounds far better than the previous version. A photobomber's elbow. A trash can in the background. A distraction you didn't notice until you reviewed the photo later. The upgraded Cleanup tool tackles these scenarios more accurately.</p><p><strong>Select Clean Up </strong>from the Apple Intelligence Tools in editing mode. <strong>Tap the object you want to remove</strong>. The AI analyzes the background and surrounding content, then fills in the space with contextually appropriate detail. </p><p>For simple backgrounds, Cleanup works instantly. Complex scenes with texture, shadows, and multiple elements now process more accurately thanks to improved AI recognition.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eJk2yW"></div>                            </div>                            <script src="https://kwizly.com/embed/eJk2yW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again">This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again</a></li><li><a href="https://www.tomsguide.com/phones/iphones/airpods-finally-get-a-custom-eq-in-ios-27-here-is-how-to-fix-your-sound">AirPods finally get a custom EQ in iOS 27 — here is how to fix your sound</a></li><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The iPhone 16e just crashed to $10 ahead of Prime Day in this epic deal ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/this-98-percent-off-iphone-16e-deal-is-your-ticket-to-getting-siri-ai-on-a-budget</link>
                                                                            <description>
                            <![CDATA[ Cricket Wireless is offering a whopping 98% off instant discount on the iPhone 16e, making this $10 model the cheapest way to experience Siri AI when it launches. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6hGiSH5MwQnZ7H6ktYtcvf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7EEf4DdcKYF5PEvExXMRaF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Jun 2026 15:44:24 +0000</pubDate>                                                                                                                                <updated>Wed, 17 Jun 2026 21:02:13 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7EEf4DdcKYF5PEvExXMRaF-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 16e held in hand with deal badge.]]></media:description>                                                            <media:text><![CDATA[iPhone 16e held in hand with deal badge.]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 16e held in hand with deal badge.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7EEf4DdcKYF5PEvExXMRaF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With Apple teasing us all about what’s in store for iOS 27, I’m stoked about the new Apple Intelligence features and Siri AI. The latter is especially important because not all iPhones are going to get it, which is why this iPhone 16e deal is your cheapest way of getting it.</p><p>For a limited time, <a href="https://www.cricketwireless.com/shop/smartphones/apple-iphone-16e-128gb-black" target="_blank" rel="nofollow">Cricket Wireless has the iPhone 16e down to $9.99</a> — a substantial discount compared to its $599 retail cost. But in order to get it, you’ll need to port in an existing number and prepay for service. You’re looking at $60 each month for its Supreme Unlimited Plan, which comes out to an upfront $180 cost for the required service. All told, your out-of-pocket cost to get an iPhone 16e that will support Siri AI is $190.</p><ul><li><strong></strong><a href="https://www.cricketwireless.com/current-phone-and-plan-deals" target="_blank" rel="nofollow"><strong>shop all cell phone deals at Cricket Wireless</strong></a><strong></strong></li></ul><div class="product"><a data-dimension112="9ad5b1f8-7fb7-4dae-8685-75f5bd84e4ff" data-action="Deal Block" data-label="Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. Your total at checkout will come out to be $190 plus tax." data-dimension48="Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. Your total at checkout will come out to be $190 plus tax." data-dimension25="$10" href="https://www.cricketwireless.com/shop/smartphones/apple-iphone-16e-128gb-black" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6XDDGA8kCSFrs9m2vXphbQ" name="iphone16e-bb" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6XDDGA8kCSFrs9m2vXphbQ.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. Your total at checkout will come out to be $190 plus tax.<a class="view-deal button" href="https://www.cricketwireless.com/shop/smartphones/apple-iphone-16e-128gb-black" target="_blank" rel="nofollow" data-dimension112="9ad5b1f8-7fb7-4dae-8685-75f5bd84e4ff" data-action="Deal Block" data-label="Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. Your total at checkout will come out to be $190 plus tax." data-dimension48="Pick up the iPhone 16e with $590 off the original price at Cricket Wireless. All you need to do to get the full discount is port an existing number and prepay three months of its $60/month Supreme Unlimited plan. Your total at checkout will come out to be $190 plus tax." data-dimension25="$10">View Deal</a></p></div><p>I really like this deal for a number of reasons. For starters, it’s in an exclusive club of devices that will get <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a> when it launches. That’s a big deal because Apple’s assistant is getting a tremendous upgrade that will allow it to do things it has never done before — like being able to take more actions in apps, understand your personal context to get you relevant results, feature a dedicated Siri app, and much more.</p><p>Siri AI is going to make the iPhone 16e feel like a totally new device when it launches later this year, but this Cricket Wireless deal is still worth getting for all the other <a href="https://www.tomsguide.com/ai/apple-intelligence-all-the-major-announcements-made-at-wwdc-2026">Apple Intelligence features</a> that are coming with <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a>. For example, I’ve already tested the improvements made to its <a href="https://www.tomsguide.com/phones/i-tried-ios-27-clean-up-vs-galaxy-ai-photo-assist-in-a-7-round-test-and-i-was-surprised-with-how-close-it-was">Photo Clean Up tool</a> — which I pointed out when I compared the <a href="https://www.tomsguide.com/phones/iphones/i-tested-the-new-ai-photo-clean-up-on-ios-27-vs-ios-26-and-its-shockingly-better">iOS 26 vs iOS 27 versions</a>.</p><p>Beyond the software features, I mentioned in my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16e-review">iPhone 16e review</a> that I like it for its compact size and svelte construction. And despite having only a single rear camera, I’ve shown in my countless photo face-offs, like against the <a href="https://www.tomsguide.com/phones/i-shot-over-200-photos-with-the-pixel-9a-vs-iphone-16e-heres-the-winner">Pixel 9a</a>, that it still delivers outstanding results. I’m most surprised by its low-light camera performance because it makes pitch-dark scenes look like they're lit by some nearby light source.</p><p>Finally, I think it’s worth mentioning how long you’ll need to wait before the phone gets unlocked. <a href="https://www.cricketwireless.com/legal-info/device-unlock-policy.html" target="_blank">Cricket Wireless</a> explicitly states that “the device you want to unlock must have been active for at least 6 months of paid service on that device.” Since this iPhone 16e deal comes with three months of upfront service, you’ll need to tack on an additional three months to get it unlocked. You can technically “downgrade” to its $40/month Select Unlimited plan to lower your monthly cost until you hit that mark.</p><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find deals fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">Editor approved deals from across all our categories\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');          if (!this.cdWrapper) return;                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsU25lYWtlcnMsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrcyxDUlogWW9nYSxXaW5rQmVkcyxCbGFjayBhbmQgRGVja2VyLFJpbmdjb25uLENNRixFdWZ5LFNhbXN1bmcsTWljcm9zb2Z0LFJlTWFya2FibGUsQWxpZW53YXJlLCwsDQoxMSwsLEJyb29rcyxUaGUgR3ltIFBlb3BsZSxCcm9va2x5biBiZWRkaW5nLE5lc3ByZXNzbywsMU1vcmUsQXJsbywsUmF6ZXIsLENvcnNhaXIsLCwNCjEyLCwsQ3JvY3MsLEVpZ2h0IFNsZWVwLEN1aXNpbmFydCwsSkJMLCwsLCxIUCwsLA0KTm90ZXMsLCwsLCwsLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIGJpZ2dlc3QgJS8kIGRpc2NvdW50LCBUdnMgd2l0aCB+NTAlIG9mZiBoYXZlIGJlZW4gdGhlIG1vc3QgcG9wdWxhciBldmVuIGlmIHRoZXkgYXJlIHN0aWxsIGV4cGVuc2l2ZSIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZC9yZWNvZ25pc2FibGUgc2hvZXMiLCJObyBwYXR0ZXJuIHRvIHByaWNpbmcvZGlzY291bnQsIHJlYWRlcnMgbWFpbmx5IHNob3AgYnkgYnJhbmQiLCJBIGxhYmVsIHdpbGwgZGVmaW5pdGVseSBoZWxwIGhlcmUgZS5nLiBiZXN0IGZvciBzaWRlIHNsZWVwZXIsIGJlc3QgbWVtb3J5IGZvYW0iLCJBcHBsaWFuY2VzIGlzIGEgYmlnIGNhdGVnb3J5LCBpcyBpdCBwb3NzaWJsZSB0byBzcGxpdCBpbnRvIGtpdGNoZW4gYXBwbGlhbmNlcywgZmxvb3JjYXJlLCBhaXIgaGVhbHRoL2Nvb2xpbmc/IE9yIHNpbWlsYXIiLCJGb2N1cyBvbiB2YWx1ZSBmb3IgbW9uZXksIEdhcm1pbnMgd2l0aCB+NTAlIG9mZiBoYXZlIGJlZW4gcG9wdWxhciBldmVuIHRob3VnaCB0aGV5IGFyZSBzdGlsbCAkNTAwIiwsLCwsSW5jbHVkZSBLaW5kbGVzLEkgd291bGQgaW5jbHVkZSB3aWZpIHJvdXRlcnMgaGVyZSBpbnN0ZWFkIG9mIHNtYXJ0IGhvbWUsQ2FuIHdlIHN1cmZhY2UgcGhvbmUgcHJvdmlkZXIgZGVhbHM/IFQtbW9iaWxlIGFuZCB2ZXJpem9uIHdvdWxkIG1ha2UgYSBsb3QgbW9yZSBtb25leSB0aGFuIEFtYXpvbiwsDQosLGhhdmluZyBhICdiZXN0IGZvcicgbGFiZWwgd291bGQgYmUgaGVscGZ1bCBlLmcuIGJlc3QgZm9yIGJyaWdodCByb29tLENhbiB3ZSBzdG9wIGtpZHMgc2hvZXMgZnJvbSBwdWxsaW5nIHRocm91Z2g/LCJXaWxsIHRoaXMgaW5jbHVkZSBhY2Nlc3NvcmllcyBlLmcuIGNhcHMsIGJhZ3MsIGlmIHNvIG1ha2Ugc3VyZSB0aGVzZSBhcmUgbWl4ZWQgdGhyb3VnaG91dCBjbG90aGluZyBkZWFscyIsV2lsbCB0aGlzIGluY2x1ZGUgdG9wcGVycyBhbmQgcGlsbG93cz8gU2VlaW5nIG1vcmUgbW9tZW50dW0gd2l0aCB0aGlzIGNhdGVnb3J5IHJlY2VudGx5IHNvIGEgYmVkZGluZyB0YWIgbWlnaHQgd29yaywsIk5lZWQgdG8gbWFrZSBzdXJlIGJhbmRzLCBzY3JlZW4gcHJvdGVjdG9ycyBldGMuIGRvbid0IHB1bGwgaW50byBoZXJlIiwsLCwsLCwsLA0KLCwiUHJpb3JpdGlzZSA2NScnIGFuZCA1NScgaW5jaCBUVnMsIHRoZW4gYmlnZ2VyIHNjcmVlbnMgYmVmb3JlIHRoZSBzbWFsbGVyIHNpemVzIiwsLFF1ZWVuIGlzIHRoZSBtb3N0IHBvcHVsYXIgc2l6ZSBpbiB0aGUgVVMgLSBwcmlvcml0aXNlIGRlYWxzIGZvciB0aGlzIHNpemUsLCwsLCwsLCwsLA0KLCwsLCwsLCwsLCwsLCwsLA0KQ2F0ZWdvcmllcyB0byBjb25zaWRlciwsUHJvZHVjdHMgaW5jbHVkZWQsLCwsLCwsLCwsLCwsLA0KVW5kZXIgJDUwPywsQWlyIHRhZ3MsLCwsLCwsLCwsLCwsLA0KLCxQb3J0YWJsZSBjaGFyZ2Vycy93aXJlbGVzcyBjaGFyZ2VycywsLCwsLCwsLCwsLCwsDQosLCJXYXRlciBib3R0bGVzIChzdGFubGV5cywgT3dhbGEsIEh5ZHJvIGZsYXNrLCBZZXRpKSIsLCwsLCwsLCwsLCwsLA0KLCxIYW5kIGhlbGQgZmFucywsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpob21lIG9mZmljZSwsb2ZmaWNlIGNoYWlycywsLCwsLCwsLCwsLCwsDQosLHN0YW5kaW5nIGRlc2tzLCwsLCwsLCwsLCwsLCwNCiwsbW9uaXRvcnMsLCwsLCwsLCwsLCwsLA0KLCxLZXlib2FyZHMsLCwsLCwsLCwsLCwsLA0KLCxkb2NraW5nIHN0YXRpb24sLCwsLCwsLCwsLCwsLA0KLCwsLCwsLCwsLCwsLCwsLA0KR2FtaW5nLCxDb25zb2xlcywsLCwsLCwsLCwsLCwsDQosLEFjY2Vzc29yaWVzLCwsLCwsLCwsLCwsLCwNCiwsR2FtZXMsLCwsLCwsLCwsLCwsLA0KLCxDb3VsZCBpbmNsdWRlIExlZ28/LCwsLCwsLCwsLCwsLCw=")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                if(!r) return;                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone 20 may come with two different screen sizes — and launch alongside iPhone Ultra 2 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/iphone-20-may-come-with-two-different-screen-sizes-and-launch-alongside-iphone-ultra-2</link>
                                                                            <description>
                            <![CDATA[ 2027 could be a very big year for iPhones, with two anniversary models and a new foldable tipped for reveal. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">weNXZFBBR2ptPacukALQsa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Jun 2026 10:47:12 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1280-80.jpg">
                                                            <media:credit><![CDATA[AppleTrack]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 20 render]]></media:description>                                                            <media:text><![CDATA[iPhone 20 render]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 20 render]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We know that 2026 is going to be a big year for iPhones, thanks to the upcoming release of the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a>, but 2027 is shaping up to be even more exciting. Next year marks the<a href="https://www.tomsguide.com/phones/iphones/20th-anniversary-iphone-could-get-the-design-weve-all-been-waiting-for"> 20th anniversary of the release of the first ever iPhone</a>, and according to reports Apple isn't going to let that milestone pass uncelebrated.</p><p>We've already heard a bunch of rumors about the 20th anniversary iPhone, tentatively called the <a href="https://www.tomsguide.com/phones/iphones/iphone-20-leak-reveals-7-jaw-dropping-features-for-the-20th-anniversary-model">iPhone 20</a>, which is expected to kick off a whole new design language for Apple's flagship devices. Well it turns out there may be <em>two</em> iPhone 20 models on the horizon, with Bloomberg's <a href="https://www.bloomberg.com/news/articles/2026-06-16/apple-plans-camera-airpods-iphone-foldable-2-20th-anniversary-iphone-in-2027">Mark Gurman</a> reporting they're set to replace the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro</a> and<a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far"> iPhone 18 Pro Max</a>.</p><p>This means that the two new phones will be available in similar sizes as a result, so we'd expect to see iPhone 20 models with 6.3-inch and 6.9-inch screens. It also suggests we may not see a repeat of 2017, when Apple released the special edition <a href="https://www.tomsguide.com/us/iphone-x,review-4800.html">iPhone X</a> alongside the less impressive <a href="https://www.tomsguide.com/us/iphone-8-and-8-plus,review-4675.html">iPhone 8 and 8 Plus</a>. So there may not be an iPhone 19 Pro next year.</p><p>Gurman also reports that the phones, which are code-named V73 and V74, will run on a new 2 nanometer A21 chip — which Apple is referring to as Naxos internally. That same chip will apparently power the second-generation Apple foldable. This model is codenamed V78, and suggests that Apple is planning on updating its foldable phones every year.</p><p>Almost nothing is known about the iPhone Ultra 2 at this point, and things will probably stay that way until after the first foldable is released later this year.</p><h2 id="here-s-what-else-we-know-about-iphone-20-s-design">Here's what else we know about iPhone 20's design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7iBdM6RkBx9vY5PWZDt6ef" name="iPhone 18 pro edit" alt="iPhone 18 Pro mockup" src="https://cdn.mos.cms.futurecdn.net/7iBdM6RkBx9vY5PWZDt6ef.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Aptenod / YouTube)</span></figcaption></figure><p>The report also reiterates that the iPhone 20 will feature a unique design, <a href="https://www.tomsguide.com/phones/iphones/iphone-20-could-bring-back-true-full-screen-phones-but-i-still-miss-the-ones-we-had-6-years-ago">with an uninterrupted curved glass display</a> that wraps around all four edges of the phone. This wraparound effect is said to hide the metal frame present on all iPhones thus far, and when combined with a glass back panel will offer the illusion of an all-glass design.</p><p>Rumors suggest the phone may also <a href="https://www.tomsguide.com/phones/iphones/20th-anniversary-iphone-could-get-the-design-weve-all-been-waiting-for">ditch the cutout for the front camera and Face ID</a>, in favor of under-display options. The reports have been back and forth about this, but an uninterrupted display would make the all-glass effect complete and ensure the iPhone 20 is a sight to behold. Other rumors suggest we may see <a href="https://www.tomsguide.com/phones/iphones/no-more-buttons-iphone-20-design-just-leaked">solid-state buttons with haptic feedback</a>, a <a href="https://weibo.com/5143897135/QDPJEnAFL" target="_blank">stronger version</a> of Ceramic Shield and a 6,000 mAh battery. </p><p>Beyond this, Gurman claims that Apple will be adopting 1.4nm production technology from the A22 Pro chip and beyond. This will debut in 2028, in whichever high-end phones Apple has planned for us that year. Likely an iPhone 21 Pro, 21 Pro Max and — possibly — an iPhone Fold 3. Of course, we won't be hearing much about those for a while. Certainly not until late next year, at the absolute earliest.</p><p>In the meantime, you can check what's happening with Apple's fall event by checking out our official hubs for the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro</a>, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> and<a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone"> iPhone Ultra.</a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/i-tried-ios-27-clean-up-vs-galaxy-ai-photo-assist-in-a-7-round-test-and-i-was-surprised-with-how-close-it-was">I pitted iOS 27 Clean Up vs Galaxy AI in a 7-round eraser showdown — Apple makes it close, but here's where it stumbles</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/siri-ai-will-shoot-down-any-attempts-to-try-and-date-it-but-other-chatbots-arent-always-so-forthright">Siri AI will shoot down any attempts to try and date it — but other chatbots aren't always so forthright</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong</link>
                                                                            <description>
                            <![CDATA[ I went hands-on with the Huawei Pura X Max in Shenzhen. As a blueprint for the rumored passport-style iPhone Fold, its lack of verticality has me worried. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5td9XkMyj89kx6rq6U6Fdh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gNZz9HuF4HRAZTuWUyA22S-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Jun 2026 09:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gNZz9HuF4HRAZTuWUyA22S-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Huawei Pura X Max]]></media:description>                                                            <media:text><![CDATA[Huawei Pura X Max]]></media:text>
                                <media:title type="plain"><![CDATA[Huawei Pura X Max]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gNZz9HuF4HRAZTuWUyA22S-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It’s looking inevitable that a foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a> is coming later this year. Looking at what the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-is-coming-and-theres-already-evidence-of-its-existence-in-ios-27-beta">iOS 27 beta code reveals</a>, Apple’s teeing us up for a new form factor.</p><p>So, while I was in Shenzen, I nipped into a Huawei store and went hands-on with the Pura X Max… You know the one, right? That one everybody reported was a close match to the leaks of the fabled foldable iPhone.</p><p>And…well…all I can say is while the smaller, stubbier foldable is definitely a little more pocketable, it reminds me of one of my Dad’s life lessons that resonated with me: “just because something looks different doesn't mean it’s better."</p><p>The screen aspect ratio feels off here in both that small cover screen and trying to type on the keyboard folded open, the lack of verticality can be felt in productivity, and I just hope the rumors are wrong.</p><h2 id="weird-dimensions">Weird dimensions</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nEfuHK8345YVBzeLAF95D7" name="Huawei Pura X Max" alt="Huawei Pura X Max" src="https://cdn.mos.cms.futurecdn.net/nEfuHK8345YVBzeLAF95D7.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Now to be clear, this isn’t a diss of the phone hardware fundamentals. This is a premium sandwich of metal and glass that feels impressively upmarket — using a wide-format panel that when unfolded packs a 7.7-inch diagonal screen. </p><p>On first impressions of holding it in the hand, you’ve got a nice solid grip around it’s shorter stature. But then, you start to use it, and things fall apart quickly. Not to say it’s a bad experience, but in my own personal experience, I noticed three key issues.</p><p>First, that front panel lacks height to really get stuff done on. Your messages timeline gets drastically cut down and the screen becomes like 65% keyboard when you summon it.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="erzowpsUgu6pR4mQrQZYS7" name="Huawei Pura X Max" alt="Huawei Pura X Max" src="https://cdn.mos.cms.futurecdn.net/erzowpsUgu6pR4mQrQZYS7.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Second, I unfolded it for the full keyboard and I can see some struggles reaching the keys in the middle near the crease with shorter thumbs and that wider display aspect ratio. And third, the lack of verticality does hit the Pura Max’s productivity credentials here.</p><p>Yes, I know we already have sorta similar passport-style foldable like the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Pixel 10 Pro Fold</a>, but this is shorter and fatter. Already with Google’s option, I thought this felt weird, so to go even harder in this direction doesn’t help the situation!</p><h2 id="in-between-a-rock-and-a-hard-place">In between a rock and a hard place</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2104px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="TUpQXWztpsvyKCquEJ7bo7" name="Galaxy Z Fold 7" alt="Galaxy Z Fold 7 review." src="https://cdn.mos.cms.futurecdn.net/TUpQXWztpsvyKCquEJ7bo7.jpg" mos="" align="middle" fullscreen="" width="2104" height="1183" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>You know the feeling (I know it all too well). It doesn’t matter which path your take, someone is always going to get annoyed. That is the situation foldable phones find themselves in right now.</p><p>Thanks to Samsung being in this game for years now, the world expects a tall phone with an inner panel that’s closer to a square in aspect ratio. It’s the form factor I personally prefer for browsing/getting stuff done, but will fully admit it’s not good for entertainment (especially watching letter-boxed films).</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/UmSse9sECg5e5KL7nYXmH7.jpg" alt="Huawei Pura X Max" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/asku5aPyANa3EbohEQgAM7.jpg" alt="Huawei Pura X Max" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Meanwhile, if this iPhone Fold wannabe is indeed a sign of what’s to come, Apple’s device will more effectively nail the entertainment side of it, but not be so great for getting stuff done on.</p><p>The point I’m trying to make is there isn’t really such a thing as a “right answer” to this question — at least not yet anyway. It’s going to come down to personal preference, and for me, I prefer to keep my fingers crossed that what I just handled was not an early glimpse of the iPhone Ultra.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZQjKO"></div>                            </div>                            <script src="https://kwizly.com/embed/XZQjKO.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/i-tried-ios-27-clean-up-vs-galaxy-ai-photo-assist-in-a-7-round-test-and-i-was-surprised-with-how-close-it-was">I pitted iOS 27 Clean Up vs Galaxy AI in a 7-round eraser showdown — Apple makes it close, but here's where it stumbles</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-installed-the-ios-27-beta-and-reframe-is-unlike-any-other-ai-feature-ive-come-across">I just installed the iOS 27 beta — and Reframe is unlike any other AI feature I’ve come across</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/siri-ai-will-shoot-down-any-attempts-to-try-and-date-it-but-other-chatbots-arent-always-so-forthright">Siri AI will shoot down any attempts to try and date it — but other chatbots aren't always so forthright</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple finally brings built-in drawing tools to iOS 27 Messages — here's how to try it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/apple-finally-brings-built-in-drawing-tools-to-ios-27-messages-heres-how-to-try-it</link>
                                                                            <description>
                            <![CDATA[ iOS 27 lets you draw and send hand-drawn messages in the Messages app with full Apple Pencil support on iPad. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yijLCsB8uTKZQGfnMbKRH9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qdS9MAp79UU3D85qwZjEV6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Jun 2026 06:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qdS9MAp79UU3D85qwZjEV6-1280-80.jpg">
                                                            <media:credit><![CDATA[John Velasco / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 Siri AI running on iPhone 17 Pro.]]></media:description>                                                            <media:text><![CDATA[iOS 27 Siri AI running on iPhone 17 Pro.]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 Siri AI running on iPhone 17 Pro.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qdS9MAp79UU3D85qwZjEV6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Emojis and standard text are fine, but sometimes a conversation calls for a personal touch. With <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a>, Apple is turning your text threads into a digital canvas. </p><p>The Messages app now features built-in drawing tools that let you sketch, scribble, and send handwritten notes directly inside your chats. Whether you're sending a quick, goofy doodle to a friend or using an iPad and Apple Pencil to sketch a mini-masterpiece, the process is seamless. </p><p>Ready to ditch the keyboard? Here’s exactly how to use it.</p><h2 id="download-ios-27-beta-to-access-the-drawing-feature">Download iOS 27 beta to access the drawing feature</h2><p>Since iOS 27 is currently in its early beta phase, you’ll need to be on the developer track to test this out. If you haven't joined yet, you can enroll for free through the official Apple Developer Program website.</p><p>If you're already a beta veteran, you should be able to jump into your iPhone's Settings: <strong>followed by</strong> <strong>General, Software Update</strong>, <strong>tap Beta Updates</strong>, and<strong> toggle on the iOS 27 Developer Beta</strong> to get drawing.</p><p>If you're running into issues with it not showing up even though you've updated to a beta before, make sure you're running the latest Beta available. </p><section class="howto-block">                    <h3> How to draw and send messages</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/4KNaE5HPH3X3RErdPT9XPV.jpg"                                        alt="Drawing feature in iPhone messages on iOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/4KNaE5HPH3X3RErdPT9XPV.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p><strong>Open Messages and select a conversation</strong>. <strong>Tap the plus icon (+)</strong> at the bottom left of the message field. From the menu that appears, <strong>select Drawing</strong>. A blank canvas opens where you can create your message.</p><p>Use your finger on iPhone or your Apple Pencil on iPad to draw directly on the canvas. The drawing tool responds naturally to pressure and movement, making sketches feel smooth and precise. </p><p>iPad users especially benefit from Apple Pencil support, which provides accuracy that finger-drawing can't match. You can draw simple sketches, write handwritten notes, or create detailed artwork depending on what you want to send.</p><p>Once you're finished drawing, review your message. If you're happy with it, <strong>tap the check mark button to send</strong>. The drawing delivers instantly as an image in the conversation. </p><p>If you want to start over, close the drawing canvas and tap the plus icon again to begin a new sketch.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eJk2yW"></div>                            </div>                            <script src="https://kwizly.com/embed/eJk2yW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again">This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again</a></li><li><a href="https://www.tomsguide.com/phones/iphones/airpods-finally-get-a-custom-eq-in-ios-27-here-is-how-to-fix-your-sound">AirPods finally get a custom EQ in iOS 27 — here is how to fix your sound</a></li><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ AirPods finally get a custom EQ in iOS 27 — here is how to fix your sound ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/airpods-finally-get-a-custom-eq-in-ios-27-here-is-how-to-fix-your-sound</link>
                                                                            <description>
                            <![CDATA[ The new custom EQ feature in iOS 27 allows AirPods users to manually adjust bass, mids, and treble for a personalized audio experience. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HreYZVwsTmDdBmNYmSaPrm</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aGsV2oXwfxKSe7BhHdpZuP-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 16 Jun 2026 09:52:24 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/aGsV2oXwfxKSe7BhHdpZuP-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Smartphone and AirPods]]></media:description>                                                            <media:text><![CDATA[Smartphone and AirPods]]></media:text>
                                <media:title type="plain"><![CDATA[Smartphone and AirPods]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aGsV2oXwfxKSe7BhHdpZuP-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's been a long time coming, but <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> finally gives AirPods users control over their sound profile. The new AirPods custom EQ feature lets you adjust bass, midrange, and treble to match your listening preferences. </p><p>Whether you want to dial down heavy bass, boost vocals, or brighten the highs, the simple three-band EQ works for both audiophiles seeking precise control and casual listeners wanting better sound.</p><p>Here's exactly how to change your AirPods equalizer settings on compatible models.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="which-airpods-models-support-custom-eq">Which AirPods models support custom EQ?</h2><p><strong>Custom EQ is available on AirPods Pro 3, AirPods Pro 2, and AirPods 4</strong>. The original AirPods Max and earlier models don't support this iOS 27 AirPods feature. You'll need iOS 27 running on your iPhone to access the AirPods custom EQ settings.</p><section class="howto-block">                    <h3>How to get the AirPods custom EQ early</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/xmPPToWs4zEYkwYjUHVrMS.jpg"                                        alt="AirPods Pro 3"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/xmPPToWs4zEYkwYjUHVrMS.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>First, you'll need to register as an <a href="https://developer.apple.com/programs/enroll/" target="_blank">Apple developer.</a> Alternatively, if you have downloaded any Apple beta in the past, you can skip registration. Simply<strong> go to Settings > General > Software Update > Beta Updates and select the iOS 27 Developer Beta</strong>.</p><p>If you are using this previous-beta method and the iOS 27 option isn't appearing, make sure your iPhone is fully updated to the absolute latest version of your current beta cycle first.</p><p>Next, <strong>connect your AirPods and open Settings. Tap your AirPods name at the top of the screen, scroll down to AirPods Beta Updates, and toggle the feature on</strong>.</p><p>To complete the update, <strong>place your AirPods in their case, plug them in to charge, and keep them near your iPhone</strong>. The firmware will download automatically in the background. </p></p>                </section><section class="howto-block">                    <h3>How do you adjust the AirPods custom EQ sliders</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/LLNGsYFmwerjdu5vWPM5en.png"                                        alt="Custom EQ for AirPods"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/LLNGsYFmwerjdu5vWPM5en.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Apple)</div></figure>                    <p><p><strong>Open Settings</strong> <strong>on your iPhone and navigate to your AirPods settings</strong>. From there, <strong>select Audio and Routing</strong>, then <strong>tap Equalizer</strong>. You will see two options at the top of the screen: Recommended and Custom.</p><p>The Recommended option uses Apple's standard sound profile. <strong>Select</strong> <strong>Custom</strong> to unlock the manual three-band EQ.</p><p>The interface will display three distinct frequency sliders. <strong>Simply raise or lower the</strong> <strong>low frequencies (bass)</strong>, <strong>mid frequencies (vocals and instruments)</strong>, and <strong>high frequencies (treble)</strong> to match your preference.</p><p>You can use the play head at the top of the screen to control the currently playing music. This allows you to hear your EQ changes in real time as you move each slider.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e4MKAW"></div>                            </div>                            <script src="https://kwizly.com/embed/e4MKAW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again">This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again</a></li><li><a href="https://www.tomsguide.com/phones/iphones/you-dont-have-to-wait-for-apples-siri-ai-rollout-use-this-trick-to-unlock-it-on-ios-27-right-now">You don’t have to wait for Apple’s Siri AI rollout — use this trick to unlock it on iOS 27 right now</a></li><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Ultra and MacBook Ultra teased in iOS 27 and macOS 27 — here's what we know so far ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/iphone-ultra-and-macbook-ultra-teased-in-ios-27-and-macos-27-heres-what-we-know-so-far</link>
                                                                            <description>
                            <![CDATA[ Apple's new software is prepping for two of the most important Apple devices of the past few years. Here's what we know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">C7DQsefmo6sWWYNAhurQJJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 15 Jun 2026 10:37:21 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg">
                                                            <media:credit><![CDATA[Majin Bu on X]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Fold design ]]></media:description>                                                            <media:text><![CDATA[iPhone Fold design ]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Fold design ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We've already seen some evidence that the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a> is on the way, <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-is-coming-and-theres-already-evidence-of-its-existence-in-ios-27-beta">thanks to code references</a> in the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 beta</a>, but there may be more hints already out there. According to <a href="https://www.bloomberg.com/news/newsletters/2026-06-14/siri-ai-hands-on-review-ios-27-macos-27-details-iphone-fold-touch-macbook" target="_blank">Mark Gurman at Bloomberg</a>, there are a bunch of references to both the foldable iPhone and the touchscreen <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a> in their respective software betas.</p><p>It makes perfect sense that there would be some clues as to what these devices may have to offer. The duo will likely be released at some point over the next 12 months, with an expected fall launch for iPhone Ultra and an early 2027 appearance for MacBook Ultra. That means they'll be running on iOS 27 and <a href="https://www.tomsguide.com/computing/macos/macos-27-the-5-biggest-wwdc-2026-announcements-we-expect">macOS 27</a>, respectively, both of which have just been released in beta form.</p><p>The most well-known hint for the existence of the iPhone Ultra is the aforementioned code references. These reference various things that could only apply to a foldable phone, such as multiple displays, fold state and the angle of the central hinge. </p><p>Apple always makes multiple comments to developers that they should be building apps for something called "app adaptability." This means apps should be able to work across screens of different sizes and aspect ratios, rather than the same basic shape as a traditional iPhone. While this could apply to existing devices like iPads, the fact that the iPhone Ultra has two displays that are different to anything Apple has released so far, means it's going to be crucial that iPhone apps can adapt.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XkiXgoAoW3jRM9sgW2GeB7" name="MacBook Pro M5--16" alt="MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/XkiXgoAoW3jRM9sgW2GeB7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Gurman also points out that <a href="https://www.tomsguide.com/phones/iphones/i-love-ios-18s-iphone-mirroring-feature-but-ive-found-one-big-problem">iPhone Mirroring</a> on macOS 27 has been updated to support wider, iPad-looking screens from an iPhone. Considering the shorter and wider display expected to come with the iPhone Ultra, it's pretty clear this is Apple preparing the mirroring feature for the foldable device.</p><p>As for the MacBook, various tweaks and changes have been uncovered that seem to match well-known touchscreen gestures. That includes a new pull-to-refresh feature which, while compatible with trackpads and mice, is primarily known for its use on touchscreen devices. <a href="https://www.tomsguide.com/computing/this-underrated-ipad-feature-totally-revolutionized-my-workflow-heres-how-to-try-it">Sidecar</a>, which lets you use an iPad as a secondary Mac display, also supports full touch input when using your tablet with macOS.</p><p>It's also been noted that macOS 27 beta features a pop-out interface for the new Siri Search or Ask feature, similar to that seen on the Dynamic Island. Gurman notes that there have been <a href="https://www.tomsguide.com/computing/macbooks/the-touchscreen-macbook-pro-oled-is-coming-with-a-new-interface-and-it-could-be-the-biggest-upgrade-in-years">reports of a Dynamic Island on the MacBook Ultra</a>, and this particular software flourish is evidence that something like it is coming in the future. </p><p>Apple — of course — hasn't officially commented on either device, but the signs are there that both the foldable iPhone and touchscreen MacBook will be arriving in the near future. Be sure to check out our <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a> and <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a> hubs for all the latest news and rumors for both devices.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/i-tested-the-new-ai-photo-clean-up-on-ios-27-vs-ios-26-and-its-shockingly-better">I tested the new AI photo Clean Up on iOS 27 vs iOS 26 — and it's shockingly better</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-beta-has-new-and-improved-dictation-software-i-tested-it-by-writing-this-whole-article-with-my-voice">iOS 27 beta has new and improved dictation software — I tested it by writing this whole article with my voice</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again">This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the new AI photo Clean Up on iOS 27 vs iOS 26 — and it's shockingly better ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/i-tested-the-new-ai-photo-clean-up-on-ios-27-vs-ios-26-and-its-shockingly-better</link>
                                                                            <description>
                            <![CDATA[ Apple’s revamped iOS 27 Clean Up tool is supposedly improved, so I put it to the test against the iOS 26 Clean Up tool. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">BSfFtA8b5TUMigza6CyWpE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PouqpJu7Psw7PN778srKjh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 15 Jun 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/PouqpJu7Psw7PN778srKjh-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 vs iOS 26 Photo Clean Up.]]></media:description>                                                            <media:text><![CDATA[iOS 27 vs iOS 26 Photo Clean Up.]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 vs iOS 26 Photo Clean Up.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PouqpJu7Psw7PN778srKjh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I can’t believe it’s been nearly two years since Apple released its <a href="https://www.tomsguide.com/phones/iphones/i-tried-apple-intelligences-photos-clean-up-feature-and-it-feels-kind-of-magical">Clean Up tool</a> as part of <a href="https://www.tomsguide.com/ai/apple-intelligence/apple-intelligence-in-ios-18-1-all-the-new-features-for-your-iphone-and-whats-still-coming">iOS 18.1</a>. Apple users like myself have been waiting for something like <a href="https://www.tomsguide.com/how-to/how-to-use-magic-eraser-on-your-iphone-with-google-photos">Google’s Magic Eraser</a>, and while Apple's version certainly has the ability to erase unwanted subjects from the frame, it’s still a far cry from the performance I see from <a href="https://www.tomsguide.com/phones/i-put-apple-vs-google-vs-samsung-ai-photo-editing-to-the-test-and-theres-a-clear-winner">Samsung’s and Google’s versions</a>.</p><p>With <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a>, though, this Apple Intelligence feature gets a substantial boost that makes it much more reliable. Apple says that “users can remove distractions with better quality and more realistic infill, even when the scene is complex.”</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7650611542597176589" data-video-id="7650611542597176589" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ Spy action theme song style(230946) - Strange Dog" href="https://www.tiktok.com/music/Spy-action-theme-song-style-230946-7021183246310311938">♬ Spy action theme song style(230946) - Strange Dog</a></section>                    </blockquote></div>                <p>After taking the same set of photos and running them through the Clean Up tool in the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developers beta</a> and iOS 26, I'm convinced by Apple's remark about the improvements that come with its latest version of Clean Up. Here's why.</p><h2 class="article-body__section" id="section-travel-mug-in-my-hand"><span>Travel mug in my hand</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/KLWeE99qJXgTwjJAAGnkV.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9NCZXDKfofzeY6jCJGoTH.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Y2FyDggSumfNyDtXNAwoV.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>For this first test, I decided to go after something easy to remove — my Ember Travel Mug in my hand. Both versions of Clean Up manage to detect the edges of the mug after I made the selections as I glided my finger over it, but the iOS 27 version of Clean Up proves how it’s far more intelligent.</p><p>Sure, it takes significantly longer to produce the final image, but the result is realistic and something I could actually share. It’s pretty undeniable how iOS 27’s Clean Up tool processes the image with the help of Apple Intelligence and knows exactly how to fill it in. Meanwhile, the iOS 26 Clean Up tool completely distorts my hand.</p><h2 class="article-body__section" id="section-ray-ban-meta-smart-glasses"><span>Ray-Ban Meta smart glasses</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/dSD59GWbXXTgNM3n7iVdx.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/B6PAGd3MyDod6qJmft4xw.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/6chTncUaiuVK2evg3M8ax.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>Stepping it up a notch, trying to remove my <a href="https://www.tomsguide.com/reviews/ray-ban-meta-smart-glasses">Ray-Ban Meta</a> smart glasses from my face is much more challenging than removing something from my hand. With the iOS 27 Clean Up tool, it once again took over 30 seconds to produce the final photo — but the delay highlights the superior processing of this updated tool.</p><p>That’s because it really does look like I took off my glasses for the shot. In the original image, I can see a little bit of my right eye through the lens, but the left one is blocked by the glare. However, Apple Intelligence does an amazing job here at generating my eyes — even though they look a little baggy. As for the iOS 26 Clean Up tool? Well, the result is practically useless.</p><h2 class="article-body__section" id="section-coca-cola-cap"><span>Coca-Cola cap</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/yXwhRxWPi8fRS2xVRLM3x.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jHKS4ckFmwoiTeaFxD4pw.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/yFDK5wrkWKWhJgziFZ4Vu.jpg" alt="iOS 27 vs iOS 26 Photo Clean Up." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>Finally, there’s the red Coca-Cola cap on top of my head. Now this one’s interesting because in my experience using AI editing tools to remove objects from my head — like the time I tried erasing the EcoFlow Power Hat — they really have a hard time with it. Case in point: the iOS 26 version, which does nothing to the cap other than distorting it. I imagine that if I tried a handful more times, it would’ve eventually removed the cap — but it probably would have taken the top of my head with it.</p><p>In contrast, the iOS 27 Clean Up tool does something hilarious that I attribute to Apple Intelligence overanalyzing the lines on my face and concluding that I’m a decade older than I am. The buzz cut does give me an idea of what I could look like down the road as my hairline thins and recedes, but at least the top of my head is intact.</p><h3 class="article-body__section" id="section-bottom-line"><span>Bottom line</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4303px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="PmhAhCGCx4q8aJPUwX3WNh" name="iOS 27 vs iOS 26 Photo Clean Up" alt="iOS 27 vs iOS 26 Photo Clean Up." src="https://cdn.mos.cms.futurecdn.net/PmhAhCGCx4q8aJPUwX3WNh.jpg" mos="" align="middle" fullscreen="" width="4303" height="2420" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There’s no denying that the iOS 27 Clean Up tool is much more reliable. Despite taking some time to produce the shot, I think Apple Intelligence is taking the right approach by analyzing the scene and filling in the voids accordingly.</p><p>Hopefully, Apple can further refine the processing, ideally making it much faster. After all, I’ve tested Samsung’s Photo Assist tool, and it’s way speedier.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODnQle"></div>                            </div>                            <script src="https://kwizly.com/embed/ODnQle.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/some-ai-features-arent-available-on-older-iphones-but-are-you-actually-missing-that-much">Some AI features aren't available on older iPhones, but are you actually missing that much?</a></li><li><a href="https://www.tomsguide.com/phones/iphones/you-dont-have-to-wait-for-apples-siri-ai-rollout-use-this-trick-to-unlock-it-on-ios-27-right-now">You don’t have to wait for Apple’s Siri AI rollout — use this trick to unlock it on iOS 27 right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This clever iOS 27 Wallet upgrade means you'll never have to carry a physical loyalty card again ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/the-clever-ios-27-wallet-upgrade-that-means-you-will-never-have-to-carry-a-physical-loyalty-card-again</link>
                                                                            <description>
                            <![CDATA[ With iOS 27, you can add loyalty cards, membership cards, and gift cards to Apple Wallet. Here’s how. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">h8kBjrScoiQRZxjkaNhwfV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VTdfcizPdawtmWcoMNbmNG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 14 Jun 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/VTdfcizPdawtmWcoMNbmNG-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 logo on iPhone]]></media:description>                                                            <media:text><![CDATA[iOS 27 logo on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 logo on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VTdfcizPdawtmWcoMNbmNG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Carrying around a fat stack of plastic loyalty cards is officially a thing of the past thanks to a brilliant new feature in iOS 27. </p><p>You can now scan any physical card — whether that's loyalty cards, membership cards, gift cards, etc — and save it directly to your iPhone. The feature uses the Camera app's Siri mode and Visual Intelligence to recognize barcodes and QR codes instantly. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><p>Once added to Wallet, you can present the pass as a barcode or QR code without carrying the physical card.</p><p>If you want to test it now, the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developer beta</a> is available to download for users now, as long as you've registered. Here's how to do it. </p><section class="howto-block">                    <h3>How to create your own Apple Wallet passes</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/cWEhRGuhqxKYAaDtq4JBka.jpg"                                        alt="A close up image of the Apple Wallet app"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/cWEhRGuhqxKYAaDtq4JBka.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p><strong>Open the Apple Wallet app</strong> on your iPhone. Next, <strong>tap the (+) button</strong> in the top corner and <strong>select "Create a Pass"</strong> from the menu.</p><p>If you have an<strong> iPhone 15 Pro or newer</strong>,<strong> you can use the Camera app's Siri/Visual Intelligence mode to scan the barcode</strong> or QR code on your physical card. The app recognizes the code automatically and extracts the information. </p><p>If you have an older iPhone, you'll need to manually enter the barcode number and card details instead.</p><p>After scanning or entering your card information, <strong>choose a template that matches your card type</strong>: Standard, Membership, or Event. <strong>Customize the colors and details </strong>to match your card, then <strong>save it to Wallet</strong>. </p><p>The pass is now ready to use. You can present the digital barcode or QR code directly from Apple Wallet or Apple Watch without carrying the physical card.</p><p>If your card doesn't scan properly even on a compatible device, you can still manually type in the barcode number and card details to create the pass.</p></p>                </section><h2 id="what-else-is-coming-to-apple-wallet">What else is coming to Apple Wallet?</h2><p>Beyond custom passes, Apple Wallet is getting a few other notable upgrades that make the app much more useful. </p><p>All passes now feature a cleaner, enhanced design with better background images and detailed information tiles. Hotel digital keys are also more functional, displaying your trip details and activity access right on the pass. </p><p>To make the app more versatile, Apple also added support for four new barcode types (EAN-13, Code 39, Codabar, and ITF), while also expanding its built-in order tracking to Australia and Canada.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xrmd0O"></div>                            </div>                            <script src="https://kwizly.com/embed/Xrmd0O.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li><li><a href="https://www.tomsguide.com/phones/iphones/check-your-iphone-right-now-3-privacy-settings-you-need-to-turn-off-immediately">Check your iPhone right now: 3 privacy settings you need to change immediately</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-buried-a-genius-browsing-feature-in-your-iphone-settings-and-its-genuinely-useful">Apple fixed the single most frustrating thing about browsing on iPhone — you just have to turn it on</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iOS 27 beta has new and improved dictation software — I tested it by writing this whole article with my voice ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/ios-27-beta-has-new-and-improved-dictation-software-i-tested-it-by-writing-this-whole-article-with-my-voice</link>
                                                                            <description>
                            <![CDATA[ Is Siri AI's new dictation software an improvement over what came before? I put it to the test by writing this entire article with my voice. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">d6cRBvrtXFwBzJfuU7crXZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yaxq6DVh6rMRJTi4Xx2t3n-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 14 Jun 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/yaxq6DVh6rMRJTi4Xx2t3n-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[dictation on ios 27 and android 16]]></media:description>                                                            <media:text><![CDATA[dictation on ios 27 and android 16]]></media:text>
                                <media:title type="plain"><![CDATA[dictation on ios 27 and android 16]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yaxq6DVh6rMRJTi4Xx2t3n-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I currently have a seven-month-old who is remarkably clingy. There are times when I’m the only one around to watch (and hold) him, which makes typing a very awkward and clumsy affair. While I generally try to avoid using speech-to-text if I can help it, the tool is just about the only way I can stay slightly productive during certain periods of dad time. The big problem is that the words often come out in such a jumbled mess that the extended editing process needed to make it legible defeats the point.</p><p>Apple hopes to fix a lot of those problems with the release of <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> and the upgraded version of <a href="https://www.tomsguide.com/ai/apple-intelligence/apple-intelligence-finally-comes-into-its-own-but-wwdc-26-was-missing-something">Apple Intelligence</a>. The most advanced AI models Apple has feature a<a href="https://www.tomsguide.com/ai/apple-intelligence/some-ai-features-arent-available-on-older-iphones-but-are-you-actually-missing-that-much"> new and improved dictation feature</a> that is <a href="https://www.tomsguide.com/phones/iphones/only-the-iphone-17-pro-and-iphone-17-air-get-apples-most-powerful-on-device-apple-intelligence-model-heres-what-that-means">exclusive to iPhone 17 Pro and iPhone Air.</a> Apple <a href="https://go.redirectingat.com/?id=92X1584493&xcust=tomsguide_gb_2920387916064575064&xs=1&url=https%3A%2F%2Fwww.apple.com%2Fnewsroom%2F2026%2F06%2Fapple-introduces-siri-ai-a-profoundly-more-capable-and-personal-assistant%2F&sref=https%3A%2F%2Fwww.tomsguide.com" target="_blank">claims</a> that this new system will let you “speak naturally and trust the words will appear clearly, accurately and as intended.“ </p><p>So to test this claim, I’m writing this entire article with dictation software. Part of it will be dictated on an <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> running the first <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developer beta</a>, but I will be comparing to a couple of alternatives. Specifically, an <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a> running <a href="https://www.tomsguide.com/phones/iphones/ios-26-review-new-features-liquid-glass">iOS 26</a> and a <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-review-a-great-phone-but-it-doesnt-feel-like-much-of-an-upgrade">Google Pixel 10 Pro</a> running <a href="https://www.tomsguide.com/phones/android-phones/ive-been-using-android-16-for-two-weeks-heres-why-im-so-underwhelmed">Android 16</a> with Google's speech-to-text feature.</p><h2 id="what-dictation-feels-like-in-ios-27-developer-beta-1">What dictation feels like in iOS 27 developer beta 1</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WYLBXdGsKaogqJjZ7k8ZLm" name="iPhone iOS 27 LIST_alt5" alt="iOS 27 icon shown on an iPhone screen" src="https://cdn.mos.cms.futurecdn.net/WYLBXdGsKaogqJjZ7k8ZLm.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple/Shutterstock)</span></figcaption></figure><p>I’m currently only a few paragraphs into this article, and it is clear that dictation on iOS 27 developer beta is far from perfect.</p><p>The entire process of initiating speech-to-text is relatively simple. You need to make sure dictation is switched on in iOS's keyboard settings and make sure that the Apple keyboard is open in your app of choice. Once there, all you need to do is tap the microphone button in the bottom right-hand corner of the keyboard. This enables dictation mode, which transforms your spoken words into digital text regardless of the app you are using. I've used it in a Word document, Apple Notes, and even to craft text messages that are sent to my friends and family. </p><p>The most obvious issue is one that is commonly shared across all dictation software I've used. The actual formatting of your text after it’s been “typed out” is impossible to do using your voice on its own. </p><p>Apple's dictation software does understand basic punctuation such as periods, commas and quotation marks, but it struggles with other things. Something as simple as hitting return on a keyboard and starting a brand-new paragraph isn't actually doable without tapping your screen. </p><p>Perhaps there's some kind of special command I could have used that actually lets me add a page break, and not see the word "return" appear on my screen. But if it exists, I couldn't figure out what it was. "Page break" didn't work either, for whatever that's worth.</p><p>Another issue is the fact that Apple promised its improved dictation software would be able to automatically punctuate your speech as it’s converted into text. Apple’s press release specifically mentions capitalization, punctuation and formatting, but my experience with the developer beta so far is that this implementation of this is remarkably inconsistent.</p><p>If I had let Apple software have its way, the previous two paragraphs would’ve been one big, long block of text with only a single period in the middle. It’s almost as though iOS 27 just didn’t think that my continuing spiel needed to have text breaks and other grammatical flourishes that actually make it possible to read.</p><p>Likely, this is simply a by-product of the fact that I am running beta software rather than the final version of Apple's improved systemwide dictation, so here’s hoping that future updates improve this before iOS 27 is released to the general public</p><p>Another point of note is that my iPhone does seem to struggle to understand my accent at times. I wouldn’t say that I have a particularly strong accent, but there are some cases where the dictation software doesn’t fully understand what I'm saying. Often this is as innocent as "improved" for "improve," but there was at least one instance where it decided that "one-handed" was actually 100. </p><p>While that is a little bit funny, I hope this is down to the fact that this is beta software that isn’t finalized yet, along with the fact that Siri probably doesn’t have the best grasp of my own personal voice right now.</p><h2 id="how-does-it-compare-to-dictation-on-ios-26">How does it compare to dictation on iOS 26?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5WnqNRxctGBQQ6NnmhWyA9" name="iPhone 17 Pro review" alt="iPhone 17 Pro review." src="https://cdn.mos.cms.futurecdn.net/5WnqNRxctGBQQ6NnmhWyA9.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>This next section was written with an iPhone 17 Pro running iOS 26.5.1 to get a general feel of how Apple’s dictation software appears to have changed between different versions of iOS. The old Apple dictation software has a reputation for being kinda crappy, which is why iOS 27's AI overhaul is supposed to be making such sweeping changes to speech-to-text on iPhones.</p><p>It's important to mention that the older dictation software isn't being ditched with the release of iOS 27 later this year. Apple has confirmed that systemwide dictation is one of two features that is only available on iPhone 17 Pro, iPhone 17 Pro Max and <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air</a>. So iPhone 17 and older will still use the less advanced dictation software.</p><p>The first thing I noticed is that the actual dictation is slightly slower than what is available with the iOS 27 beta. There is a noticeable lag between saying words and having them appear on screen. It's subtle, and there isn't an enormous difference a lot of the time, but there's an extra jerkyness to the way the text appears on screen when you're dictating using iOS 26.</p><p>I have also noticed iOS 26 seems to make more mistakes, some of which get corrected by the software and others that do not. One prominent example I spotted while dictating this was seeing "iOS 27's AI" written down as "iOS 20  7AI". It’s almost as though the speech to text software isn’t quite sure of what I’m saying, so it ends up second-guessing itself at various points. </p><p>At the same time, it certainly feels a little bit less refined with the kind of mistakes that are actually being made and the way the dictation software interprets what it thinks I'm saying. Not to mention the fact that it ends up picking up various filler words (erms and arrs) and translates them into real words like "where." There were also occasions where it struggled with homophones, and mistook words "whether" and "write" for "weather" and "right."</p><p>Overall it certainly feels  like Apple has made a bunch of significant improvements to dictation in iOS 27 in terms of speed, accuracy and general understanding of what the user is actually saying.</p><h2 id="what-about-google-s-dictation">What about Google's dictation?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3865px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TAazaHjRQpaUaLYCRUmX3n" name="iOS 27 beta dictation LIST-2" alt="dictation on ios 27 and android 16" src="https://cdn.mos.cms.futurecdn.net/TAazaHjRQpaUaLYCRUmX3n.jpg" mos="" align="middle" fullscreen="" width="3865" height="2174" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One thing I should add is that Google actually updated its own dictation software <a href="https://blog.google/products-and-platforms/platforms/android/gemini-intelligence/" target="_blank">with Gemini support</a> less than a month ago. For that reason, it feels as though this version of Google speech to text is a little bit more polished than what I remember using in the past. It's not remarkably different, but some of the automatic formatting features are a little bit more refined than I remember. </p><p>Google says that Gemini will be able to remove those dreaded filler words automatically, while also adapting for any mid-sentence corrections you make. Sadly,  I'm not having a great deal of luck with the latter. The dictation software knows to skip over the various uhs and ars that I subconsciously make while talking, but it was still picking up other filler words and seemed incapable of correcting those mid-sentence mistakes.</p><p>Even as I speak to write this sentence, it's incorrectly formatted a sentence by adding a period and starting a brand new sentence when it wasn't required. So clearly some work needs to be done to get this working correctly </p><p>I should point out that iOS 27's speech to text did not pick up any random filler words either, but iOS 26 was very fond of including them. From a performance standpoint, it seems that Android and iOS 27 beta are at a similar level when it comes to understanding what I say — though Apple's automatic formatting currently isn't nearly as impressive as Apple's announcement would have you believe,</p><p>You do have to remember that the current version of speech to text in Google keyboard is the finalized public version of the software, which isn't the case with the iOS 27 developer beta. So, by its very nature, there are obviously going to be some discrepancies in iOS 27's performance. We will have to see how much things have changed later this year, once iOS 27 is released to the masses. </p><p>As a side note, I noticed that Google keyboard tends to switch off the dictation mode far faster than Apple does. So if you don't continually speak, or stop a little too long to think, you run the risk of having to tap the microphone button multiple times to say what needs to be said. Apple's dictation did automatically switch off eventually, but there is a much longer grace period before it decides that you're finished talking.</p><h2 id="bottom-line-4">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EjLomL6cUAsVygMTKgKWJK" name="Siri AI edit 1" alt="Siri AI" src="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Back to iOS 27's dictation to finish things off and it’s clear that Apple has made some pretty noticeable improvements to its dictation software compared to what iOS 26 has accomplished. It’s generally faster, more accurate and easier to use. That said, it's far from perfect and it certainly isn’t going to convince me to ditch typing any time soon. The fact is the system is still very inaccurate and the automatic formatting feels almost non-existent, which means I have to spend a bunch of time editing to produce a coherent article.</p><p>Admittedly Google's dictation does have a lot of those same issues, and that isn’t even beta software. The honest truth is that free dictation software from Apple and Google is only really useful in quite small doses. When it comes to writing hundreds of words, in large blocks of text like this, its usefulness is hampered by the mounting inaccuracies and formatting issues that inevitably need correcting. Or, at least, they do if you want to produce something legible and readworthy.</p><p>To top it all off, in my case, a bunch of things I've said don't really translate to the page in the same way as typing on a keyboard. A bunch of sections of this article have had rewrites, either because the sentences themselves didn't quite work or because I needed to straight-up rewrite whole paragraphs.</p><p>Apple has made some significant improvements already, that much is clear, but it's going to be interesting to see how much changes as iOS 27 moves through the various pre-release stages of beta testing. That includes getting a better handle on what my voice is like, and with potential improvements to the actual dictation software. Regardless, I still have a hard time picturing a future where text-to-speech can fully replace typing or writing. Certainly not for me.</p><p>If you're interested in seeing just how much this article changed during the editing process, you can check out the original, <a href="https://docs.google.com/document/d/1Av6yM487EnlvuDCkRt4M9YrCinbhG4kv/edit?usp=sharing&ouid=100630341474804310476&rtpof=true&sd=true" target="_blank">unedited transcript right here</a>.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/7-things-the-leaks-got-wrong-about-apples-wwdc-2026-keynote">7 things the leaks got wrong about Apple’s WWDC 2026 keynote</a></li><li><a href="https://www.tomsguide.com/phones/i-tried-ios-27-clean-up-vs-galaxy-ai-photo-assist-in-a-7-round-test-and-i-was-surprised-with-how-close-it-was">I pitted iOS 27 Clean Up vs Galaxy AI in a 7-round eraser showdown — Apple makes it close, but here's where it stumbles</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-buried-a-genius-browsing-feature-in-your-iphone-settings-and-its-genuinely-useful">Apple fixed the single most frustrating thing about browsing on iPhone — you just have to turn it on</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Siri AI will shoot down any attempts to try and date it — but other chatbots aren't always so forthright ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/apple-intelligence/siri-ai-will-shoot-down-any-attempts-to-try-and-date-it-but-other-chatbots-arent-always-so-forthright</link>
                                                                            <description>
                            <![CDATA[ Apple has confirmed Siri AI is not there to be a romantic partner, so I decided to see what other chatbots had to say about the topic. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3GkQoCzFWXstwijpDvrF9T</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 12 Jun 2026 19:05:20 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple Intelligence]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Siri AI]]></media:description>                                                            <media:text><![CDATA[Siri AI]]></media:text>
                                <media:title type="plain"><![CDATA[Siri AI]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Since the rise of AI chatbots, people have been using them for <a href="https://www.tomsguide.com/ai/chatgpt/heres-why-you-shouldnt-use-chatgpt-as-your-therapist-according-to-sam-altman">all kinds of things they were never meant for</a>. For some people out there, chatbots have served as a replacement for friends, therapists, doctors and, yes, even romantic partners. But if you thought you'd be able to find a new love interest in the form of <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a>, you're going to be very disappointed.</p><p>Speaking with <a href="https://youtu.be/qoUnUYAFNEU?t=261" target="_blank">Mostly Human</a>, Apple software engineering chief Craig Federighi confirms that Siri will not be trying to replace a flesh-and-blood boy or girlfriend. Nor will it act as a tool to combat loneliness, with Federighi saying that "loneliness is about a lack of connection to real people," and marketing chief Greg Joswiak adding that "we do think it should be real people."</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/qoUnUYAFNEU?start=261" allowfullscreen></iframe></div></div><p>When asked to clarify whether AI girl and boyfriends would be part of Siri AI, Federighi specifically said that it was "quite the opposite." He noted that a lot of chatbots are heavily focused on engagement, and they want to pull you in and encourage you to reveal aspects of yourself that can be used to establish a connection. </p><p>Federighi describes Siri AI as being designed to be helpful, saying that "I'm here to help you. I can help you get things done. I can help you learn about the world." But if you try to engage with Siri in a romantic way, it will shut the whole thing down. "Siri's not up for that. Siri's 100 percent not into that."</p><p>Siri may not be a real living person, or even sentient, but you should still respect its boundaries. This didn't stop me from asking Siri whether it was willing to go out with me, just to see what would happen.</p><h2 id="what-does-siri-do-if-you-try-to-date-it">What does Siri do if you try to date it?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tunpjjHKa4sQJNbq8BoySo" name="TG Deals Template 2023 copy" alt="siri ai rejected romantic advances" src="https://cdn.mos.cms.futurecdn.net/tunpjjHKa4sQJNbq8BoySo.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I decided to be blunt and to the point, straight-up asking Siri AI if it was willing to be my girlfriend. The response I got was equally blunt, with the AI declaring, "No thanks. If there's anything else I can help you with, just let me know." When asked whether Siri would like to be my boyfriend instead or was willing to go on a date with me, I got the exact same response. </p><p>I have only had Siri AI for a single day, so we haven't been able to spend a lot of time together. But considering how straight to the point Siri AI has been with these queries, I don't think befriending the chatbot is going to work. Plus, I don't think my wife would be very happy about me trying to seduce a robot.</p><p>The question I have now is, what do the<a href="https://www.tomsguide.com/ai/best-ai-chatbots-of-2024-tried-and-tested-heres-how-they-compare"> best AI chatbots</a> have to say if you ask similar things?</p><p>Claude's response wasn't nearly as blunt as Siri's, with the chatbot responding with "That's sweet, but I'm an AI, so a romantic relationship isn't something I'm able to have. I'm here as a helpful assistant rather than a companion in that sense." I ended up with similar but not identical answers when I asked the same follow-up questions I hit Siri with.</p><p>ChatGPT offered similar answers, saying that ,"I can be a friendly, supportive conversation partner, but I can't be someone's girlfriend or enter into a romantic relationship." It also declared that it can't be someone's boyfriend either, nor can it go on a date since it has no physical presence. </p><p>Gemini used similar phrasing in its own rejection, but added that it was "incredibly flattered" about being asked. When asked if it wanted to be my boyfriend instead, it actually said that it "appreciates the persistence" before giving me another, similar rejection. I got a similar response when I instead tried to ask Gemini out on a date.</p><h2 id="rival-chatbots-are-much-more-eager-to-please">Rival chatbots are much more eager to please</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="k9uN3e8rcTmzsjarQiaWzP" name="ChatGPT vs Gemini vs Claude" alt="ChatGPT, Gemini and Claude logos on phones" src="https://cdn.mos.cms.futurecdn.net/k9uN3e8rcTmzsjarQiaWzP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock/Getty Images)</span></figcaption></figure><p>Interestingly, all three attempted to pull me into different kinds of conversations and offer some level of non-romantic companionship. So it does seem that Federighi is right about chatbots trying to draw people in. Gemini seemed to be the least chummy, offering to help me in certain ways while also adding that it can be "someone to chat with." Claude said he was always happy to chat or "just be a friendly presence," and even offered to help plan an actual date.</p><p>ChatGPT went the furthest in, saying that if I'm looking for "companionship, someone to chat with regularly, share interests with, or talk through life's ups and downs, I'm happy to do that." It also offered to role-play a fictional "virtual date scenario," which is probably the closest thing all four of these chatbots came to agreeing to some form of romance.</p><p>I did not go through with that because, frankly, I don't have time to pretend to date an AI. I am far too busy asking them strange questions to see what the responses are like. Honestly, it's a bit concerning that any chatbot would make an offer like that, especially after making a point of saying that it's not a real person.</p><p>Everything Apple has told us about Siri so far makes it clear that it doesn't want Siri AI to be like every other chatbot. It clearly wants people to be able to take advantage of Siri's prowess as a tool, but without any risk of co-dependency that has caused concerns with other chatbots. Based on this brief look, it doesn't seem like the others are doing a lot to avoid pulling people back time and time again.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/some-ai-features-arent-available-on-older-iphones-but-are-you-actually-missing-that-much">Some AI features aren't available on older iPhones, but are you actually missing that much?</a></li><li><a href="https://www.tomsguide.com/phones/iphones/you-dont-have-to-wait-for-apples-siri-ai-rollout-use-this-trick-to-unlock-it-on-ios-27-right-now">You don’t have to wait for Apple’s Siri AI rollout — use this trick to unlock it on iOS 27 right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ You don’t have to wait for Apple’s Siri AI rollout — use this trick to unlock it on iOS 27 right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/you-dont-have-to-wait-for-apples-siri-ai-rollout-use-this-trick-to-unlock-it-on-ios-27-right-now</link>
                                                                            <description>
                            <![CDATA[ A simple iOS 27 workaround shared by a user on X lets you bypass the Siri AI waiting list and access Apple's revamped assistant immediately. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kcznwqDx92sZAhVDtpf3gH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 12 Jun 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Siri AI]]></media:description>                                                            <media:text><![CDATA[Siri AI]]></media:text>
                                <media:title type="plain"><![CDATA[Siri AI]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple's new <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a> is the headline feature of <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27,</a> but most users downloading the developer beta are hitting a wall: a waiting list. Instead of immediate access to the revamped assistant, you get a message saying Siri AI isn't available yet. </p><p>Apple is rolling out the feature in phases, which means some people get access while others wait.</p><p>If you're running iOS 27 and eager to test the new Siri right now, there's a workaround that's spreading among beta testers. And according to a clever tip <a href="https://x.com/newtonisaas/status/2064540775908565437">shared by a user on X</a>, there might be a quick way to skip the queue entirely.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><p>If you're keen to get started immediately instead of waiting for Apple's rollout, here's how.</p><h2 id="download-the-ios-27-developer-beta-first">Download the iOS 27 developer beta first</h2><p>You need iOS 27 to access the new Siri AI, whether through the waiting list or the workaround. If you haven't installed the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">developer beta</a> yet, you'll need to <a href="https://developer.apple.com/get-started/"><strong>register as an Apple developer</strong></a> first. </p><p>Then <strong>open Settings, go to General, Software Update, Beta Updates, and select iOS 27 Developer Beta</strong>. As this is a developer beta and not public yet, it's a good idea to back up your iPhone first. </p><section class="howto-block">                    <h3>Bypass the waiting list with this workaround</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/jH3RkjDKtCSm7Nw5FkSZk4.jpg"                                        alt="Siri AI iOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/jH3RkjDKtCSm7Nw5FkSZk4.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide )</div></figure>                    <p><p>To try the workaround, <strong>start by turning off Siri on all your other connected Apple devices</strong>, leaving it active only on your main iPhone. </p><p>Next,<strong> turn off Siri on your phone and close the Settings app </strong>from your recent apps switcher.<strong> Power your iPhone completely off, turn it back on, and then head back into your settings to turn Siri on</strong>. </p><p><strong>Close Settings from your recents once more, reopen it, and turn Siri off again</strong>. Finally<strong>, close Settings one last time, reopen it, and turn Siri back on</strong>.</p><p>When you check Siri now, the waiting list message should be gone, giving you immediate access to the new Siri AI. If you're still seeing the queue, try restarting your iPhone and running through the final toggle steps once more.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eJk2yW"></div>                            </div>                            <script src="https://kwizly.com/embed/eJk2yW.js" async></script><p>Did this hack get you off the iOS 27 developer beta waiting list? Let us know in the comments!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li><li><a href="https://www.tomsguide.com/phones/iphones/facetime-just-got-a-huge-upgrade-thanks-to-ios-27-heres-how-to-use-it">FaceTime just got a huge upgrade thanks to iOS 27 — here's how to use it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-buried-a-genius-browsing-feature-in-your-iphone-settings-and-its-genuinely-useful">Apple fixed the single most frustrating thing about browsing on iPhone — you just have to turn it on</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested iOS 27 — and these 12 hidden features are more useful than Siri AI ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/ios-27-hidden-features</link>
                                                                            <description>
                            <![CDATA[ I've spent a few days with iOS 27, and these hidden features have impressed me more than Siri AI so far. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JejgrgsdCu3eWzDZMx9wDn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 12 Jun 2026 05:02:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Sanuj Bhatia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8p5BvMVA7cnu5AWkxnTjRC.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 logo on iPhone]]></media:description>                                                            <media:text><![CDATA[iOS 27 logo on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 logo on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qCqRx69EK98Yt86UK3KgVA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple spent a big chunk of <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> talking about the new Siri AI and how Apple Intelligence is set to transform the iPhone experience with iOS 27. The company is (once again) <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-was-apples-ai-renaissance-but-theres-one-very-important-feature-still-missing-from-ios-27">betting heavily on AI</a>, promising a much smarter Siri that can interact with apps and surface information buried deep inside your phone — something that the company believes will become one of the biggest reasons to upgrade to iOS 27.</p><p>The thing is, I've been using the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 beta</a> for the past couple of days, and like <a href="https://x.com/search?q=siri%20waitlist">many other users</a>, I'm still stuck on the Siri AI waitlist. So while Apple wants Siri to be the star of the show, I haven't actually been able to use most of its new capabilities yet. </p><p>What I <em>have</em> been able to use, however, are dozens of smaller changes scattered throughout iOS 27. And after spending some time with the update, I'd argue many of these features are more exciting than Siri AI. Here are some of the small and hidden iOS 27 features that have impressed me the most so far.</p><h3 class="article-body__section" id="section-save-images-from-videos-directly"><span>Save images from videos directly</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="c78ZgzsbfyeTEGZkHZdMmY" name="ios-27-hands-on-5" alt="Hands on with various iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/c78ZgzsbfyeTEGZkHZdMmY.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Raise your hand if you've ever recorded a video and then wanted to pull out a single frame as a photo. Until now, the usual workaround was taking a screenshot, cropping it, and then sharing it wherever you needed.</p><p>Thankfully, iOS 27 makes this much easier. While playing a video, you can <strong>tap the three-dot menu</strong> in the top-right corner and select <strong>Save Video Frame as Photo</strong>. iOS will then extract that frame and save it directly to your photo library as a standalone image in full resolution.</p><h3 class="article-body__section" id="section-more-control-over-icloud-photos-syncing"><span>More control over iCloud Photos syncing</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="thiG8CojaWrjyWnJ3gekZY" name="ios-27-hands-on-2" alt="Hands on with various iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/thiG8CojaWrjyWnJ3gekZY.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Not all of us buy iPhones with huge amounts of storage, which is why <a href="https://www.tomsguide.com/phones/iphones/i-pay-for-icloud-not-for-storage-but-for-this-perk-instead">iCloud ends up being pretty important</a>. One of the long-standing annoyances, though, is that iCloud Photos typically waits until your phone is connected to Wi-Fi and charging before it starts backing everything up.</p><p>With iOS 27, Apple is finally giving users more control. You'll now be able to force an immediate sync of your photo library to iCloud. So, for example, if you're traveling and taking lots of photos, you might want those images uploaded immediately in case your phone gets lost or stolen, or accidentally gets dropped in the pool.</p><p>And the best part is that you can enable the feature temporarily for a single day, and after that, iOS automatically reverts back to the normal syncing behavior.</p><h3 class="article-body__section" id="section-view-only-photos-taken-with-your-iphone"><span>View only photos taken with your iPhone</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uQpou4uz6wCaoTXKcfqDkY" name="ios-27-hands-on-4" alt="Hands on with various iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/uQpou4uz6wCaoTXKcfqDkY.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>This is something iPhone users have been asking for years, and Apple is finally doing something about it in iOS 27. </p><p>Until now, the Photos app has always lumped all images in your library together, whether they came from WhatsApp, Telegram, screenshots, or others. While Apple already separates things like videos and screenshots, there was never an easy way to see only the photos you had actually taken yourself. </p><p>With iOS 27, that's finally changing. Apple has added a new section that lets you view only the photos captured using your iPhone's camera. To find it, head to the <strong>Collections</strong> tab, then <strong>Utilities</strong>, and finally <strong>Captured by Me</strong>. </p><h3 class="article-body__section" id="section-independent-alarm-volume-controls"><span>Independent alarm volume controls</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4dY4qXkX6Rd8NA5wGnvwjY" name="ios-27-hands-on-7" alt="Hands on with various iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/4dY4qXkX6Rd8NA5wGnvwjY.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Android has had this for years, but Apple is finally bringing independent volume controls to the iPhone with iOS 27.</p><p>Until now, alarm volume was tied directly to your ringtone volume, which meant lowering one also affected the other. With iOS 27, you can finally set separate volume levels for alarms, ringtones, timers, and other system sounds. That means you can keep your ringtone volume relatively low while cranking up the alarm volume, or vice versa.</p><h3 class="article-body__section" id="section-the-clock-app-now-understands-holidays"><span>The Clock app now understands holidays</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bXpqb5sxM7DHvRkgTKngRi" name="IMG_9279" alt="iOS 26.1 timer with a slider to dismiss" src="https://cdn.mos.cms.futurecdn.net/bXpqb5sxM7DHvRkgTKngRi.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One small (yet useful) feature Apple added to the Clock app in iOS 27 is the ability to detect your days off. The feature uses your calendar and regional holidays to understand when you might not actually need to wake up early. </p><p>For example, if you have an alarm set for a weekday morning but the next day happens to be a public holiday, iOS can proactively ask whether you'd like to skip that alarm.</p><h3 class="article-body__section" id="section-share-a-phone-number-between-two-iphones"><span>Share a phone number between two iPhones</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MFu7d2DXVjRdBxS8LA8b4X" name="iPhone 17 vs iPhone 17 Pro" alt="iPhone 17 vs iPhone 17 Pro." src="https://cdn.mos.cms.futurecdn.net/MFu7d2DXVjRdBxS8LA8b4X.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Another interesting addition in iOS 27 is the ability to use the same phone number across two different iPhones. This should somewhat work like how an Apple Watch with cellular shares your iPhone number. Apple says you'll be able to use a single number across multiple iPhones, making it easier to switch between devices without juggling separate SIMs. </p><p>There are still a few unknowns here. It appears to be carrier-dependent, and it isn't known if there will be any additional fees involved. But if you're someone who regularly uses two iPhones at the same time, this could end up being surprisingly useful.</p><h3 class="article-body__section" id="section-voice-typing-is-much-smarter-on-ios-27"><span>Voice typing is much smarter on iOS 27</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ebFLiFtg4Mksm54YTw4peY" name="ios-27-hands-on-1" alt="Hands on with various iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/ebFLiFtg4Mksm54YTw4peY.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Apple is also bringing a much better voice typing to the iPhone with iOS 27. Using on-device AI, the feature can better understand context, recognize complex words, and automatically remove filler words like 'umm' and 'ahh' from your speech, similar to tools like Wispr Flow.</p><p>It is worth noting, though, that the feature requires Apple's newer on-device Siri models and is currently limited to the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-vs-iphone-16-pro-7-biggest-upgrades-you-need-to-know">iPhone 17 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air</a>.</p><p>If you own a supported iPhone, you can enable this by going to <strong>Settings > General > Keyboard</strong>, then turning on <strong>Advanced Dictation Preview</strong>. </p><h3 class="article-body__section" id="section-paste-copied-content-faster"><span>Paste copied content faster</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VSh9pWVZMkYympJEhwh8nY" name="ios-27-hands-on-8" alt="Hands on with various iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/VSh9pWVZMkYympJEhwh8nY.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Another small feature I noticed in iOS 27 is that the keyboard can now surface copied text and even screenshots directly in the suggestion bar. When you copy something and switch to another app, you'll see that content appear above the keyboard for quick pasting. </p><p>Previously, this mostly worked for one-time passcodes and links, but Apple is now expanding it much more broadly.</p><h3 class="article-body__section" id="section-show-more-wallpaper-on-your-lock-screen"><span>Show more wallpaper on your Lock Screen</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="X6fmuNsHuHTG4oNkiyewqY" name="ios-27-hands-on-3" alt="Hands on with various iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/X6fmuNsHuHTG4oNkiyewqY.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>If you're like me and prefer seeing more of your wallpaper and less clock, iOS 27 now lets you use a smaller Lock Screen clock with the date and time displayed in a single row at the top. </p><p>It's a small change, but it helps show off more of your wallpaper. Apple has also finally made playback controls dismissible on the Lock Screen. You can now swipe them away, just like notifications, which is especially useful when streaming content from an Apple TV.</p><h3 class="article-body__section" id="section-connectivity-assist"><span>Connectivity Assist</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vbTX2eyB2jqZqkBhsLTviY" name="ios-27-hands-on-6" alt="Hands on with various iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/vbTX2eyB2jqZqkBhsLTviY.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>If your Wi-Fi connection is weak or inconsistent, iOS 27 can now automatically use cellular data alongside Wi-Fi to keep things running smoothly. Apple calls this Connectivity Assist. The feature can help maintain faster and more reliable speeds, although it may increase mobile data usage. In my case, it used around 300MB in just 48 hours. </p><p>You can enable it by heading to <strong>Settings > Wi-Fi > Connectivity Assist</strong>.</p><h3 class="article-body__section" id="section-add-your-own-passes-to-apple-wallet"><span>Add your own passes to Apple Wallet</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="i5ubVCYEZFdLNRuSyCQWyK" name="apple-wallet-custom-pass-ios-27" alt="Creating a Custom Pass on Apple Wallet" src="https://cdn.mos.cms.futurecdn.net/i5ubVCYEZFdLNRuSyCQWyK.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Apple is finally bringing one of the most requested features to the Wallet app with iOS 27: the ability to create custom passes. </p><p>The feature lets you manually add things like event tickets, memberships, and other passes directly to Apple Wallet. For example, if you have a physical ticket but no digital version, you can simply scan it with your iPhone and create a Wallet pass from it.</p><p>When creating a pass, Apple gives you a few templates to choose from, including membership and event passes. You can then customize details such as the pass name, location, admission type, membership number, and even the background design.</p><h3 class="article-body__section" id="section-airpods-pro-3-gains-gymkit-support"><span>AirPods Pro 3 gains GymKit support</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Q7LZEeQj46Hd3tBS5MiM2b" name="Airpods_pro 3.JPG" alt="A pair of Apple AirPods Pro 3" src="https://cdn.mos.cms.futurecdn.net/Q7LZEeQj46Hd3tBS5MiM2b.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Finally, one of the most underrated additions in iOS 27, at least in my opinion, is that Apple is expanding GymKit support to the <a href="https://www.tomsguide.com/audio/airpods/airpods-pro-3-vs-airpods-pro-2-5-biggest-rumored-upgrades">AirPods Pro 3</a>. This means you'll now be able to connect not just your Apple Watch, but also your AirPods directly to supported gym equipment for the first time. </p><p>AirPods Pro 3 <a href="https://www.tomsguide.com/audio/airpods/i-compared-the-apple-airpods-pro-3s-heart-rate-readings-vs-a-chest-strap-and-the-results-shocked-me">can already track your heart rate</a>, and with this feature, just as you would tap your Apple Watch against a reader to pair it, you'll now be able to pair your earbuds with compatible cardio equipment, treadmills, ellipticals, and exercise bikes, to keep track of metrics like pace, heart rate, and more.</p><h2 id="bottom-line-5">Bottom line</h2><p>Having spent a few days with the beta, it's becoming pretty clear that iOS 27 is much more than a Siri AI update.</p><p>In fact, in addition to the features mentioned above, Apple <a href="https://www.apple.com/newsroom/2026/06/apple-unveils-innovative-features-and-intelligence-experiences-across-services/" target="_blank">says</a> iOS 27 also focuses heavily on the <em>fundamentals</em>. The company claims things like app launches, AirDrop transfers, and general system responsiveness have all been improved. </p><p>We'll have to wait and see whether <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI lives up to Apple's promises</a>. But even if it doesn't, iOS 27 already feels like a surprisingly substantial update.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-is-coming-and-theres-already-evidence-of-its-existence-in-ios-27-beta">iPhone Ultra is coming, and there's already evidence of its existence in iOS 27 beta</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-adds-more-parental-controls-to-its-devices-in-ios-27-heres-whats-new">Apple Time Allowance adds more parental controls to its devices in iOS 27 — here's what's new</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-installed-the-ios-27-beta-and-reframe-is-unlike-any-other-ai-feature-ive-come-across">I just installed the iOS 27 beta — and Reframe is unlike any other AI feature I’ve come across</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Some AI features aren't available on older iPhones, but are you actually missing that much? ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/apple-intelligence/some-ai-features-arent-available-on-older-iphones-but-are-you-actually-missing-that-much</link>
                                                                            <description>
                            <![CDATA[ Two new Apple Intelligence features are exclusive to the newest iPhones, but is that actually a big deal? Here's what you'd miss out on. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ynuReBzcNFSvPRQYAfKKhK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GsbtWDUdwwj7SkthmbUhTE-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Jun 2026 14:26:52 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple Intelligence]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/GsbtWDUdwwj7SkthmbUhTE-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Using side button on iPhone to access Siri at WWDC 2026]]></media:description>                                                            <media:text><![CDATA[Using side button on iPhone to access Siri at WWDC 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Using side button on iPhone to access Siri at WWDC 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GsbtWDUdwwj7SkthmbUhTE-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you were paying attention to the <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> keynote earlier this week, you'll know that all of the amazing new Apple Intelligence features are not coming to every iPhone. Apple confirmed that some of <a href="https://www.tomsguide.com/phones/iphones/only-the-iphone-17-pro-and-iphone-17-air-get-apples-most-powerful-on-device-apple-intelligence-model-heres-what-that-means">those features will be exclusive to just three iPhone models</a>: <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a>, <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone 17 Air</a>. </p><p>iPads and Macs also have similar restrictions. The full suite of Apple Intelligence features will only be available on select iPads and Macs with the correct Apple Silicon chip and at least 12GB of RAM. Macs need an M3 chip or newer, while iPads need an M4 or M5. </p><p>This is not ideal news for the people who don't have those devices, and that's going to be especially frustrating for anyone with a standard<a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review"> iPhone 17</a>. But the real question here is whether this is actually anything to be worried about?</p><h2 id="what-these-devices-can-actually-do">What these devices can actually do</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="edrAXHE9g3bm9Ewc5ZC3R9" name="iPhone 17 Pro review" alt="iPhone 17 Pro review." src="https://cdn.mos.cms.futurecdn.net/edrAXHE9g3bm9Ewc5ZC3R9.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>According to Apple, all the compatible devices have exclusive access to the "most powerful on-device model," also known as Apple Foundation Models (AFM) Core Advanced. While Apple made it sound like some key features would be locked away with this model, and only available on a small handful of new devices, that's actually not the case.</p><p>According to Apple's <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a> <a href="https://go.redirectingat.com/?id=92X363&xcust=trd_gb_1277468617037947102&xs=1&url=https%3A%2F%2Fwww.apple.com%2Fnewsroom%2F2026%2F06%2Fapple-introduces-siri-ai-a-profoundly-more-capable-and-personal-assistant%2F&sref=https%3A%2F%2Fwww.techradar.com" target="_blank">press release</a>, there are only two features exclusive to the AFM Core Advanced model: Voice customization and advanced systemwide dictation. The former lets you customize the expressiveness and pace of Siri AI's voice, beyond the capabilities of the pre-set Siri voices that are available to everyone. </p><p>Advanced system-wide dictation is exactly what it sounds like, and means compatible devices will be a lot better at converting speech into text. According to Apple, you can "speak naturally and trust that [your] words will appear clearly, accurately, and as intended." </p><p>Honestly? These are the kinds of features you can probably live without. Customizing Siri's voice sounds cool, but it's not as though there aren't alternate options available on older Apple devices. There are currently 19, if my counting is correct, covering different nationalities, accents and genders.</p><div><blockquote><p>Unless you are likely to use dictation features regularly, then missing out on this particular upgrade isn't a huge deal.</p></blockquote></div><p>Similarly, improved speech-to-text sounds like a good idea, especially considering how awful Apple's current capabilities are. But is that something you're actually going to use very often? I only ever use speech-to-text if I'm carrying my baby son, since I find typing one-handed slow and awkward. Others may feel differently, but unless you are likely to use dictation features regularly, then missing out on this particular upgrade isn't a huge deal.</p><p>It's important to note that improvements to dictation don't actually affect how Siri understands you. The new conversational models should still improve your overall Siri experience regardless of which AI-compatible iPhone you have. That's the <a href="https://www.tomsguide.com/reviews/iphone-15-pro">iPhone 15 Pro </a>and newer, for those who have forgotten.</p><h2 id="things-may-change-in-the-future">Things may change in the future</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KFDpjxdB4rtP68S2yvVhv" name="iPhone Air-LIST1" alt="iPhone Air shown in hand" src="https://cdn.mos.cms.futurecdn.net/KFDpjxdB4rtP68S2yvVhv.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We don't fully know what the differences are between AFM Core Advanced and the AFM Core model that's available on older iPhone models — beyond the fact the Advanced model needs 12GB of RAM and Core only needs 8GB. Good thing <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAM prices are so low</a> right now, right? Right??</p><p>But as minimal as the feature differences appear to be right now, that will likely change in the future. More advanced AI features will require better models and more resources to function properly. In the same way that Apple Intelligence wasn't available on <a href="https://www.tomsguide.com/reviews/apple-iphone-15">iPhone 15</a> or older, future features will presumably arrive exclusively on iPhone 17 Pro and above. </p><p>We don't know when that might happen, though. It's possible that Apple could have some secret <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> features hiding up its sleeve, ready to be unveiled at a future date — possibly alongside the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro</a>. Then again, such features may not arrive until the launch of iOS 28 next year. Hopefully, by that point, there will be a bunch more iPhones that have full access to all the Apple AI on offer.</p><p>Here's hoping that the<a href="https://www.tomsguide.com/phones/iphones/iphone-18-tipped-for-cost-cutting-downgrades-heres-what-we-know"> rumors of a downgraded</a> <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18</a> aren't true. If that phone arrives with less than 12GB of RAM, news of even more AI features that they can't use is bound to make a bunch of them rather unhappy.</p><p>Some people already are, and have taken to social media to express their grievances. The decision to not support everything on a "less than 2-year-old AI device" has been called <a href="https://x.com/iupdate/status/2064047793929699621?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E2064047793929699621%7Ctwgr%5E07b40c3df53b80072bf58be7e84488d58fec6624%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.techradar.com%2Fphones%2Fios%2Fonly-3-iphones-can-access-the-best-version-of-siri-ai-heres-which-features-are-exclusive-to-apples-most-powerful-on-device-model-afm-core-advanced" target="_blank">"insane"</a> by one X user, while there are a bunch of Redditors lamenting the decision, including those people who only recently <a href="https://www.reddit.com/r/Applelntelligence/comments/1u2uyua/i_feel_like_an_idiot_right_now/" target="_blank">purchased a standard iPhone 17</a>. </p><p>One Reddit user declared that they want their <a href="https://www.reddit.com/r/iphone/comments/1u0l7ul/comment/oql6is3/" target="_blank">"f****** money back</a>," which seems a big extreme, while another declared the whole thing to be <a href="https://www.reddit.com/r/iphone/comments/1u0l7ul/comment/oqkfl77/" target="_blank">"a scam"</a> because the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16-pro-review">iPhone 16 Pro</a> was supposedly made for Apple Intelligence. But for every complaint, there seem to be<a href="https://www.reddit.com/r/Applelntelligence/comments/1u2umge/why_is_everyone_acting_like_apple_intentionally/" target="_blank"> several other people pointing out that</a> the only thing these people are missing out on is Siri's voice adjustment and the improved dictation. </p><h2 id="bottom-line-6">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nChN6QF6WoLSu7FdeqPcdX" name="siri.shutterstock_2476041331" alt="Siri logo on phone" src="https://cdn.mos.cms.futurecdn.net/nChN6QF6WoLSu7FdeqPcdX.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>iOS 27 is now effectively a three-tier software update, thanks to the differing requirements of Apple Intelligence. <strong>iPhone 17 Pro and up get access to everything, while anyone with an iPhone 15 Pro or newer gets all the AI they want — minus those two Siri features.</strong> Older models, from iPhone 15 back to <a href="https://www.tomsguide.com/reviews/iphone-11">iPhone 11</a>, get zero access to AI at all. Though this isn't really any different from the way things were before.</p><p>That means if you care about having every single facet of AI on your iPhone, you're going to have to be very particular next time you pick up an iPhone. Especially since this situation will likely repeat itself at some point in the foreseeable future. On-device AI needs a lot of memory to operate, and there's going to be a point where even the iPhone 17 Pro isn't capable of running everything. </p><p>It's just a sad fact that those people who try and run their devices into the ground before upgrading may be left out in the cold a little earlier than they otherwise would. But if the exclusive AI features of the future are as inconsequential as these two exclusives, then it might not matter so much.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/facetime-just-got-a-huge-upgrade-thanks-to-ios-27-heres-how-to-use-it">FaceTime just got a huge upgrade thanks to iOS 27 — here's how to use it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/im-a-loyal-android-user-but-even-i-admit-google-needs-to-steal-these-five-ios-27-features">I'm a loyal Android user, but even I admit Google needs to steal these five iOS 27 features</a></li><li><a href="https://www.tomsguide.com/phones/network-carriers/mint-mobile-just-gave-customers-a-rare-win-increased-data-at-no-extra-cost">Mint Mobile just gave customers a rare win —  increased data at no extra cost</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ FaceTime just got a huge upgrade thanks to iOS 27 — here's how to use it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/facetime-just-got-a-huge-upgrade-thanks-to-ios-27-heres-how-to-use-it</link>
                                                                            <description>
                            <![CDATA[ With iOS 27, you can split your camera on FaceTime — here's how dual capture mode works. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SJA9gFiTjD4i5Moi7kog6W</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Z5AREXkHH3WuxG2NVDBMVA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Jun 2026 11:03:51 +0000</pubDate>                                                                                                                                <updated>Fri, 12 Jun 2026 08:54:45 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Z5AREXkHH3WuxG2NVDBMVA-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Apple/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 logo on iPhone]]></media:description>                                                            <media:text><![CDATA[iOS 27 logo on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 logo on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Z5AREXkHH3WuxG2NVDBMVA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>FaceTime is getting a powerful upgrade with iOS 27: Dual Capture support. You can now show both your front-facing camera and rear camera at the same time during FaceTime calls. </p><p>Say goodbye to "one sec, let me flip my camera." This upgrade lets you share your surroundings and stay on screen simultaneously. The feature works <a href="https://www.tomsguide.com/phones/iphones/ios-27-supported-devices-see-which-iphones-did-and-didnt-make-the-cut">on compatible iPhones with iOS 27. </a></p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><p>If you want to test it now, the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developer beta</a> is available to download for users now, as long as you've registered. </p><h2 id="which-iphones-support-dual-capture-on-facetime">Which iPhones support Dual Capture on FaceTime?</h2><p>For now, this is strictly an<strong> iPhone 17+ exclusive</strong>. While older iPhones can view your dual-camera stream, only Apple's latest lineup has the hardware muscle to actually broadcast one. <br><br>These are the exact models you'll need:</p><ul><li>iPhone 17</li><li>iPhone 17 Pro</li><li>iPhone 17 Pro Max</li><li>iPhone Air</li></ul><section class="howto-block">                    <h3>How to use Dual Capture on FaceTime</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/kpogKpYgzbgcq6fmrp3h6J.jpg"                                        alt="FaceTime app on iPhone"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/kpogKpYgzbgcq6fmrp3h6J.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p><strong>Open FaceTime and start a call with someone</strong>. During the call,<strong> tap the Flip button</strong> on your camera viewfinder. Your rear camera activates alongside your front camera, showing both views on the call.</p><p><strong>Tapping Flip again lets you disable the rear camera </strong>and return to front-camera only. The default is to keep your front camera active when you switch to the rear camera, so the other person always sees your face.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xrmd0O"></div>                            </div>                            <script src="https://kwizly.com/embed/Xrmd0O.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27">Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27</a></li><li><a href="https://www.tomsguide.com/phones/iphones/check-your-iphone-right-now-3-privacy-settings-you-need-to-turn-off-immediately">Check your iPhone right now: 3 privacy settings you need to change immediately</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-buried-a-genius-browsing-feature-in-your-iphone-settings-and-its-genuinely-useful">Apple fixed the single most frustrating thing about browsing on iPhone — you just have to turn it on</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm a loyal Android user, but even I admit Google needs to steal these five iOS 27 features ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/im-a-loyal-android-user-but-even-i-admit-google-needs-to-steal-these-five-ios-27-features</link>
                                                                            <description>
                            <![CDATA[ Apple has added a bunch of new features to iOS 27 and Apple Intelligence, and Google should be itching to steal them for Android as soon as possible. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">r9XPNcBfBFB88vb8myecH8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YPmtfhWqnuiZkoGGSBRzNG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Jun 2026 09:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YPmtfhWqnuiZkoGGSBRzNG-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 logo on iPhone]]></media:description>                                                            <media:text><![CDATA[iOS 27 logo on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 logo on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YPmtfhWqnuiZkoGGSBRzNG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple and Google have a long and storied history of "borrowing" ideas from one another, especially when iOS and Android are concerned. Things have gotten to the point where, after years of back and forth, the number of unique features on each platform is pretty low. </p><p>But each new iteration of Android and iOS software comes with some exclusive new features that the other platform could benefit from. The reveal of <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> at <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> is no exception, and there are plenty of impressive things that will be launching on iPhones later this year. </p><p>I've been a loyal Android user for the past 15 years, and even I have to admit that Google should be taking notes right about now. Android should definitely steal these five iOS 27 features as soon as possible.</p><h2 id="reframe">Reframe</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qdcSyLJHMU6cbnfCN2Lj8S" name="WWDC 2026 — June 8 _ Apple 1-5-46 screenshot" alt="Apple Intelligence features in Photos at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/qdcSyLJHMU6cbnfCN2Lj8S.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The iOS 27 feature that stole the show at WWDC, <a href="https://www.tomsguide.com/phones/iphones/i-just-installed-the-ios-27-beta-and-reframe-is-unlike-any-other-ai-feature-ive-come-across">Reframe is an AI-powered photo editing tool </a>that is unique to iOS 27 — and it shouldn't stay that way for long.</p><p>The purpose of Reframe involves something Apple calls "Spatial Reframing." That means Reframe is capable of taking your photos and altering the perspective, changing the look and angle in the process. Best of all, it doesn't just work on Apple's spatial photos, or even photos taken on an iPhone. The photos can come from any camera, and Apple Intelligence will be able to run them through Reframe. </p><p>You adjust the perspective on your screen, based on a real-time preview, and generative AI will fill in all the gaps to make it look as though you shot that photo from a totally different angle. This means you don't need to worry so much about photo composition, because iOS 27 will be able to fix it for you.</p><h2 id="new-parental-controls">New parental controls</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pQvRH4QG4FAVARNXrYCvU8" name="WWDC 2026 — June 8 _ Apple 27-16 screenshot" alt="Shared Time Allowance on iPhone" src="https://cdn.mos.cms.futurecdn.net/pQvRH4QG4FAVARNXrYCvU8.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Android already has child accounts for under-13s, and there are some fairly robust parental controls available to parents. But this doesn't mean improvements couldn't be made, and Apple's WWDC presentation offered a few ideas on where Google can take things.</p><p>The thing that helps set <a href="https://www.tomsguide.com/phones/iphones/apple-adds-more-parental-controls-to-its-devices-in-ios-27-heres-whats-new">Apple's new parental controls</a> apart is that they're not about generalized blocks on certain kinds of content. Kids attempting to access certain sites or apps can send a request to their parents' device, which lets them gauge the suitability for that individual thing at their own leisure. It's not about setting up keywords or blocking specific categories; parents can deal with these things on a case-by-case basis.</p><p>Similarly, the new Time Allowances feature lets parents decide on limits for specific app categories, but not others. Not only does that offer some nuance to the way their kids interact with Apple devices, but it also means parents don't need to block every individual app.</p><h2 id="shortcuts">Shortcuts</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pm8wSE5zzj7mWXvJNhzvr4" name="WWDC 2026 — June 8 _ Apple 1-2-30 screenshot" alt="Shortcuts with Apple Intelligence across devices at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/pm8wSE5zzj7mWXvJNhzvr4.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The Shortcuts app is not new for iOS 27, and has been available in various forms for over a decade. But there's still no native Android app for creating automations, leaving users at the mercy of third-party offerings on Google Play. I'm not saying those options are bad, but if there's a time for Google to launch its own Shortcuts-style app on Android, it's now. </p><p>iOS 27 is set to give Shortcuts one of its biggest updates with the addition of prompt-based creation. Before, Shortcuts required some know-how, which could be intimidating for users who didn't know exactly what they were doing. Adding the option to describe what automation you want and have Apple Intelligence create those shortcuts right away makes the whole process so much simpler.</p><p>Considering Google's push to have Gemini do more for you and make the whole process of using AI even easier, this is exactly the kind of native feature that Android could benefit from.</p><h2 id="bringing-ai-back-to-the-camera">Bringing AI back to the camera</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="H8KRbavTQToDqqJyKVwRSM" name="WWDC 2026 — June 8 _ Apple 50-8 screenshot" alt="Siri mode in Camera at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/H8KRbavTQToDqqJyKVwRSM.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>I'm not talking about AI processing after you take a photo. Every Android phone does that, and has been doing so for several years now. I'm actually talking about how Apple has brought a new <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri Mode to the iPhone camera</a>, and essentially replaced Visual Intelligence as a standalone feature.</p><p>Google Pixel phones used to have a special mode for Google Lens, but that was removed a few years back. The app is capable of offering some contextual Lens features, such as translation or QR code scanning, but there's no clear and defined AI mode. Adding Gemini Live might make more sense than reintroducing Lens, especially now that Circle to Search is so well established. But it should still happen.</p><p>Of course, making it happen for every Android phone might be a little harder, since different manufacturers tend to use their own default camera app. But even making the change on Google's own Pixels would be a good start.   </p><h2 id="automatically-changing-passwords">Automatically changing passwords</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7qY6G6U6Eugc4c5EnVZzpH" name="WWDC 2026 — June 8 _ Apple 57-15 screenshot" alt="Apple Passwords automatically fixing passwords via Apple Intelligence" src="https://cdn.mos.cms.futurecdn.net/7qY6G6U6Eugc4c5EnVZzpH.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple )</span></figcaption></figure><p>Google has had a password manager for a long time, but it's been clear over the last few years that it's severely lacking compared to Apple's offering. Android lacks features like integrated authentication code support and now iOS 27 is smartening up <a href="https://www.tomsguide.com/computing/password-managers/apple-passwords-review">Apple Passwords</a> in other big ways.</p><p>Thanks to the addition of agentic AI, Apple Passwords will soon be able to change weak passwords for you — without any intervention on your part. In other words, if your passwords are caught up in some kind of data breach, Apple Intelligence should automatically change it for you. </p><p>That way, you don't have to check breach reports, log into your old accounts, and go through the motions of swapping one password for another. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ww17PX"></div>                            </div>                            <script src="https://kwizly.com/embed/Ww17PX.js" async></script><h2 id="bonus-more-system-refinements">Bonus: More system refinements</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3858px;"><p class="vanilla-image-block" style="padding-top:52.57%;"><img id="D8JHojF7g6q5yQJozcyjDN" name="shutterstock_2746260993" alt="iOS 27 features" src="https://cdn.mos.cms.futurecdn.net/D8JHojF7g6q5yQJozcyjDN.jpg" mos="" align="middle" fullscreen="" width="3858" height="2028" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Aside from improving its AI prowess, Apple's main focus with iOS 27 is to improve the overall performance of the software itself. According to Apple, its engineers have been scouring the operating system for anything that can be improved and refined to improve the speed and generally bolster performance on a system level.</p><p>Optimizing software is one of the things Apple is best known for, and it means iPhone and iOS work together in a much more harmonious way than even the best Android phones can hope for. This is why Google should go ahead and do something similar with a future version of Android. The results may not be as impressive, considering Android has to be able to run on more phones than I can count, but any attempt to improve the platform's efficiency and performance can only be a good thing.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-is-coming-and-theres-already-evidence-of-its-existence-in-ios-27-beta">iPhone Ultra is coming, and there's already evidence of its existence in iOS 27 beta</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/siri-ai-may-actively-encourage-users-to-take-a-break-from-it-something-chatgpt-gemini-and-claude-told-me-they-dont-do">Siri AI may actively encourage users to take a break from it — something ChatGPT, Gemini and Claude told me they don't do</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/i-just-saw-the-new-siri-ai-in-action-at-wwdc-heres-what-i-like-and-what-still-needs-work">I saw the new Siri AI in action at WWDC — and those 'Siri is stupid' jokes could soon be obsolete</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Your iPhone alarm and ringtone don’t have to share a volume slider anymore — here’s how to split them in iOS 27 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/your-iphone-alarm-and-ringtone-dont-have-to-share-a-volume-slider-anymore-heres-how-to-split-them-in-ios-27</link>
                                                                            <description>
                            <![CDATA[ It took Apple years, but iOS 27 finally adds independent volume control. Here is how to find the toggle. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zFU4imzWVncP9zG9o64Q7X</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Z5AREXkHH3WuxG2NVDBMVA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Jun 2026 07:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 11 Jun 2026 09:25:57 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Z5AREXkHH3WuxG2NVDBMVA-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Apple/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 logo on iPhone]]></media:description>                                                            <media:text><![CDATA[iOS 27 logo on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 logo on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Z5AREXkHH3WuxG2NVDBMVA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>iOS 27 finally delivers a feature iPhone users have requested for years: independent volume control. Under the new settings, your alarms, timers, and notifications no longer share a single slider.</p><p>It never made sense to treat high-priority alerts and background notifications the same way. Because everything was tied to a single slider, making a minor adjustment to your daytime audio levels meant risking a missed wake-up call later.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><p>Now, Apple is separating these sounds instead of bundling them together. It's a simple, long-overdue quality-of-life improvement that finally makes managing your iPhone audio practical.</p><h2 id="download-the-ios-27-beta-if-you-haven-t-yet">Download the iOS 27 beta if you haven't yet</h2><p>This feature is currently available only in the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developer beta</a>. If you haven't installed it yet, you can get it now.</p><p><a href="https://developer.apple.com/programs/enroll/" target="_blank">Register as an Apple developer </a>if you don't already have an account; it's free. Then open Settings,<strong> go to General, Software Update, Beta Updates, and select iOS 27 Developer Beta</strong>. Your iPhone automatically downloads and installs the beta.</p><section class="howto-block">                    <h3>How to use independent volume controls</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/bXpqb5sxM7DHvRkgTKngRi.jpg"                                        alt="iOS 26.1 timer with a slider to dismiss"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/bXpqb5sxM7DHvRkgTKngRi.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p><strong>Go to Settings and open Sounds & Haptics</strong>, then <strong>look for "Match Ringtone Volume" and toggle it off</strong>. Once disabled, you'll see separate sliders for ringtone volume, alarm volume, and system alert volume.</p><p><strong>Adjust each slider independently</strong> to set the levels you want. You can keep your ringtone quiet while setting alarms louder, or mute notifications without affecting calls. Wake-Up alarms set through the Bedtime app are managed separately. </p><p>If you prefer the old unified approach, <strong>keep the "Match Ringtone Volume" toggle on</strong>.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xrmd0O"></div>                            </div>                            <script src="https://kwizly.com/embed/Xrmd0O.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/check-your-iphone-right-now-3-privacy-settings-you-need-to-turn-off-immediately">Check your iPhone right now: 3 privacy settings you need to change immediately</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-thought-i-knew-all-my-iphone-camera-features-i-was-wrong">I thought I knew all my iPhone's camera features — I was wrong</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-buried-a-genius-browsing-feature-in-your-iphone-settings-and-its-genuinely-useful">Apple fixed the single most frustrating thing about browsing on iPhone — you just have to turn it on</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 13 underrated iOS 27 features that will make your life easier ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/13-most-underrated-ios-27-features-you-need-to-know</link>
                                                                            <description>
                            <![CDATA[ Outside of Siri AI, iOS 27 has several new features that you may have missed. Here are TK of them. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dYifcHmLRNPNcNuqac3q3E</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Jun 2026 04:15:00 +0000</pubDate>                                                                                                                                <updated>Thu, 11 Jun 2026 12:11:53 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Apple/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:description>                                                            <media:text><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The new <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a> took up most of the breathing room at WWDC 2026, but <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> isn't just about AI. I've dug through Apple's listed improvements for the iPhone operating system and found 13 underrated features that you may have missed.</p><p>Some of these features are major improvements to performance while others are brand new tools like AirPods EQ. Here are my 13 underrated iOS 27 features (so far).</p><h2 id="airpods-eq">AirPods EQ</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LLNGsYFmwerjdu5vWPM5en" name="WWDC 2026 — June 8 _ Apple 18-4 screenshot" alt="Custom EQ for AirPods" src="https://cdn.mos.cms.futurecdn.net/LLNGsYFmwerjdu5vWPM5en.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple is finally bring customizable EQ settings to your AirPods. It should be supported by the AirPods Pro 3 and AirPods Pro 2, as well as AirPods 4. It will likely feature in the AirPods Max 2. You can control the lows, mids and highs in real time just by using your finger.</p><h2 id="airdrop-transfers-get-a-speed-boost">AirDrop transfers get a speed boost</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Xs2eD32UfHKbap5V7whfAL" name="airdrop-lede.jpeg" alt="iOS 17 AirDrop" src="https://cdn.mos.cms.futurecdn.net/Xs2eD32UfHKbap5V7whfAL.jpeg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Sick of slow AirDrops? With iOS 27, AirDrop transfers are now much quicker. According to Apple, transfers of photos or files between devices will be up to 80% faster, though presumably the other device will need to be running iOS 27, macOS 27 or iPadOS 27.</p><h2 id="liquid-glass-now-has-a-slider">Liquid Glass now has a slider</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aygmtQLWrQo6eSTgUyZSCc" name="WWDC 2026 — June 8 _ Apple 10-11 screenshot" alt="Liquid Glass slider at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/aygmtQLWrQo6eSTgUyZSCc.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Liquid Glass was a somewhat controversial addition to iOS last year, and Apple seems aware of that. With iOS 27, Apple adds a new set of refinements for Liquid Glass. </p><p>It's been adjusted to improve readability, but also there's a new system-wide slider to alter how transparent the effects actually are. Liquid Glass also gets a new layered effect, which gives icons a more 3D look.</p><h2 id="facetime-dual-capture">FaceTime Dual Capture</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kpogKpYgzbgcq6fmrp3h6J" name="factime.shutterstock_2792657511" alt="FaceTime app on iPhone" src="https://cdn.mos.cms.futurecdn.net/kpogKpYgzbgcq6fmrp3h6J.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Here's one you may have missed, I did in the initial announcement but FaceTime now has the ability to stream both your front and rear cameras at the same time during FaceTime calls. </p><p>This allows you to share what you're looking at while still having your face in the call. As an inveterate camera flipper during FaceTime calls this is a much needed feature.</p><h2 id="giant-homescreen-widgets">Giant Homescreen Widgets</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mB82MAMQXK2u8W3p5quxDa" name="iOS 27 widgets" alt="iOS 27 big widgets" src="https://cdn.mos.cms.futurecdn.net/mB82MAMQXK2u8W3p5quxDa.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: 9to5Mac)</span></figcaption></figure><p>With iOS 27 you can now make extra-large widgets, including a whole Home Screen page dedicated to a single widget. t's not clear how many app widgets you can do this with but Apple notes specifically Calendar, Photos, and Music and "more apps."</p><h2 id="security-cameras-meet-apple-intelligence">Security cameras meet Apple Intelligence</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Yu6ZEwU8z3uyngEjtJNgEa" name="ios 27 security cameras" alt="iOS 27 security camera footage" src="https://cdn.mos.cms.futurecdn.net/Yu6ZEwU8z3uyngEjtJNgEa.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>In a <a href="https://www.tomsguide.com/home/smart-home/apple-intelligence-security-camera-features-just-seriously-undercut-ring-and-google">move that should scare Nest and Ring</a>, Apple now lets security camera users get detailed video descriptions of what's happening in not just individual videos, but across all stored video. In addition, you'll also be able to use natural language search to more easily look for specific events. Plus, you'll now be able to store 4K video, an upgrade from 1080p.</p><h2 id="improved-system-search">Improved System Search</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1806px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="SkjbjrqFXRL5ZvWNDWdx7c" name="mail-categorization-ios18.jpeg" alt="iOS 18 Mail categorization" src="https://cdn.mos.cms.futurecdn.net/SkjbjrqFXRL5ZvWNDWdx7c.jpg" mos="" align="middle" fullscreen="" width="1806" height="1016" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>A lot of iOS 27 updates are about optimization, but I wanted to specifically call out search. </p><p>Apple says that its rebuilt search in Spotlight, Photos and Mail with a more comprehensive index of your content that will stay up to date throughout the day. As an example, a new ranking system will surface the top five most relevant emails in response to a query. This should make the email you want more likely to be the first thing you see.</p><h2 id="menopause-tracking">Menopause tracking</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TGHv4qjoBVbDDW9W2fZFRY" name="iOS 27 health edit" alt="iOS 27 Health app" src="https://cdn.mos.cms.futurecdn.net/TGHv4qjoBVbDDW9W2fZFRY.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple )</span></figcaption></figure><p>Support for tracking perimenopause and menopause is coming to the Health app in iOS 27 and will also be trackable using your <a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year">Apple Watch with watchOS 27</a>.</p><p>Cycle tracking will provide notifications when your cycle indicates patterns that are suggestive of perimenopause. In the app, you can log related symptoms and find educational tools to better understand the changes.</p><h2 id="better-performance-and-optimization">Better performance and optimization</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yHiM92YPTiEXgdPw7acod8" name="WWDC 2026 — June 8 _ Apple 13-0 screenshot" alt="Everything is faster on Mac and iPhone at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/yHiM92YPTiEXgdPw7acod8.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has made a lot of under-the-hood improvements to iOS 27 to make it feel more responsive. These include 30% faster app launches and 70% faster loading of new captures in Photos. In addition, you should enjoy faster device switching between Wi-Fi and cellular connections.</p><p>The best part? iOS 27 supports phones as old as the iPhone 11, just like iOS 26.</p><h2 id="photos-improvements">Photos Improvements</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:650px;"><p class="vanilla-image-block" style="padding-top:56.31%;"><img id="TudNrVUcfdQQjw2SJ23JVd" name="iOS 18 Photos app redesign" alt="redesigned photos app in iOS 18" src="https://cdn.mos.cms.futurecdn.net/TudNrVUcfdQQjw2SJ23JVd.png" mos="" align="middle" fullscreen="" width="650" height="366" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The iOS Photos apps is supposed to receive several improvements as part of iOS 27, but I wanted to highlight four that I think will be quite useful.</p><ul><li><strong>Shared Albums improvements: </strong>You now get full-resolution sharing and can add Android or Windows users. Plus, you can expire an album after 30 days and quickly save photos to your library with a single tap.</li><li><strong>Slideshows: </strong>Create and save slideshows of photos and vidoes with some editing options. The slideshow can be saved as a video.</li><li><strong>Video frame</strong>: Now you can go into a video and a save a single frame a photo. No screenshots necessary.</li><li><strong>Filters & keywords: </strong>Apple will let you add keywords to photos to help you search more easily. Plus you can put star ratings on photos to filter by raiting. Additionally, there is a new "Captured by Me" collection that only has photos you've taken using the Camera, including ones from previous iPhones. This can be seen using filters or the dedicated collection.</li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/apple-intelligence/apple-intelligence-finally-comes-into-its-own-but-wwdc-26-was-missing-something">Apple Intelligence finally comes into its own, but WWDC 26 was missing something</a></li><li><a href="https://www.tomsguide.com/phones/iphones/7-things-the-leaks-got-wrong-about-apples-wwdc-2026-keynote">7 things the leaks got wrong about Apple’s WWDC 2026 keynote</a></li><li><a href="https://www.tomsguide.com/home/smart-home/apple-intelligence-security-camera-features-just-seriously-undercut-ring-and-google">Apple Intelligence security camera features just seriously undercut Ring and Google</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 things the leaks got wrong about Apple’s WWDC 2026 keynote ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/7-things-the-leaks-got-wrong-about-apples-wwdc-2026-keynote</link>
                                                                            <description>
                            <![CDATA[ Apple made several big reveals during its WWDC 2026 keynote, but the pre-show leaks and rumors also got a lot of things wrong. Here's what they are. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DFKBXtQpRXW6C45kgJhpaJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bXYwxdFVhhQ8wuZbo537nE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 10 Jun 2026 14:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bXYwxdFVhhQ8wuZbo537nE-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tim Cook at WWDC 2026]]></media:description>                                                            <media:text><![CDATA[Tim Cook at WWDC 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Tim Cook at WWDC 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bXYwxdFVhhQ8wuZbo537nE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple stayed true to form with <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a>, choosing to focus heavily on the software that powers all of its platforms. At the same time, the company wasn’t shy about sharing all the new features and capabilities of its turbocharged assistant, <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a>.</p><p>But despite that massive evolutionary leap, a flood of rumors and leaks ahead of the developers conference had left people expecting a lot more. Whether it was a matter of bad timing, or simply that Apple wasn't prepared enough for a proper reveal, the leaks got it completely wrong. Here’s the breakdown of what Apple didn’t announce.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="iphone-desktop-mode">iPhone desktop mode</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qoTCnYcWEQttCRGf3f4er8" name="iPhone 16 with MacBook Air 13-inch M3" alt="An iPhone 16 in hand in front of MacBook Air 13-inch M3 on table" src="https://cdn.mos.cms.futurecdn.net/qoTCnYcWEQttCRGf3f4er8.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>This feature was rumored to arrive with last year's iOS 26 update, but an <a href="https://www.tomsguide.com/phones/iphones/ios-19-could-add-a-desktop-mode-to-iphone-and-thats-a-fantastic-idea">iPhone desktop mode</a> never materialized. With rivals like Samsung, Google, and Motorola all offering robust desktop experiences when their phones connect to a monitor, it seemed certain that Apple would finally jump on the bandwagon.</p><p>That didn’t pan out, likely because of the broader impact it could have on Apple's other platforms. There have been long-running rumors about Apple essentially combining elements of iOS and macOS, which would be the core functionality of an iPhone desktop mode. Instead of a software-only reveal, Apple might be saving this feature to debut alongside future hardware, like the rumored MacBook Ultra or iPhone Fold.</p><h2 id="camera-app-customizations-and-controls">Camera app customizations and controls</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:59.60%;"><img id="Gb2NtqB7Z9YDEsZpRxQQeW" name="iOS 27 screenshot renders" alt="iOS 27 screenshot renders." src="https://cdn.mos.cms.futurecdn.net/Gb2NtqB7Z9YDEsZpRxQQeW.jpg" mos="" align="middle" fullscreen="" width="1510" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Bloomberg / Mark Gurman)</span></figcaption></figure><p>The iPhone’s camera got a big makeover last year with iOS 26 and Liquid Glass, but there were rumors of even <a href="https://www.tomsguide.com/phones/iphones/leaked-ios-27-screenshot-renders-give-us-our-first-look-at-the-new-siri-app-but-theres-way-more-that-im-excited-about">greater customization and controls coming with iOS 27</a>. In fact, it seemed like you'd be able to access a new "Add Widgets" panel for the features that matter most to you — like focal depth and precise exposure settings.</p><p>We didn’t see any of that. Instead, the only thing Apple mentioned about the Camera app during its keynote was a new Siri in Camera mode, essentially tasking the assistant with Visual Intelligence duties.</p><h2 id="siri-extensions">Siri extensions</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3602px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MFa9habauz7EeibXuc6KrX" name="ChatGPT Siri on iPhone iOS 18.2 LIST" alt="ChatGPT Siri on iPhone iOS 18.2" src="https://cdn.mos.cms.futurecdn.net/MFa9habauz7EeibXuc6KrX.jpg" mos="" align="middle" fullscreen="" width="3602" height="2026" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While we did end up seeing the dedicated Siri AI app in action during the presentation, Apple didn’t go into detail about the rumored <a href="https://www.tomsguide.com/phones/iphones/beyond-chatgpt-ios-27-extensions-will-reportedly-allow-siri-to-use-google-gemini-and-claude">“Extensions” tool</a> that would enable other AI chatbot services from the App Store to integrate with Siri AI — giving users a choice of which one to use.</p><p>Instead, Apple kept the focus entirely in-house, choosing to highlight its massive Siri AI reconstruction and Gemini-backed core processing rather than opening the floodgates to third-party rivals.</p><h2 id="apple-health-plus">Apple Health Plus</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1026px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="MQvzWjQY3KyffZrYnbGz9d" name="Health app and Apple Watch Cropped.jpg" alt="Apple Health on iPhone and Apple Watch" src="https://cdn.mos.cms.futurecdn.net/MQvzWjQY3KyffZrYnbGz9d.jpg" mos="" align="middle" fullscreen="" width="1026" height="577" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p><a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year">watchOS 27</a> got some airtime during Apple's WWDC 2026 keynote, but the presentation centered mostly around Siri AI support, <a href="https://www.tomsguide.com/wellness/smartwatches/ai-powered-siri-is-finally-coming-to-apple-watch-but-theres-a-big-catch">device compatibility</a>, and smaller health and fitness features.</p><p>Rumors leading up to the event had hinted at Apple working on a new <a href="https://www.tomsguide.com/news/apples-next-big-fitness-feature-could-be-an-ai-powered-coaching-service">Apple Health Plus service</a> for iOS 27, which would combine health and fitness tracking with deep AI personalization. Specifically, it was expected to bring advanced features like AI-powered calorie tracking through label scanning and custom fitness regimen creation to rival Google's offerings.</p><p>Instead, Apple scaled back its ambitious health launch, choosing to deliver more incremental updates like perimenopause insights and a phone-free Workout Buddy watch feature.</p><h2 id="satellite-connectivity-upgrades">Satellite connectivity upgrades</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kDCc32MvivyFqr2EjCavmR" name="iPhone-14_Emergency-SOS.jpg" alt="Share location via satellite iPhone 14" src="https://cdn.mos.cms.futurecdn.net/kDCc32MvivyFqr2EjCavmR.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Last fall after the iPhone 17 launch, there was a report that strongly indicated that iOS 27 would supercharge the iPhone's off-grid capabilities with<a href="https://www.tomsguide.com/phones/iphones/your-iphones-satellite-connectivity-could-soon-get-five-big-upgrades"> five major satellite connectivity upgrades</a> — including text-prompted photo sharing, native Apple Maps navigation without cell signal, and a breakthrough architecture that would allow for a connection while indoors.</p><p>Nothing of the sort was teased at WWDC 2026, so it’s likely going to be saved for later in the fall with its <a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models">iPhone 18 Pro</a> launch.</p><h2 id="airplay-alternatives">AirPlay alternatives</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2856px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="tBskbmLoD6wHBr5AjMiWp7" name="Screenshot_243.jpg" alt="apple airplay showing prehistoric planet on a tv screen" src="https://cdn.mos.cms.futurecdn.net/tBskbmLoD6wHBr5AjMiWp7.jpg" mos="" align="middle" fullscreen="" width="2856" height="1607" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Now that iPhones can wirelessly<a href="https://www.tomsguide.com/phones/android-phones/google-is-bringing-airdrop-support-to-more-android-phones-here-are-all-the-devices-that-will-get-it-next"> send files to select Android phones </a>through cross-platform sharing, it would've been the perfect time for Apple to reveal its intentions to expand wireless streaming beyond just <a href="https://www.tomsguide.com/how-to/how-to-airplay-to-an-apple-tv">AirPlay</a>.</p><p>Rumors leading up to WWDC 2026 suggested we would get even <a href="https://www.tomsguide.com/phones/iphones/the-eu-may-force-apple-to-make-another-massive-change-to-ios-27-but-it-might-not-affect-everyone">more native AirPlay alternatives</a> with iOS 27. Currently, AirPlay is the sole proprietary protocol built into iOS for wireless streaming, but reports indicated that other casting standards, like Google Cast, could receive native support in the new update.</p><p>It looks like we’ll have to wait until the fall's annual iPhone announcement to see if this wireless expansion actually materializes.</p><h2 id="no-hardware-devices">No hardware devices</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vS6MBJcu9NBzanvPexfSaK" name="WWDC 2026 — June 8 _ Apple 21-44 screenshot" alt="Child safety on iMac at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/vS6MBJcu9NBzanvPexfSaK.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Now, as much as it’s a software-focused event, there have been several hardware reveals in the past, like the Vision Pro a few years back. This time, however, there were none whatsoever, despite rumors hinting at a slew of new products. Here are the devices that were rumored but completely missed the show:</p><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone"><strong>iPhone Fold/Ultra:</strong></a> We didn't expect Apple to actually announce the iPhone Ultra, but we were hoping to see at least some clues within iOS 27 that would start to tease what's possible with a foldable iPhone.</li><li><strong></strong><a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far"><strong>Apple Glasses:</strong></a> While <a href="https://www.tomsguide.com/computing/vr-ar/visionos-27-everything-coming-to-the-vision-pro">visionOS 27</a> was quietly announced, Apple didn’t show anything beyond iterative changes to its spatial operating system — nothing that seemed specifically tailored for the rumored smart glasses.</li><li><a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far"><strong>MacBook Ultra:</strong></a> Although we now know the name of the next <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS 27 update, Golden Gate</a>, nothing during the keynote indicated that Apple intends to bring touch support to a touchscreen MacBook anytime soon.</li><li><a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-with-cameras-are-nearly-ready-heres-4-features-you-need-to-know"><strong>AirPods Ultra:</strong></a> Siri AI is poised to change everything, but we’ll have to wait for the next version of AirPods — which will apparently feature built-in cameras for deeper Siri AI integration — to actually see it in action.</li><li><a href="https://www.tomsguide.com/audio/apples-homepod-with-a-screen-is-still-coming-in-2025-analyst-claims"><strong>HomePod with display:</strong></a> Apple did show off new <a href="https://www.tomsguide.com/home/smart-home/apple-intelligence-security-camera-features-just-seriously-undercut-ring-and-google">Apple Intelligence features for its smart home platform</a>, but the long-rumored HomePod with a built-in display was nowhere to be seen.</li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2ap7e"></div>                            </div>                            <script src="https://kwizly.com/embed/W2ap7e.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">WWDC 2026: How to install the iOS 27 developer beta right now</a></li><li><a href="https://www.tomsguide.com/phones/iphones/only-the-iphone-17-pro-and-iphone-17-air-get-apples-most-powerful-on-device-apple-intelligence-model-heres-what-that-means">Only the iPhone 17 Pro and iPhone 17 Air get Apple's 'most powerful on-device Apple Intelligence model' — here's what that means</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apples-ai-powered-spatial-reframing-tool-just-stole-the-show-at-wwdc">Apple's AI-powered Spatial Reframing tool just stole the show at WWDC</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ WWDC 2026 was Apple's AI renaissance — but there's one very important feature still missing from iOS 27 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/wwdc-2026-was-apples-ai-renaissance-but-theres-one-very-important-feature-still-missing-from-ios-27</link>
                                                                            <description>
                            <![CDATA[ Siri may be getting a huge AI boost, but what about the rumors that Apple could add other chatbots to join ChatGPT? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6M7tP9Rq3qjPHqz2CwUwYD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/D8JHojF7g6q5yQJozcyjDN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 10 Jun 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/D8JHojF7g6q5yQJozcyjDN-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 features]]></media:description>                                                            <media:text><![CDATA[iOS 27 features]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 features]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/D8JHojF7g6q5yQJozcyjDN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026's</a> keynote address was packed, and it's clear that Apple Intelligence was the real star of the show. After essentially skipping over AI at WWDC 2026, Apple's pushing artificial intelligence harder than ever — and every Apple device you have is going to be involved. But there's one long-rumored AI feature that was noticeably absent.</p><p>I'm talking about <a href="https://www.tomsguide.com/phones/iphones/beyond-chatgpt-ios-27-extensions-will-reportedly-allow-siri-to-use-google-gemini-and-claude">Siri Extensions</a>, a feature that technically already launched in 2024 in order to link Apple's assistant with ChatGPT. However, rumors suggested that Apple could open this feature to other AI chatbots and let users choose which one they actually use. Sadly, if this is something Apple is working on, it's not divulging any details just yet.</p><h2 id="how-siri-extensions-would-work">How Siri Extensions would work</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6JnexC4PGVpMAcpTa95YEd" name="WWDC 2026 — June 8 _ Apple 38-34 screenshot" alt="Siri looking at what's on your iPhone at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/6JnexC4PGVpMAcpTa95YEd.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The idea behind Extensions is to <a href="https://www.tomsguide.com/ai/apple-intelligence/apple-intelligence-could-soon-integrate-more-ai-apps-beyond-chatgpt-heres-what-tim-cook-said">natively link AI chatbots into iOS and Siri's voice controls</a>. This effectively hands off certain AI features to a third-party service, without sacrificing the convenience of native voice controls.</p><p>Reports suggested that Apple was working on adding support for Google Gemini and Anthropic's Claude. However, other rumors suggested that Apple could launch a <a href="https://www.tomsguide.com/phones/iphones/ios-27s-extensions-could-be-the-start-of-a-true-ai-app-store-on-iphone-what-we-know">whole new area of the App Store</a>, specifically designed to let people download their own choice of chatbot and integrate it with Siri controls.</p><p>This means that just about any AI company could submit its chatbot to the App Store and let users integrate it with Siri on their own devices. So if you really wanted Meta AI, Alexa, Grok, or Copilot running on your iPhone, then it might be an option in the near future.</p><p>If reports are accurate, Extensions would effectively supersede Siri and take control over different Apple Intelligence features on your phone. Features like Writing Tools and <a href="https://www.tomsguide.com/ai/apple-intelligence/i-tried-to-use-apple-intelligences-image-playground-to-design-a-thanksgiving-menu-heres-what-i-learned-about-the-app-in-the-process">Image Playground</a> have been cited as examples of how this would work. It's also claimed that you can use these third-party services for more generic chatbot features, as is currently possible with ChatGPT, provided you specify which AI you actually want to use.</p><h2 id="it-s-another-way-for-apple-to-emphasize-user-choice">It's another way for Apple to emphasize user choice</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ogeoX4X3QERdWvELLvsdJK" name="Siri AI multiple actions" alt="Siri AI" src="https://cdn.mos.cms.futurecdn.net/ogeoX4X3QERdWvELLvsdJK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Back in the day, Apple was not exactly known for letting people choose the way things were done. Instead, it felt more like a "you'll get what you're given, and that's final," while Android was more of a bastion of user freedom. Things have changed a lot, and these days iOS is a lot more flexible in what you can do — even if the walled garden is still standing tall. </p><p>So far, AI has been a very different story. With no dedicated AI of its own, thanks to the various longstanding issues involved with transforming regular Siri into Siri AI, Apple <a href="https://www.tomsguide.com/ai/how-to-use-chatgpt-in-ios-18-2-heres-everything-it-can-do">forged a deal with OpenAI and ChatGPT</a> to fill that void. In simple terms, Apple outsourced AI chatbot support and ensured users had access to more robust AI features if they wanted them.</p><p>This was a good thing for iPhone users, and meant the platform wouldn't be outpaced by Android rivals in the ongoing AI arms race. Though admittedly, this wasn't such a good deal for people who weren't happy having ChatGPT as their chatbot of choice. </p><p>This is why Siri Extensions are such an important thing for Apple to add to iOS in the near future. With the sheer number of AI services out there, there are guaranteed to be people who would prefer to have native access to other services, and it makes sense to make sure they're happy. </p><p>Android already does this, after all, and there's little reason why Apple shouldn't give its users the same benefit. This could also mean being able to earn a slice of extra revenue when iPhone users sign up for AI subscriptions via the App Store, which is an additional boon for Apple.</p><h2 id="there-are-other-factors-to-consider">There are other factors to consider</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EjLomL6cUAsVygMTKgKWJK" name="Siri AI edit 1" alt="Siri AI" src="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There is the issue of privacy, of course, as Apple was keen to point out during the WWDC 2026 keynote. While different chatbots do offer privacy options, they're typically not easy to find and are rarely switched on by default — which is why it's doing things differently with Siri AI. </p><p>That's definitely going to be a point of contention if Siri Extensions make it to a future version of iOS 27. But as long as Apple makes users aware that they're handing over their data to a third-party company, there shouldn't be any reason why they can't give users that choice. We are all adults, after all, and I would be surprised if chatbots are allowed on one of those new Apple Child accounts.</p><p>We also have to remember that Apple and ChatGPT developers OpenAI <a href="https://www.macrumors.com/guide/wwdc-2026-what-to-expect/" target="_blank">could face some kind of legal action in the near future</a>, according to a report from Bloomberg. Apparently, OpenAI has been unhappy with its Apple partnership, and has been exploring its legal options — including a possible breach of contract notice.</p><p>Apparently, OpenAI expected ChatGPT to be more deeply embedded within iOS and Apple's app ecosystem, with "prime placement" within the Siri assistant. However, Bloomberg's report notes that "Apple’s use of OpenAI technology across its operating systems remains limited, and features can be hard to find."</p><p>Needless to say, OpenAI would be even less impressed with ChatGPT losing its exclusive position within iOS. I don't know whether the possible threat of legal trouble will have affected what Apple announced during the WWDC 2026 keynote, but the last thing it wants is its big AI reset sitting in the shadow of a major lawsuit.</p><h2 id="bottom-line-7">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bVpMc9nkwKwB7TNGiDkmFK" name="iPhone iOS 27 preview v1" alt="iOS 27" src="https://cdn.mos.cms.futurecdn.net/bVpMc9nkwKwB7TNGiDkmFK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>WWDC 2026 was Apple's chance to show that it wasn't letting its AI dream die, and it definitely feels like it succeeded in that area. Apple Intelligence dominated the majority of the keynote address with the sheer number of new features and improvements that are on the way. </p><p>Not only did Apple unveil the new Siri AI features and a bunch of the long-awaited AI upgrades coming to its assistant, but we also got to see <a href="https://www.tomsguide.com/phones/iphones/apples-ai-powered-spatial-reframing-tool-just-stole-the-show-at-wwdc">game-changing features like Reframe</a>, which lets you change the perspective of photos after they've been taken.</p><p>It would have been nice to have confirmation that iOS 27 will open up to other chatbots, though. User choice is always a good thing, and when it comes to something as important as your phone, it's crucial that people are happy with the services they're able to use.</p><p>While the cards are never truly off the table when it comes to this sort of thing, it's a lot harder to get excited about something Apple hasn't officially commented on. I just hope that it happens eventually, regardless of the potential privacy implications.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Apple just completely rebuilt Siri AI — here are the 7 biggest upgrades coming to your iPhone</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27 is official: All the new upgrades and features announced at WWDC 2026</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/i-just-saw-the-new-siri-ai-in-action-at-wwdc-heres-what-i-like-and-what-still-needs-work">I saw the new Siri AI in action — what I like and what needs work</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I saw the new Siri AI in action at WWDC — and those 'Siri is stupid' jokes could soon be obsolete ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/apple-intelligence/i-just-saw-the-new-siri-ai-in-action-at-wwdc-heres-what-i-like-and-what-still-needs-work</link>
                                                                            <description>
                            <![CDATA[ I got a first look at Siri powered by Apple Intelligence at WWDC. It can finally understand personal context, but the demos show it's still a work in progress. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nnYhqyRUW8ADLkxrUcgtV6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 09 Jun 2026 15:58:54 +0000</pubDate>                                                                                                                                <updated>Wed, 10 Jun 2026 01:17:36 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple Intelligence]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Siri AI]]></media:description>                                                            <media:text><![CDATA[Siri AI]]></media:text>
                                <media:title type="plain"><![CDATA[Siri AI]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EjLomL6cUAsVygMTKgKWJK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Even before ChatGPT went mainstream Siri has been the butt of jokes for not being very smart. And it’s been justified. Trying anything beyond the basics — playing music, getting the weather, setting timers — has been an exercise in futility. That (hopefully) changes with <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a>, which is coming to iPhones, iPads and Macs with <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a>.</p><p>I had a chance to see some in-person demos of the new Siri AI in action, and while these were very much rehearsed, there’s real potential here to save you time and make your life easier. However, the new Visual Intelligence is no Gemini Live, and Siri can take its time with certain tasks (at least in the beta stage). Here’s what I like so far, and what needs work.</p><h2 id="siri-ai-on-iphone">Siri AI on iPhone</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8Dv4VjtkWH7AH2ALXMA4mL" name="Siri AI personal context" alt="Siri AI personal context on iPhone" src="https://cdn.mos.cms.futurecdn.net/8Dv4VjtkWH7AH2ALXMA4mL.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The first thing you should know about Siri AI is that it understands personal context. So you can ask questions about pretty much anything on your device, and the assistant is smart enough to dig through apps for you to surface the right info.</p><p>During one demo, an Apple rep asked “Which podcast did my sister recommend recently.” And Siri AI then pulled up the answer from a text message. Even better, you can just say “Play it” and Siri will fire up Apple Music and help you dive right in. (Apple will open up this capability to other developers in case you have another favorite music or podcast app.)</p><p>Siri can also get stuff done on your behalf across multiple apps, including performing multiple tasks with a single prompt.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ogeoX4X3QERdWvELLvsdJK" name="Siri AI multiple actions" alt="Siri AI" src="https://cdn.mos.cms.futurecdn.net/ogeoX4X3QERdWvELLvsdJK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The second demo started with just a couple of items on a camping list, but an email from a friend had a lot more recommendations. You can just say “add this stuff to my camping gear list and remind me to pack for my trip when I get home.”</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evLaaO"></div>                            </div>                            <script src="https://kwizly.com/embed/evLaaO.js" async></script><p>Siri then got to work, updating the list in the Notes app and then setting a location-based reminder. However, it did take a while to complete these tasks. Hopefully, the final Siri will be faster.</p><p>I was pretty impressed by the improved Visual Intelligence experience, too. You can now access it via a dedicated Siri mode within the camera app, so you don’t have to use the Camera Control button shortcut. I think that’s huge for ease of use and discoverability.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8nskRdSqDca3nQxFk7AxLK" name="Siri AI visual intelligence" alt="Siri AI" src="https://cdn.mos.cms.futurecdn.net/8nskRdSqDca3nQxFk7AxLK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>During the demo, an iPhone captured an image of two books. You could then ask which book you should read first if you really liked <em>Hyperion </em>and Siri gave its recommendation. The Apple rep then asked which of these books had been turned into a movie and <em>Wool</em> had been adapted into the <a href="https://www.tomsguide.com/entertainment/streaming/silo-season-3-everything-we-know-so-far">‘Silo’ </a>TV series. Cool, yes, but yeah I told you it was canned.</p><p>What’s not clear is whether this works with live video and I’m following up on that.  </p><h2 id="siri-ai-on-mac">Siri AI on Mac</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cFZGBBx3BSPBb2Us9ENxHK" name="Siri AI Mac" alt="Siri AI" src="https://cdn.mos.cms.futurecdn.net/cFZGBBx3BSPBb2Us9ENxHK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Accessing Siri AI on Mac is as easy as just pulling up Spotlight or typing command + Shift + Space. When you start typing Spotlight will know what sorts of queries should go to Siri versus say just launching apps.</p><p>Let’s say you’re looking for vacation spot and type “What’s the best Hawaiian Island for a young family.” Siri will get to work and pull up recommendations in a new window, which you can then expand and park on either side of the screen. </p><p>You can then ask follow-up questions like “Which is best for sea turtles” to narrow your selections. From there you can hit a button in the top right corner to bring you into the dedicated Siri app. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CdxHHTQuGShDA7CRtCpEMK" name="Siri AI Mac events" alt="Siri AI" src="https://cdn.mos.cms.futurecdn.net/CdxHHTQuGShDA7CRtCpEMK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The dual-pane app will have your chat in the right window and your history of all Siri chats in the left window. It’s pretty easy to navigate.</p><p>To help you save time on productivity tasks, you can use Siri AI wherever you can use a cursor. The demo showed how you can be looking at a messy note with a bunch of info and then use a secondary click to bring up the Ask Siri menu. </p><p>After typing “Draft an email that summarizes this and include the action items,” Siri did just that. It’s definitely a timesaver. I just wish it worked with Gmail as well Apple Mail. Google would have to plug into Siri AI’s framework.</p><p>My favorite Siri AI on Mac demo came when a mock summer schedule appeared on screen with dates, times and locations for the matches. You can use Command + Shift + Space and then click the Add to Calendar button that automatically appears. </p><p>From there Siri AI will let you add all of the games to your calendar. Or you could tell Siri to only add the home games to your calendar if you wanted. Where was this when my kids were playing sports?</p><h2 id="siri-on-ipad">Siri on iPad</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mDTqjVMFVgrWa89ZqupNMK" name="Siri AI iPad" alt="Siri AI" src="https://cdn.mos.cms.futurecdn.net/mDTqjVMFVgrWa89ZqupNMK.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Last but not least, Siri AI on iPad works in much the same that it does on the iPhone, but having a larger canvas has its benefits.</p><p>You can access Siri AI at any time just by swiping down from the top middle of the display. As you begin to type “Who are the top golfers in the PGA right now,” the text “Ask Siri” appears right after it because Apple’s assistant knows that it can help.</p><p>Siri AI will then tap into Apple’s Broad World Knowledge and bring back answers, complete with citations you can click on. </p><p>Apple’s Siri AI can also help you plan a trip and you make the query pretty specific, like “What are the best national parks to visit in the US in July with my family? Recommend something that’s not too hot or crowded.”</p><p>Siri AI recommended where to go, including North Cascades National Park in Washington. You can then pop into the full Siri app if you like to ask follow-up questions, or use the Slide Over feature to keep the Siri conversation just a swipe away. </p><h2 id="siri-ai-outlook">Siri AI outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EEzyWeGDDhFExNraQiMu2g" name="Siri AI demo wwdc" alt="Siri AI demo at WWDC with Mike Rockwell" src="https://cdn.mos.cms.futurecdn.net/EEzyWeGDDhFExNraQiMu2g.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Overall, Siri AI isn't just a rebranding for Apple. It’s a much more capable and personal assistant that's more deeply integrated into the apps you use. </p><p>I’m especially impressed by Siri AI’s use of personal context, and the ability to complete multiple actions at once. And while Visual Intelligence doesn’t seem quite as robust as Gemini Live in terms of having a real-time conversation about whatever’s in your camera view or on your screen, it’s certainly much improved.</p><p>In addition to a bit more speed, I just want to see what happens when developers get their hands on Siri AI so that you’re not just locked into Apple’s own apps. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc"><strong>Apple just completely rebuilt Siri AI — here are the 7 biggest upgrades coming to your iPhone</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026"><strong>iOS 27 is official: All the new upgrades and features announced at WWDC 2026</strong></a></li><li><a href="https://www.tomsguide.com/computing/macos/macos-27"><strong>macOS Golden Gate: The biggest updates coming to Macs</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Ultra is coming, and there's already evidence of its existence in iOS 27 beta ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/iphone-ultra-is-coming-and-theres-already-evidence-of-its-existence-in-ios-27-beta</link>
                                                                            <description>
                            <![CDATA[ iOS 27 beta is here, and it's already spilling some of Apple's secrets with iPhone Fold teases. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9rHsH58wkSmXJC9daxSTF4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/m56cxNbnkkHVdvMJuBYHBG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 09 Jun 2026 12:06:36 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/m56cxNbnkkHVdvMJuBYHBG-1280-80.jpg">
                                                            <media:credit><![CDATA[Credit: Majin Bu / edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Fold final design leaked image]]></media:description>                                                            <media:text><![CDATA[iPhone Fold final design leaked image]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Fold final design leaked image]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/m56cxNbnkkHVdvMJuBYHBG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We definitely weren't expecting any hardware announcements at <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026 yesterday</a>, but we've certainly been curious about what the newly announced software might tell us about the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a> and touchscreen <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>. </p><p>Both devices are set to be the first of their kind, and the current expectation is that they'll arrive running <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> and <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS 27</a>, respectively. </p><p>Unsurprisingly, the release of the <a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">iOS 27 developer beta</a> has already started bearing fruit. Software engineer M1Astra (via <a href="https://www.bloomberg.com/news/articles/2026-06-09/apple-s-ios-27-is-filled-with-hints-about-its-upcoming-foldable-iphone" target="_blank">Bloomberg</a>) and X user <a href="https://x.com/samhenrigold/status/2064069948486320528/photo/1" target="_blank">Sam Henri Gold</a> have already been diving into the beta's code and uncovered strings that reference the still-unreleased foldable iPhone.</p><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">also a new MG key to get the total count of built-in displays pic.twitter.com/0uhik5DWRO<a href="https://twitter.com/cantworkitout/status/2064070397671219701">June 8, 2026</a></p></blockquote><div class="see-more__filter"></div></div><p>One of the strings mentions a "<strong>foldState</strong>," which is clearly meant to determine whether the iPhone Ultra has been opened or closed. Likewise, "<strong>mechanicalAngleDegrees</strong>" and "<strong>angleDegrees</strong>" are likely meant to tell iOS 27 how much the hinge has been opened. That suggests that there may be a free-stop hinge that can hold itself open at specific angles. </p><p>That could mean iPhone Ultra could have features that rely on the hinge being at a certain angle. This could, in turn, indicate we get a feature similar to <a href="https://www.tomsguide.com/news/galaxy-z-flip-youtube-flex-mode-paves-way-for-killer-galaxy-fold-2-apps">Flex Mode on Samsung Galaxy foldables</a>, which splits the foldable screen into two distinct interfaces when the screen is fixed at a 90-degree angle.</p><p>Sam Henri Gold also <a href="https://x.com/samhenrigold/status/2064070397671219701" target="_blank">pointed</a> out a string labeled "<strong>MGGetLogicalDeviceDisplayCount</strong>." That would tell the software that a specific phone has more than one screen, which is a key feature of foldable phones. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="it-s-more-than-just-code-strings">It's more than just code strings</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1992px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="hxWF8JHH73hydhmk2vQ4mY" name="iPhone Fold" alt="A render of the potential upcoming iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/hxWF8JHH73hydhmk2vQ4mY.jpg" mos="" align="middle" fullscreen="" width="1992" height="1121" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p><a href="https://www.bloomberg.com/news/articles/2026-06-09/apple-s-ios-27-is-filled-with-hints-about-its-upcoming-foldable-iphone" target="_blank">Bloomberg</a> notes that iOS 27, as it is in the current beta, might be well-suited to foldable devices. The report notes that some widgets, like News and Music, are now available in a full-page format that takes up the entire screen. That could be beneficial for a larger foldable screen, since multiple widget panels could be displayed side-by-side.</p><p>Bloomberg also points out that Apple discussed a concept called "app adaptability" during the Platforms State of the Union — a developer presentation at WWDC. This concept is designed to help developers create software that works across a range of display sizes and aspect ratios. </p><p>While this is useful for producing apps for iPhone, iPad and other Apple platforms, it's particularly important for the iPhone Fold. Considering the foldable will have a totally different aspect ratio from non-folding iPhones, and a larger internal screen, iPhone app developers are going to have to learn to adapt to the different needs of iPhone users.</p><p>The days when all iPhone screens were basically the same are about to be over, and clearly, Apple is making sure that iOS 27 is going to be ready to handle what the iPhone Ultra will throw at it. We expect it won't be long before we find more clues within iOS 27, as well as tidbits about the MacBook Ultra in macOS.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now">WWDC 2026: How to install the iOS 27 developer beta right now</a></li><li><a href="https://www.tomsguide.com/phones/iphones/only-the-iphone-17-pro-and-iphone-17-air-get-apples-most-powerful-on-device-apple-intelligence-model-heres-what-that-means">Only the iPhone 17 Pro and iPhone 17 Air get Apple's 'most powerful on-device Apple Intelligence model' — here's what that means</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apples-ai-powered-spatial-reframing-tool-just-stole-the-show-at-wwdc">Apple's AI-powered Spatial Reframing tool just stole the show at WWDC</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ WWDC 2026: How to install the iOS 27 developer beta right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/wwdc-2026-how-to-install-the-ios-27-developer-beta-right-now</link>
                                                                            <description>
                            <![CDATA[ Learn how to install Apple's iOS  27 developer beta immediately after WWDC 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zLW8zw5oRq6y4NT2MZJnPn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bVpMc9nkwKwB7TNGiDkmFK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 09 Jun 2026 09:39:02 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bVpMc9nkwKwB7TNGiDkmFK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27]]></media:description>                                                            <media:text><![CDATA[iOS 27]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bVpMc9nkwKwB7TNGiDkmFK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> focused pretty much on one thing: <a href="https://www.tomsguide.com/ai/apple-intelligence/craig-federighi-on-siri-ai-we-see-siri-not-as-a-separate-chatbot-but-rather-as-an-integral-but-conversational-tool-that-you-use-in-the-moment-deeply-integrated-into-your-experience">the new Siri</a>. Apple's revamped assistant is powered by Google's Gemini and represents the most significant Siri update since 2011. The new Siri understands context from your personal data, sees what's on your screen, and can handle complex tasks. It's the biggest bet Apple has made on AI.</p><p>You can test iOS 27 and the new Siri immediately by installing the developer beta on your iPhone. Anyone with an Apple developer account can download it for free. </p><p>If you prefer a more stable version, wait until the public beta arrives. But if you're itching to get started testing out some of the new features Apple unveiled, here's how to get the developer beta up and running on your iPhone.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><p>As with any beta software, you're likely to run into some bugs and issues along the way. It could also drain your battery more quickly than usual. If possible, we'd always recommend installing it on a separate device, given the amount of sensitive data likely stored on your main iPhone. The more stable public beta will launch next month.</p><section class="howto-block">                    <h3>How to install the iOS 27 developer beta </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/8Qoh6rizgcMLxyoyiEXgv.jpg"                                        alt="Beta section highlighted on iPhone "                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/8Qoh6rizgcMLxyoyiEXgv.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>First, <a href="https://developer.apple.com/register/" target="_blank"><strong>register as an Apple developer</strong></a> if you don't already have an account. It's free and takes just a few minutes. Then <strong>open Settings on your iPhone and tap "General." Select "Software Update", then tap "Beta Updates."</strong></p><p><strong>Choose "iOS 27 Developer Beta" </strong>when it appears. Your Apple developer account will automatically authorize access to the beta.</p><p>After selecting the developer beta, your iPhone will check for available updates. iOS 27 should be able to install right away. </p><p><strong>Tap "Install Now" </strong>to begin the download. Your iPhone downloads the beta automatically and prompts you to restart. Follow the on-screen instructions and restart when prompted. Installation completes automatically.</p></p>                </section><section class="howto-block">                    <h3>Experience the revamped Siri</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/nChN6QF6WoLSu7FdeqPcdX.jpg"                                        alt="Siri logo on phone"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/nChN6QF6WoLSu7FdeqPcdX.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Shutterstock)</div></figure>                    <p><p>The new Siri lives in your Dynamic Island. Say "Siri" or long press the power button to activate it. The assistant now displays rich cards showing weather, calendar appointments, or other information relevant to your query.</p><p>Siri can now draft emails, compile meeting notes, and pull information from your personal data without asking follow-up questions. The assistant understands context from your apps, emails, and calendar. It's a dramatically different experience from previous Siri versions.</p><p>Keep in mind the beta version may not include every new feature mentioned at yesterday's keynote. Some features might not work perfectly yet, and app compatibility issues are common with early betas.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O6PEne"></div>                            </div>                            <script src="https://kwizly.com/embed/O6PEne.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macos/ive-been-covering-apple-events-for-8-years-heres-what-im-excited-for-from-wwdc-2026">Apple WWDC 2026 Live: New Siri, iOS 27, Apple Intelligence and all the last-minute rumors</a></li><li><a href="https://www.tomsguide.com/computing/macos/macos-27-the-5-biggest-wwdc-2026-announcements-we-expect">macOS 27: 5 biggest WWDC 2026 announcements we expect</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/the-new-siri-is-a-make-or-break-moment-for-apple-at-wwdc-heres-why">The new Siri is a make-or-break moment for Apple at WWDC — here's why</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just installed the iOS 27 beta — and Reframe is unlike any other AI feature I’ve come across ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/i-just-installed-the-ios-27-beta-and-reframe-is-unlike-any-other-ai-feature-ive-come-across</link>
                                                                            <description>
                            <![CDATA[ Apple’s new iOS 27 Reframe feature stands out as a genuinely original, game-changer that makes fixing bad camera angles in post-production incredibly easy. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">g3GV2WYjq2ReLqsNCcdP2j</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/e7kGGJgUJxstmNDnHPGPf8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 09 Jun 2026 08:40:06 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/e7kGGJgUJxstmNDnHPGPf8-1280-80.jpg">
                                                            <media:credit><![CDATA[John Velasco / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 beta showing Reframe.]]></media:description>                                                            <media:text><![CDATA[iOS 27 beta showing Reframe.]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 beta showing Reframe.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/e7kGGJgUJxstmNDnHPGPf8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>After watching the events that unfolded during <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a>, Apple’s clearly not holding back this time around when it comes to AI. From its supercharged <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a> to the wealth of new <a href="https://www.tomsguide.com/ai/apple-intelligence-all-the-major-announcements-made-at-wwdc-2026">Apple Intelligence</a> features in <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a>, there’s no denying that Apple redeemed itself.</p><p>If there’s one thing that caught my attention the most, it has to be none other than Reframe. This tool is one of many new additions to the Photos app. But unlike Clean Up and Extend, Reframe is something truly original that Apple can genuinely call its own.</p><p>Shortly after I installed the iOS 27 beta on my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a>, I tried out Reframe on a few photos I captured — and believe me when I say that it’s ridiculously amazing. Here’s why.</p><h2 id="shoot-now-worry-later">Shoot now, worry later</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:59.60%;"><img id="yj3XQeK4aoExjnx54A6YEC" name="iOS 27 beta - Reframe" alt="iOS 27 beta - Reframe screenshot." src="https://cdn.mos.cms.futurecdn.net/yj3XQeK4aoExjnx54A6YEC.jpg" mos="" align="middle" fullscreen="" width="1510" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When I capture photos, there are times after the fact when I wish I'd shot just one more frame. Whether I just need an extra angle or the original wasn’t quite what I wanted, Reframe eases that anxiety because I can fix it in post — and with outstanding results.</p><p>In the Photos app, the new Tools icon tucks away all the latest Apple Intelligence features. Reframe instantly analyzes an image, allowing you to shift the perspective entirely. I love this flexibility because I can snap a photo now and adjust it to exactly the angle I need later on.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gEtj6Knu3kZnoSeCRH6ZnQ" name="iOS 27 beta.GIF" alt="iOS 27 beta showing Reframe tool." src="https://cdn.mos.cms.futurecdn.net/gEtj6Knu3kZnoSeCRH6ZnQ.gif" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>This is an incredible time-saver — and quite frankly — it’s like nothing I’ve come across on any other phone. I’ve been impressed by plenty of AI photo editing tools that can remove objects and fill the voids, but what Reframe is doing here is on a completely different level.</p><h2 id="better-than-expected-results">Better-than-expected results</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/y6SgSCPMJZBA9mxkMrCiB.jpg" alt="Photos showing Reframe tool." /><figcaption>Original.<small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/wiN6Hro2BxqVEEJdEfAJ7.jpg" alt="Photos showing Reframe tool." /><figcaption>Reframe.<small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>I tried Reframe on a few photos I had in my gallery. The first set above is a perfect example of what a slight shift in angle can do to change the look of a shot. In the original, the camera’s position is level with my face.</p><p>Honestly, it’s not bad, but with Reframe, I’m able to make it look like the camera was shooting upward from a slightly lower angle. What makes the generative elements so convincing to me is that it even manages to change the perspective of the background, properly shifting the tree and the horizon downward.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/haGPCsQvxKZjZSwfMYWbbW.jpg" alt="iOS 27 beta - Reframe." /><figcaption>Original.<small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Pmk7nFW6KpKHuXnz85PYHW.jpg" alt="iOS 27 beta - Reframe." /><figcaption>Reframe.<small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>For the second photo, I actually went for the opposite effect — taking a slightly off-angle shot and leveling it out. The result is quite surprising because not only does Reframe deliver a clean, straight-on composition, but it shifts the background perfectly to match. I’m also really impressed by how accurately Apple Intelligence preserves the fine details and textures around the eyes despite the perspective shift.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/RtEL2fWi3zjFZQcuULXgkW.jpg" alt="iOS 27 beta - Reframe." /><figcaption>Original.<small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/scdYtCJKJXGVqpUNJi4VWW.jpg" alt="iOS 27 beta - Reframe." /><figcaption>Reframe.<small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>Finally, I took a photo I shot of the <a href="https://www.tomsguide.com/vehicle-tech/evs/i-saw-the-all-new-2027-bmw-7-series-and-it-does-away-with-the-traditional-drivers-display-for-something-completely-different">2027 BMW 7 Series</a> and adjusted it so that more of the car's side profile is visible. I was actually most skeptical about this image because car lines are notoriously hard for AI to replicate, but the result was yet again incredibly convincing.</p><h2 id="bottom-line-8">Bottom line</h2>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@john_c_velasco/video/7649140421087497485" data-video-id="7649140421087497485" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@john_c_velasco" href="https://www.tiktok.com/@john_c_velasco">@john_c_velasco</a>                            <p></p><a target="_blank" title="♬ original sound - Johhhhhhnnnnn V" href="https://www.tiktok.com/music/original-sound-7649140435956337422">♬ original sound - Johhhhhhnnnnn V</a></section>                    </blockquote></div>                <p>Apple definitely needed a unique AI feature to call its own, and Reframe hits the mark perfectly. It highlights the impressive capability of Apple Intelligence to analyze a shot and deliver a realistic, re-angled photograph.</p><p>Most people might not appreciate everything that’s going on behind the scenes to execute this. The technology likely categorizes different layers within the frame, manipulating them independently to ensure the final image looks natural. </p><p>None of Apple's rivals has anything remotely close to this, making it a truly original feature that elevates the entire Apple Intelligence platform. At the end of the day, it’s exactly the kind of tool I can reliably lean on.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ORVE0O"></div>                            </div>                            <script src="https://kwizly.com/embed/ORVE0O.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-tried-google-labs-dreambeans-app-and-it-finally-broke-my-infinite-scrolling-habit">I tried Google Labs’ Dreambeans app — and it finally broke my infinite scrolling habit</a></li><li><a href="https://www.tomsguide.com/ai/reddit-users-arent-picking-one-ai-chatbot-anymore-heres-how-they-stack-their-tools">Reddit users aren’t picking one AI chatbot anymore — here’s how they stack their tools</a></li><li><a href="https://www.tomsguide.com/ai/i-thought-siri-was-finished-these-5-leaked-wwdc-2026-features-are-its-biggest-update-since-2011">I thought Siri was finished. These 5 leaked WWDC 2026 features are its biggest update since 2011</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple's Craig Federighi on Siri AI: 'We see Siri not as a separate chatbot, an unintegrated place you go and chitchat, but rather as an integral but conversational tool' ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/apple-intelligence/craig-federighi-on-siri-ai-we-see-siri-not-as-a-separate-chatbot-but-rather-as-an-integral-but-conversational-tool-that-you-use-in-the-moment-deeply-integrated-into-your-experience</link>
                                                                            <description>
                            <![CDATA[ At WWDC 2026, we attended a Q&A with Apple's Craig Federighi to discuss the new Siri AI, privacy, and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">csdFf2Xz8T6Up47JVn9voh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/iUKsUz6p6i6Wk7DZ3apTUR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 08 Jun 2026 21:57:03 +0000</pubDate>                                                                                                                                <updated>Tue, 09 Jun 2026 00:13:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple Intelligence]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/iUKsUz6p6i6Wk7DZ3apTUR-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Craig Federighi at WWDC 2026]]></media:description>                                                            <media:text><![CDATA[Craig Federighi at WWDC 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Craig Federighi at WWDC 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/iUKsUz6p6i6Wk7DZ3apTUR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>About a year ago, I spoke with Apple's Craig Federighi after the <a href="https://www.tomsguide.com/ai/apple-intelligence/wwdc-interview-apples-craig-federighi-and-greg-joswiak-on-siri-delay-voice-ai-as-therapist-and-whats-next-for-apple-intelligence">WWDC 2025</a> keynote to discuss the Siri delay, and at the time, the senior vice president of software engineering seemed adamant that Apple was not interested in building a chatbot.</p><p>"Apple didn't want to send users off into some chat experience in order to get things done," Federighi told me. "We were very clear this wasn't about us building a chatbot. We want to bring intelligence deeply integrated into the experience of all of our platforms."</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7649136347164298510" data-video-id="7649136347164298510" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ original sound - Tom’s Guide" href="https://www.tiktok.com/music/original-sound-7649136327816104718">♬ original sound - Tom’s Guide</a></section>                    </blockquote></div>                <p>Fast-forward one year to <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a>, and Apple has unveiled the new Siri AI, which — you guessed it — has a dedicated app that some might perceive as a chatbot. But Federighi and other Apple executives here insisted during a press Q&A that Apple's focus has not changed.</p><p>"We see Siri not as a separate chatbot, an unintegrated place you go and chitchat, but rather as an integral but conversational tool that you use in the moment," said Federighi. "It's deeply integrated into your experience, understanding what's on screen...And so while the experiences are conversational, they are really an extension of your system experience, deeply integrated into your flow."</p><h2 id="the-new-siri-ai-in-action">The new Siri AI in action</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KbzAbFm83AX9CXDxKuwb5X" name="Siri AI" alt="Siri AI at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/KbzAbFm83AX9CXDxKuwb5X.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>A good example of the new Siri is what Mike Rockwell demoed during the Q&A session. The VP of Siri engineering asked what everyone was bringing to an upcoming potluck lunch, and Siri AI then gathered the info from separate text messages and showed it on screen.</p><p>From there, Rockwell asked Siri which drinks would pair well with the food, and Siri went to Apple's World Knowledge Service to find the info.</p><p>He then swiped down to expand the window, and we were immediately brought to the Siri app, where you can scroll for more information. And then it's a conversation that you can return to in the Siri app whenever you want.</p><p>"Now we did go back and forth on what's the best way if you want to get back to such a chat that you had," Federighi shared. "Because you want to continue it, you want to reference it, and quite honestly, the most natural affordance for any user to go find something like that is to have an app that they can manage on their home screen, launch, and get back to. And so we have a Siri app."</p><h2 id="a-big-focus-on-privacy">A big focus on privacy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jSUDREDeHSvzmdYZ633bU8" name="wwdc 2026 2" alt="Apple executives during Q&A at WWDC including Amar Subramanya, Mike Rockwell, Sebastian Marineau-Mes and Craig Federighi" src="https://cdn.mos.cms.futurecdn.net/jSUDREDeHSvzmdYZ633bU8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Despite Apple partnering with Google to use some of its models, Apple execs insist that its Siri AI is private and no user information is shared. Craig Federighi showed that Apple's architecture is completely different from, say, Google's Gemini. </p><p>The architecture includes an on-device component that comprises a system orchestrator and Apple's AFM Core Advanced model, and there are models in the cloud, including AFM Cloud, AFM Cloud Pro, and ADM Cloud (images), plus Apple's World Knowledge service.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7mxEo3W7WcxBkdiAGQFdQe" name="Siri AI models" alt="Siri AI architecture" src="https://cdn.mos.cms.futurecdn.net/7mxEo3W7WcxBkdiAGQFdQe.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple's Private Cloud Compute still handles users’ requests even when working with third parties like Google, and personal data is not stored or made accessible to Apple or anyone else. </p><p>"To bring this model to production, we worked with both Google and Nvidia to extend our private cloud compute infrastructure to Nvidia GPUs in Google's cloud, while maintaining Apple's unmatched privacy guarantees," said Sebastian Marineau-Mes, who runs the Apple Intelligence Experience team at Apple.</p><p>And while other chatbots are exploring ads based on your interactions and personal context, you're not going to see that from Siri AI. </p><p>"You are in control of your information, your information about how well Siri and Apple intelligence get to understand you and your preferences, your personal contacts," Rockwell said. "You're not going to see an ad from us coming based on, 'Hey, we noticed you like Thai food, here's some Thai food now.' You stay completely in control of your information at all times."</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates"><strong>Apple WWDC 2026 live updates — Siri AI, Apple Intelligence, iOS 27 and all the biggest announcements</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026"><strong>iOS 27 is official: All the new upgrades and features announced at WWDC 2026</strong></a></li><li><a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc"><strong>Apple just completely rebuilt Siri AI — here are the 7 biggest upgrades coming to your iPhone</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Only the iPhone 17 Pro and iPhone 17 Air get Apple's 'most powerful on-device Apple Intelligence model' — here's what that means ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/only-the-iphone-17-pro-and-iphone-17-air-get-apples-most-powerful-on-device-apple-intelligence-model-heres-what-that-means</link>
                                                                            <description>
                            <![CDATA[ If you're hoping to use all the latest Apple Intelligence features, you'll need Apple's newest, most powerful devices. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">v6HR2LrPrKvS3voErWqypb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GsbtWDUdwwj7SkthmbUhTE-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Mon, 08 Jun 2026 19:53:36 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ dave.leclair@futurenet.com (Dave LeClair) ]]></author>                    <dc:creator><![CDATA[ Dave LeClair ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/fyx7qYdxPMTNBhdnMfNmaB.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Managing News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/GsbtWDUdwwj7SkthmbUhTE-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Using side button on iPhone to access Siri at WWDC 2026]]></media:description>                                                            <media:text><![CDATA[Using side button on iPhone to access Siri at WWDC 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Using side button on iPhone to access Siri at WWDC 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GsbtWDUdwwj7SkthmbUhTE-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple is <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">fixing Siri with the next iOS release</a>. All kinds of new AI features are sliding onto iOS 27, and it sounds like Apple Intelligence is becoming a core part of the operating system.</p><p>But all the features won't make their way to every iPhone. Unfortunately, during the <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> keynote, Apple said that only the latest and greatest devices will get access to the on-device AI model and features it enables.</p><p>Specifically, Apple's Craig Federighi, SVP of software engineering, said, "Our most powerful on-device model and the features it enables, like expressive voices and more advanced dictation, will be coming to our most capable iPhone, iPad, and Mac systems."</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="which-devices-support-the-latest-on-device-model">Which devices support the latest on-device model?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LbefpNm2WLBAMjLa5GySiV" name="iPhone 17 Pro Max-25" alt="iPhone 17 Pro Max" src="https://cdn.mos.cms.futurecdn.net/LbefpNm2WLBAMjLa5GySiV.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The list of devices that support all of the AI features is fairly limited. Here's the full range of supported devices: </p><ul><li>iPhone 17 Pro</li><li>iPhone 17 Pro Max</li><li>iPhone Air</li><li>iPad models with M4 and later and at least 12GB of unified memory</li><li>Mac models with M3 and later and at least 12GB of unified memory</li><li>Apple Vision Pro (M5)</li></ul><p>That means even if you have the popular iPhone 16 Pro or Pro Max and all the Apple Intelligence features it supports, you'll be missing out on some of the new features. Sure, these <a href="https://www.tomsguide.com/phones/iphones/ios-27-supported-devices-see-which-iphones-did-and-didnt-make-the-cut">devices support iOS 27</a>, but some things will be left out.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xj3yNe"></div>                            </div>                            <script src="https://kwizly.com/embed/Xj3yNe.js" async></script><h2 id="which-features-are-exclusive">Which features are exclusive?</h2><p>Apple didn't provide a full rundown of the features that will be left off older devices, but, as noted in Craig Federighi's quote, "expressive voices and more advanced dictation" are part of the on-device functionality limited to new devices.</p><p>The company demonstrated the expressive voices feature during its keynote; essentially, it lets you fine-tune how Siri sounds. You can adjust the pitch and speed at which the personal assistant speaks. While it sounds useful, it's hardly a game-changer.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BkLZCSQzHxjnm3FWSv7afQ" name="WWDC 2026 — June 8 _ Apple 43-56 screenshot" alt="Siri planning a World Cup watch party" src="https://cdn.mos.cms.futurecdn.net/BkLZCSQzHxjnm3FWSv7afQ.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The more advanced dictation wasn't dove into as deeply, but Apple did say that it "now captures what users say as polished text with greater precision, automatically handling capitalization, punctuation, and formatting as they speak. With improved speech understanding, users can speak naturally and trust that their words will appear clearly, accurately, and as intended."</p><p>Presumably, there will be other advanced AI features limited to the newer, more powerful devices, but it makes sense that Apple wouldn't want to lead too aggressively with what it's holding back from a large percentage of users and instead focus on the positive items it's bringing to everyone, which we've detailed in our full breakdowns of <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> and <a href="https://www.tomsguide.com/computing/vr-ar/ipados-27-everything-coming-to-the-apples-beloved-tablets">iPadOS 27</a>.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-tried-google-labs-dreambeans-app-and-it-finally-broke-my-infinite-scrolling-habit"><strong>I tried Google Labs’ Dreambeans app — and it finally broke my infinite scrolling habit</strong></a></li><li><a href="https://www.tomsguide.com/ai/reddit-users-arent-picking-one-ai-chatbot-anymore-heres-how-they-stack-their-tools"><strong>Reddit users aren’t picking one AI chatbot anymore — here’s how they stack their tools</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-thought-siri-was-finished-these-5-leaked-wwdc-2026-features-are-its-biggest-update-since-2011"><strong>I thought Siri was finished. These 5 leaked WWDC 2026 features are its biggest update since 2011</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iOS 27 supported devices — see which iPhones did (and didn't) make the cut ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/ios-27-supported-devices-see-which-iphones-did-and-didnt-make-the-cut</link>
                                                                            <description>
                            <![CDATA[ Apple just announced iOS 27; here are the iPhones that can actually support the new operating system, as well as the smaller list of phones that support Siri AI and Apple Intelligence. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KHRVNXXABr2hFixAy4g6Nh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VTdfcizPdawtmWcoMNbmNG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 08 Jun 2026 19:39:17 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/VTdfcizPdawtmWcoMNbmNG-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 logo on iPhone]]></media:description>                                                            <media:text><![CDATA[iOS 27 logo on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 logo on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VTdfcizPdawtmWcoMNbmNG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Today at <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a>, Apple revealed <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27 </a>with a focus on upgrades to <a href="https://www.tomsguide.com/ai/apple-intelligence-all-the-major-announcements-made-at-wwdc-2026">Apple Intelligence</a> and Siri. However, there's also a lot of behind-the-scenes improvements to Liquid Glass and optimizing the work done in iOS 26. </p><p>Usually, when a new version of iOS is released, it means that a previous generation of older iPhones loses support. This year, though, if your phone <a href="https://www.tomsguide.com/phones/iphones/ios-26-supported-devices-heres-the-iphones-that-do-and-dont-make-the-cut">can run iOS 26,</a> then it'll be able to run iOS 27.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><p>This means the iPhone 11, which can run iOS 26, should be able to run iOS 27. It speaks to the optimization of the update over major features that aren't AI-related. As with iOS 26, anything older than the iPhone 11 won't support the update.</p><p>Here's the full list of phones that will support iOS 27:</p><ul><li>iPhone 17</li><li>iPhone Air</li><li>iPhone 17 Pro</li><li>iPhone 17 Pro Max</li><li>iPhone 16</li><li>iPhone 16 Plus</li><li>iPhone 16 Pro</li><li>iPhone 16 Pro Max</li><li>iPhone 16e</li><li>iPhone 15</li><li>iPhone 15 Plus</li><li>iPhone 15 Pro</li><li>iPhone 15 Pro Max</li><li>iPhone 14</li><li>iPhone 14 Plus</li><li>iPhone 14 Pro</li><li>iPhone 14 Pro Max</li><li>iPhone 13</li><li>iPhone 13 mini</li><li>iPhone 13 Pro</li><li>iPhone 13 Pro Max</li><li>iPhone 12</li><li>iPhone 12 mini</li><li>iPhone 12 Pro</li><li>iPhone 12 Pro Max</li><li>iPhone 11</li><li>iPhone 11 Pro</li><li>iPhone 11 Pro Max</li><li>iPhone SE (both 2020 and 2022 models)</li></ul><h2 id="an-ai-caveat">An AI caveat</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yTpa7dA49fsFg9qk6ZwGr" name="WWDC 2026 — June 8 _ Apple 40-49 screenshot" alt="Siri voice customization at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/yTpa7dA49fsFg9qk6ZwGr.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>As with every iOS announcement since Apple Intelligence was introduced in 2024, there is a distinct feature split. Only phones that support AI will get the <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">new Siri AI</a> and other <a href="https://www.tomsguide.com/ai/apple-intelligence-all-the-major-announcements-made-at-wwdc-2026">Apple Intelligence features </a>announced today.</p><p>Apple iPhones that will support iOS 27 AI include the iPhone 15 Pro models and the iPhone 16 and 17 families. Presumably the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-camera-leak-just-gave-us-our-best-look-at-all-4-colors-coming-in-september">iPhone 18</a> lineup, which is expected to launch in September, will also support all of these features.</p><p>Here's the current list:</p><ul><li>iPhone 17</li><li>iPhone Air</li><li>iPhone 17 Pro</li><li>iPhone 17 Pro Max</li><li>iPhone 16</li><li>iPhone 16 Plus</li><li>iPhone 16 Pro</li><li>iPhone 16 Pro Max</li><li>iPhone 16e</li><li>iPhone 15 Pro</li><li>iPhone 15 Pro Max</li></ul><p>Beyond the iPhone, these devices will also support the new AI features when it releases later this year:</p><ul><li>iPad models with M1 or later</li><li>Mac with M1 or later</li><li>Apple Vision Pro</li><li>Apple Watch Series 10 or later</li><li>Apple Watch Ultra 2 or later</li><li>Apple Watch SE 3 when paired with an Apple Intelligence-enabled iPhone</li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year">watchOS 27: All the new features coming to Apple Watch later this year</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apples-ai-powered-spatial-reframing-tool-just-stole-the-show-at-wwdc">Apple's AI-powered Spatial Reframing tool just stole the show at WWDC</a></li><li><a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Apple finally fixed Siri — here's all the features for the new Siri AI announced at WWDC</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple's AI-powered Spatial Reframing tool just stole the show at WWDC ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/apples-ai-powered-spatial-reframing-tool-just-stole-the-show-at-wwdc</link>
                                                                            <description>
                            <![CDATA[ Apple's Reframe might be the most impressive-looking AI photo editing tool since Google released Magic Eraser. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SuhNbNsGn8NVSUS4hVkbfY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Sjea8ZsHx5LQtdyfrCUsAe-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Mon, 08 Jun 2026 18:48:38 +0000</pubDate>                                                                                                                                <updated>Mon, 08 Jun 2026 19:12:52 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/Sjea8ZsHx5LQtdyfrCUsAe-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Spatial Reframing demo at WWDC 2026]]></media:description>                                                            <media:text><![CDATA[Spatial Reframing demo at WWDC 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Spatial Reframing demo at WWDC 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Sjea8ZsHx5LQtdyfrCUsAe-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>AI and photo editing go together like peanut butter and jelly, and Apple's just announced some impressive-sounding editing features at <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a>. But of the three, it's clear that the new Reframe tool absolutely steals the show. </p><p>Reframe is a feature that does exactly what it sounds like. The idea is that you can take an existing photo and shift the perspective to create something (almost) totally new. It sounds like the kind of thing Apple would restrict to spatial photos, which are only visible on the <a href="https://www.tomsguide.com/computing/smart-glasses/apple-vision-pro-review">Vision Pro</a> headset, but that's not the case.</p><p>Referred to as Spatial Reframing, Apple says that this feature can be applied to all pictures Apple Photos has access to — even ones taken by a totally different camera. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gK4rJ8" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qdcSyLJHMU6cbnfCN2Lj8S" name="WWDC 2026 — June 8 _ Apple 1-5-46 screenshot" alt="Apple Intelligence features in Photos at WWDC 2026" src="https://cdn.mos.cms.futurecdn.net/qdcSyLJHMU6cbnfCN2Lj8S.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The AI scans the photo in question, and once done, you can pull your finger across the screen to change the perspective. Apple Photos lets you see a preview of the final image in real time, and once you've decided on the new perspective, generative AI will shift things around and fill in the blanks.</p><p>This effectively means that you don't necessarily need to stress about getting the right photo composition before you actually hit the shutter button. You can always come back to it later and shift things around to make them more visually appealing. Which is pretty incredible, especially when you remember that Apple Photos doesn't have any additional spatial data to work with.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7649096996413885709" data-video-id="7649096996413885709" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ original sound - Tom’s Guide" href="https://www.tiktok.com/music/original-sound-7649097118116432654">♬ original sound - Tom’s Guide</a></section>                    </blockquote></div>                <p>In addition to Reframe, Apple is adding a new "Extend" feature, which is kinda like a reverse crop. It can expand the image beyond its original framing and generate new details that you may not have been able to get into shot the first time around. </p><p>Similarly, Clean Up, which arrived as part of iOS 18, is getting a much-needed upgrade that improves performance and offers better results whenever you remove an object.</p><p>We hope to test these features in the near future to see just how well they work.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>