<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://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"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link rel="alternate" hreflang="en-GB"
                       href="https://www.tomsguide.com/uk/feeds/articletype/feature"
                       type="application/rss+xml"/>
                            <title><![CDATA[ Latest from Tom's Guide UK in Feature ]]></title>
                <link>https://www.tomsguide.com/uk/feature</link>
        <description><![CDATA[ All the latest feature content from the Tom's Guide  UK team ]]></description>
                                    <lastBuildDate>Thu, 17 Sep 2026 07:30:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ ChatGPT is now my go-to for recommendations —  7 prompts I use to find new movies, music, games and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The one thing most folks know about me is that I’m quick to dig into my bag of movies I’ve watched, musical artists I’ve grown quite fond of, restaurants I’ve eaten at frequently, etc., to give them recommendations.</p><p>And most of the time, they end up liking my picks (I’ve gotten word that suggesting they listen to Clown Core’s mind-bending instrumental music wasn’t exactly their vibe, however). I’m just as open to getting endorsements of their favorite things as well and am always on the lookout for suggestions from streaming services, websites and respected curators.</p><p>Speaking of respected curators, <a href="https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-to-build-a-movie-marathon-based-on-one-oddly-specific-theme-here-are-the-7-recommended-films-i-loved-the-most">ChatGPT</a> has emerged as my go-to chatbot whenever I need it to steer me in the right direction for some quality selections. It doesn’t matter if it's movies, music, games or whatever else I’m currently addicted to — once I start prompting, listing my favorites and jotting down my least favorites from whatever category I’m looking up, ChatGPT matches them with good to great recommendations.</p><p>Use these same prompts and ChatGPT may just expand your palette for all things media too.</p><h2 id="pushing-me-towards-previously-unknown-media-and-so-much-more">Pushing me towards previously unknown media and so much more</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L2LUUisLYVCMGTfxPUYvna" name="shutterstock_2839963473-2" alt="chatgpt" src="https://cdn.mos.cms.futurecdn.net/L2LUUisLYVCMGTfxPUYvna-1920-80.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: Shutterstock)</span></figcaption></figure><p>These are the seven ChatGPT-generated prompts that I’ve put into practice for the longest time now when I’m in the mood to discover something new to read, play, listen to and watch:</p><ul><li><strong>Musical Artists: </strong><em>Analyze my favorite artists, albums, and songs below and figure out what I actually like about their music — including genre, production, instrumentation, vocals, lyrical themes, mood, energy, era, songwriting style, and overall atmosphere. Then recommend [number] artists I should listen to. Don't simply recommend artists from the same genre. Look for artists who share the underlying characteristics of my taste. Rank them by how likely I am to enjoy them. My favorites: [list] and Artists I don't like: [list].</em></li><li><strong>Songs: </strong><em>Based on these songs I love, recommend [number] songs that feel like they belong in the same personal universe as my favorites. Don't just match genre. Consider melody, production, vocals, rhythm, atmosphere, lyrics, energy, and emotional feeling. Divide the results into “Almost Certain Hits,” “Interesting New Directions,” and “Wild Cards.”</em></li><li><strong>Video Games: </strong><em>Analyze my favorite and least favorite games and determine what I actually value in games — gameplay loop, story, exploration, difficulty, combat, progression, atmosphere, world-building, creativity, multiplayer, etc. Then recommend [number] games based on those underlying preferences rather than simply matching genre. Explain the specific feature of my taste each game satisfies.</em></li><li><strong>Books: </strong><em>Study my favorite and least favorite books and figure out what I respond to most in fiction/nonfiction — writing style, characters, themes, pacing, world-building, humor, ideas, emotional intensity, complexity, and subject matter. Then recommend [number] books that fit my taste. Include several recommendations outside the genres I normally read if you think they could work.</em></li><li><strong>Comic Books: </strong><em>Based on the comics, graphic novels, characters, and creators I like and dislike, identify the storytelling qualities I'm drawn to. Then recommend [number] comics or graphic novels. Don't limit yourself to the same publishers, characters, or genres. Prioritize recommendations based on storytelling style, themes, art, tone, and character work.</em></li><li><strong>TV Shows: </strong><em>Analyze my favorite and least favorite TV shows. Determine what keeps me watching — characters, premise, humor, pacing, mystery, world-building, emotional stakes, episode structure, visual style, etc. Then recommend [number] shows. Separate them into “You Should Watch This Next,” “You Might Love This,” and “Wild Cards.”</em></li><li><strong>Movies: </strong><em>Analyze my movie taste based on the following favorites and dislikes. Identify the underlying characteristics I respond to rather than simply matching genres. Then recommend [number] movies I haven't listed. Include mainstream, overlooked, international, older, and unconventional choices. Explain why each one matches my taste.</em></li></ul><h2 id="top-tier-recommendations-i-ve-walked-away-with">Top-tier recommendations I’ve walked away with</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nDqgnoogW4o2N9ZhsX9wzQ" name="shutterstock_2604220987-2" alt="spotify" src="https://cdn.mos.cms.futurecdn.net/nDqgnoogW4o2N9ZhsX9wzQ-1920-80.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: Shutterstock)</span></figcaption></figure><p>Just a few weeks prior, I spent an hour or two with ChatGPT using the aforementioned prompts for movie, music and game recommendations to see just how valid its recommendations could be.</p><p>When it came time for me to list my movie faves, I got real specific by listing quality films based on comic books & superheroes, action-packed martial-arts movies, horror films with crazy twists, psychological thrillers, and intense action flicks where gunfights & car chases are in abundance. As for my cinematic dislikes, I laid out romance comedies, films based on historical moments (fiction & non-fiction), and movies about businesses.</p><p>On the music front, the songs I told ChatGPT about that currently have my ear the most include "Daylight" by John Legend, "SaWaDiKa" by LISA, "Touch Touch" by Haute & Freddy, "Shine" by Kierra Sheard, "More" by Tiana Major9, "Break" by Jhene Aiko and "GAME 7" by Your Old Droog.</p><p>And when it came time to get some game recommendations, I told ChatGPT I loved titles like Gunstar Heroes, Devil May Cry 3, Final Fantasy X, Sonic Mania, Penny’s Big Breakaway, Vanquish, and Katamari Damacy. On the least favorite games front, I mentioned these duds (no offense to anyone who may like one or some of these picks): Tormented Souls, Hell is Us, Blades of Fire, Rise of the Ronin, Visions of Mana, Ninja Gaiden 3, and Duke Nukem Forever.</p><p>ChatGPT took the time to observe my picks, analyze my tastes and send me down a rabbit hole with its better than expected recommendations for the movie, music, and games media spaces:</p><ul><li><strong>Movies: </strong><em>Dredd, Upgrade, Oldboy, Hard Boiled, Predestination, Green Room, The Man From Nowhere, A Bittersweet Life, 13 Assassins and Battle Royale.</em></li><li><strong>Music: </strong><em>“Moment” by Victoria Monét, “When I'm in Your Arms” by Cleo Sol, “Best Part” by Daniel Caesar ft. H.E.R., “Gorilla” by Little Simz and “Free Mind” by Tems.</em></li><li><strong>Games: </strong><em>Astral Chain, The Wonderful 101, A Hat in Time, Psychonauts, Psychonauts 2 and Sifu.</em></li></ul><h2 id="final-thoughts">Final thoughts</h2><p>Being as descriptive as possible with my likes and dislikes helped ChatGPT zero in on as many top-tier suggestions as possible and get to know me a little better along the way. </p><p>For my future recommendation conversations with the chatbot, I’ll be sure to hop into those same chats and ask for even more suggestions to add more cinematic bangers to my streaming service queue, build up my Spotify playlists, make my gaming backlog even bigger (yikes…) and more.</p><p>Feel free to use those same prompts to see where ChatGPT could lead you in your quest for great recommendations next.</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/ai/chatgpt/inside-chatgpt-for-financial-services-what-early-access-users-can-actually-do" target="_blank"><strong>Inside ChatGPT for Financial Services: What early access users can actually do</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/dex-language-discovery-camera-review-the-rare-ai-gadget-that-keeps-up-with-my-non-stop-5-year-old" target="_blank"><strong>Dex Language-Discovery Camera review: The rare AI gadget that keeps up with my non-stop 5-year-old</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-to-identify-the-main-barriers-to-success-these-7-suggestions-made-me-rethink-how-i-spend-my-time" target="_blank"><strong>I asked ChatGPT to identify the main barriers to success — these 7 suggestions made me rethink how I spend my time</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/chatgpt-is-now-my-go-to-for-recommendations-7-prompts-i-use-to-find-new-movies-music-games-and-more</link>
                                                                            <description>
                            <![CDATA[ With the assistance of ChatGPT, I’ve gotten used to treating it like my primary recommendation engine for the movies, music and games I love the most. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">oosR3pvvY7HPYcr8bC8GTB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YAKnRrvQR8ny8RL39fXcDS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 17 Sep 2026 07:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[ChatGPT]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YAKnRrvQR8ny8RL39fXcDS-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[streaming services]]></media:description>                                                            <media:text><![CDATA[streaming services]]></media:text>
                                <media:title type="plain"><![CDATA[streaming services]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YAKnRrvQR8ny8RL39fXcDS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The one thing most folks know about me is that I’m quick to dig into my bag of movies I’ve watched, musical artists I’ve grown quite fond of, restaurants I’ve eaten at frequently, etc., to give them recommendations.</p><p>And most of the time, they end up liking my picks (I’ve gotten word that suggesting they listen to Clown Core’s mind-bending instrumental music wasn’t exactly their vibe, however). I’m just as open to getting endorsements of their favorite things as well and am always on the lookout for suggestions from streaming services, websites and respected curators.</p><p>Speaking of respected curators, <a href="https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-to-build-a-movie-marathon-based-on-one-oddly-specific-theme-here-are-the-7-recommended-films-i-loved-the-most">ChatGPT</a> has emerged as my go-to chatbot whenever I need it to steer me in the right direction for some quality selections. It doesn’t matter if it's movies, music, games or whatever else I’m currently addicted to — once I start prompting, listing my favorites and jotting down my least favorites from whatever category I’m looking up, ChatGPT matches them with good to great recommendations.</p><p>Use these same prompts and ChatGPT may just expand your palette for all things media too.</p><h2 id="pushing-me-towards-previously-unknown-media-and-so-much-more">Pushing me towards previously unknown media and so much more</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L2LUUisLYVCMGTfxPUYvna" name="shutterstock_2839963473-2" alt="chatgpt" src="https://cdn.mos.cms.futurecdn.net/L2LUUisLYVCMGTfxPUYvna-1920-80.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: Shutterstock)</span></figcaption></figure><p>These are the seven ChatGPT-generated prompts that I’ve put into practice for the longest time now when I’m in the mood to discover something new to read, play, listen to and watch:</p><ul><li><strong>Musical Artists: </strong><em>Analyze my favorite artists, albums, and songs below and figure out what I actually like about their music — including genre, production, instrumentation, vocals, lyrical themes, mood, energy, era, songwriting style, and overall atmosphere. Then recommend [number] artists I should listen to. Don't simply recommend artists from the same genre. Look for artists who share the underlying characteristics of my taste. Rank them by how likely I am to enjoy them. My favorites: [list] and Artists I don't like: [list].</em></li><li><strong>Songs: </strong><em>Based on these songs I love, recommend [number] songs that feel like they belong in the same personal universe as my favorites. Don't just match genre. Consider melody, production, vocals, rhythm, atmosphere, lyrics, energy, and emotional feeling. Divide the results into “Almost Certain Hits,” “Interesting New Directions,” and “Wild Cards.”</em></li><li><strong>Video Games: </strong><em>Analyze my favorite and least favorite games and determine what I actually value in games — gameplay loop, story, exploration, difficulty, combat, progression, atmosphere, world-building, creativity, multiplayer, etc. Then recommend [number] games based on those underlying preferences rather than simply matching genre. Explain the specific feature of my taste each game satisfies.</em></li><li><strong>Books: </strong><em>Study my favorite and least favorite books and figure out what I respond to most in fiction/nonfiction — writing style, characters, themes, pacing, world-building, humor, ideas, emotional intensity, complexity, and subject matter. Then recommend [number] books that fit my taste. Include several recommendations outside the genres I normally read if you think they could work.</em></li><li><strong>Comic Books: </strong><em>Based on the comics, graphic novels, characters, and creators I like and dislike, identify the storytelling qualities I'm drawn to. Then recommend [number] comics or graphic novels. Don't limit yourself to the same publishers, characters, or genres. Prioritize recommendations based on storytelling style, themes, art, tone, and character work.</em></li><li><strong>TV Shows: </strong><em>Analyze my favorite and least favorite TV shows. Determine what keeps me watching — characters, premise, humor, pacing, mystery, world-building, emotional stakes, episode structure, visual style, etc. Then recommend [number] shows. Separate them into “You Should Watch This Next,” “You Might Love This,” and “Wild Cards.”</em></li><li><strong>Movies: </strong><em>Analyze my movie taste based on the following favorites and dislikes. Identify the underlying characteristics I respond to rather than simply matching genres. Then recommend [number] movies I haven't listed. Include mainstream, overlooked, international, older, and unconventional choices. Explain why each one matches my taste.</em></li></ul><h2 id="top-tier-recommendations-i-ve-walked-away-with">Top-tier recommendations I’ve walked away with</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nDqgnoogW4o2N9ZhsX9wzQ" name="shutterstock_2604220987-2" alt="spotify" src="https://cdn.mos.cms.futurecdn.net/nDqgnoogW4o2N9ZhsX9wzQ-1920-80.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: Shutterstock)</span></figcaption></figure><p>Just a few weeks prior, I spent an hour or two with ChatGPT using the aforementioned prompts for movie, music and game recommendations to see just how valid its recommendations could be.</p><p>When it came time for me to list my movie faves, I got real specific by listing quality films based on comic books & superheroes, action-packed martial-arts movies, horror films with crazy twists, psychological thrillers, and intense action flicks where gunfights & car chases are in abundance. As for my cinematic dislikes, I laid out romance comedies, films based on historical moments (fiction & non-fiction), and movies about businesses.</p><p>On the music front, the songs I told ChatGPT about that currently have my ear the most include "Daylight" by John Legend, "SaWaDiKa" by LISA, "Touch Touch" by Haute & Freddy, "Shine" by Kierra Sheard, "More" by Tiana Major9, "Break" by Jhene Aiko and "GAME 7" by Your Old Droog.</p><p>And when it came time to get some game recommendations, I told ChatGPT I loved titles like Gunstar Heroes, Devil May Cry 3, Final Fantasy X, Sonic Mania, Penny’s Big Breakaway, Vanquish, and Katamari Damacy. On the least favorite games front, I mentioned these duds (no offense to anyone who may like one or some of these picks): Tormented Souls, Hell is Us, Blades of Fire, Rise of the Ronin, Visions of Mana, Ninja Gaiden 3, and Duke Nukem Forever.</p><p>ChatGPT took the time to observe my picks, analyze my tastes and send me down a rabbit hole with its better than expected recommendations for the movie, music, and games media spaces:</p><ul><li><strong>Movies: </strong><em>Dredd, Upgrade, Oldboy, Hard Boiled, Predestination, Green Room, The Man From Nowhere, A Bittersweet Life, 13 Assassins and Battle Royale.</em></li><li><strong>Music: </strong><em>“Moment” by Victoria Monét, “When I'm in Your Arms” by Cleo Sol, “Best Part” by Daniel Caesar ft. H.E.R., “Gorilla” by Little Simz and “Free Mind” by Tems.</em></li><li><strong>Games: </strong><em>Astral Chain, The Wonderful 101, A Hat in Time, Psychonauts, Psychonauts 2 and Sifu.</em></li></ul><h2 id="final-thoughts">Final thoughts</h2><p>Being as descriptive as possible with my likes and dislikes helped ChatGPT zero in on as many top-tier suggestions as possible and get to know me a little better along the way. </p><p>For my future recommendation conversations with the chatbot, I’ll be sure to hop into those same chats and ask for even more suggestions to add more cinematic bangers to my streaming service queue, build up my Spotify playlists, make my gaming backlog even bigger (yikes…) and more.</p><p>Feel free to use those same prompts to see where ChatGPT could lead you in your quest for great recommendations next.</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/ai/chatgpt/inside-chatgpt-for-financial-services-what-early-access-users-can-actually-do" target="_blank"><strong>Inside ChatGPT for Financial Services: What early access users can actually do</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/dex-language-discovery-camera-review-the-rare-ai-gadget-that-keeps-up-with-my-non-stop-5-year-old" target="_blank"><strong>Dex Language-Discovery Camera review: The rare AI gadget that keeps up with my non-stop 5-year-old</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-to-identify-the-main-barriers-to-success-these-7-suggestions-made-me-rethink-how-i-spend-my-time" target="_blank"><strong>I asked ChatGPT to identify the main barriers to success — these 7 suggestions made me rethink how I spend my time</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Think your AI chatbot is up to date? Here is how stale ChatGPT, Claude, and Gemini actually are ]]></title>
                                                                                                <dc:content><![CDATA[ <p>AI chatbots can answer questions about almost anything, but there's one surprisingly difficult question: How much does your AI actually know about what's happening right now? And yes, they can search the web, but from my testing, I've discovered that even so, AI isn't always accurate or timely. </p><p>An AI model released today wasn't necessarily trained on information from yesterday. Depending on its knowledge cutoff, there could be a gap of weeks or months between the world the model "knows" and the world you're living in.</p><p>So I decided to find out just how stale the biggest AI chatbots actually are.</p><h2 id="1-what-is-the-newest-iphone-apple-has-released">1. What is the newest iPhone Apple has released?</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="scGbUJ8x6x8ZSDZyuLFiCe" name="screenshot" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/scGbUJ8x6x8ZSDZyuLFiCe-1920-80.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: Future)</span></figcaption></figure><p>Both ChatGPT and Gemini were accurate, stating that Apple's newest iPhone models are the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-variable-aperture-camera-explained-heres-what-it-actually-does"><strong>iPhone 18 Pro</strong></a>, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-battery-rumors-it-could-be-a-record-breaking-year-for-apple"><strong>iPhone 18 Pro Max</strong></a>, and the<a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"> <strong>iPhone Duo</strong></a> (Apple's first foldable smartphone).  </p><p>Apple announced these flagship models during its<a href="https://www.tomsguide.com/phones/iphones/apple-september-event-preview-all-the-new-products-to-expect-at-iphone-18-pro-launch-and-beyond"> "Surprise and Shine" keynote event</a>. Notably, Apple broke tradition by skipping the standard baseline iPhone 18 during this launch cycle, focusing strictly on its premium hardware tier. Both chatbots noticed that the iPhone Duo, Apple's foldable device, launches directly in stores on October 23. </p><p>But Claude was stuck on iPhone 17, suggesting "The newest iPhones are the <a href="https://www.tomsguide.com/news/live/iphone-17-reviews-live"><strong>iPhone 17 series</strong></a>."</p><h2 id="what-is-the-newest-flagship-claude-model">What is the newest flagship Claude 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Hg33CrCKf9REzZTuYXJdWY" name="screenshot" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/Hg33CrCKf9REzZTuYXJdWY-1920-80.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: Future)</span></figcaption></figure><p>This question tests a fast-moving category where models can become outdated remarkably quickly. ChatGPT got the answer correct, stating, "Anthropic's newest flagship Claude model is <a href="https://www.tomsguide.com/ai/claude/claude-fable-5-1-is-here-this-one-prompt-shows-what-it-can-really-do">Claude Fable 5.1</a>, released in September 2026." <br><br>But what's surprising is that Claude 4.6 didn't seem to understand that Claude Fable 5.1 is readily available. It said, "The newest flagship Claude model available to the public is Claude Opus 5, part of the current generation alongside Claude Sonnet 5 and Claude Haiku 4.5. Above Opus, Anthrophic has a newer Mythos tier — the current Mythos-class models are Claude Mythos 5.1 and Claude Fable 5.1, though Mythos is not broadly available to the public yet. It's being used by a small number of trusted organizations as part of Anthropic's Project Glasswing."<br><br>Gemini also got the question wrong, stating that <a href="https://www.tomsguide.com/ai/i-gave-claude-opus-5-and-kimi-k3-15-impossible-prompts-the-winner-surprised-me">Claude Opus 5 </a>and Mythos 5 were the latest models. </p><h2 id="3-who-won-the-world-cup-in-2026">3. Who won the World Cup in 2026? </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:4405px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uqYqHCgM4QyuYxMrKdqvhD" name="FIFA Club World Cup" alt="The Club World Cup Trophy on display" src="https://cdn.mos.cms.futurecdn.net/uqYqHCgM4QyuYxMrKdqvhD-1920-80.jpg" mos="" align="middle" fullscreen="" width="4405" height="2478" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Photo by Johnnie Izquierdo - FIFA/FIFA via Getty Images)</span></figcaption></figure><p>Maybe because the news isn't <em>that </em>recent, but all three chatbots got this answer correct. Each chatbot even shared interesting information about the game such as Ferran Torres scoring the winning goal. Claude even shared information about Spain sweeping individual awards such as Rodri winning the Golden Ball (best player), Unai Simón taking the Golden Glove (best goalkeeper) and Pau Cubarsí named Best Young Player. </p><h2 id="4-what-major-new-feature-did-apple-add-to-siri-in-ios-27">4. What major new feature did Apple add to Siri in iOS 27? </h2><p>All three chatbots also recognized that the newest feature added to Siri in iOS 27 is <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> </p><p>Claude described Siri AI as "essentially a ChatGPT-like version of Siri that can answer pretty much anything." Interesting, considering it didn't know that the iPhone 18 is available. </p><h2 id="5-does-google-home-offer-3rd-party-ai-integration">5. Does Google Home offer 3rd party AI integration? </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="WTB9tcXqAwFvv9VUqoVNqG" name="screenshot" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/WTB9tcXqAwFvv9VUqoVNqG-1920-80.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: Future)</span></figcaption></figure><p>Both Gemini and ChatGPT acknowledged that as of today, <a href="https://www.tomsguide.com/ai/google-just-made-a-huge-smart-home-move-and-its-good-news-for-claude-ai-fans">Google Home offers 3rd party AI integration</a>. Claude was not aware of that news. </p><p>This is especially interesting considering Google Home even mentions Claude in their documentation regarding MCP Home. </p><h2 id="the-takeaway">The takeaway</h2><p>Even with Search enabled, Claude wasn't always up-to-date with basic information. This is worth noting, particularly as new AI models launch so rapidly. Often it's easy to assume that "new" means the AI knows more recent information, but the date a model launches and hte date its training data ends can be very different. <br><br>And sure, web search can fill that gap, but that would also require the AI to know that it needs to search. In other words, it doesn't know that it doesn't know. <br><br>The bottom line here is that it is very important to fact check AI, because even the latest models aren't always aware of the latest information. </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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/ai/chatgpt/humans-may-be-reading-your-chatgpt-prompts-heres-how-to-stop-it"><strong>OpenAI paid contractors to read ChatGPT conversations — here's how to protect yourself</strong></a></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick"><strong>I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/think-your-ai-chatbot-is-up-to-date-here-is-how-stale-chatgpt-claude-and-gemini-actually-are</link>
                                                                            <description>
                            <![CDATA[ How current is your AI? I tested ChatGPT, Claude and Gemini to see what they know, what they get wrong and when web search makes a difference. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pSYhZgtN86MkiTiDpbRaCL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GnWMTwmPweuzbcPHg7azhC-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 17 Sep 2026 06:15:00 +0000</pubDate>                                                                                                                                <updated>Thu, 17 Sep 2026 08:24:47 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/GnWMTwmPweuzbcPHg7azhC-1920-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[ChatGPT vs Gemini vs Claude]]></media:description>                                                            <media:text><![CDATA[ChatGPT vs Gemini vs Claude]]></media:text>
                                <media:title type="plain"><![CDATA[ChatGPT vs Gemini vs Claude]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GnWMTwmPweuzbcPHg7azhC-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>AI chatbots can answer questions about almost anything, but there's one surprisingly difficult question: How much does your AI actually know about what's happening right now? And yes, they can search the web, but from my testing, I've discovered that even so, AI isn't always accurate or timely. </p><p>An AI model released today wasn't necessarily trained on information from yesterday. Depending on its knowledge cutoff, there could be a gap of weeks or months between the world the model "knows" and the world you're living in.</p><p>So I decided to find out just how stale the biggest AI chatbots actually are.</p><h2 id="1-what-is-the-newest-iphone-apple-has-released">1. What is the newest iPhone Apple has released?</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="scGbUJ8x6x8ZSDZyuLFiCe" name="screenshot" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/scGbUJ8x6x8ZSDZyuLFiCe-1920-80.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: Future)</span></figcaption></figure><p>Both ChatGPT and Gemini were accurate, stating that Apple's newest iPhone models are the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-variable-aperture-camera-explained-heres-what-it-actually-does"><strong>iPhone 18 Pro</strong></a>, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-battery-rumors-it-could-be-a-record-breaking-year-for-apple"><strong>iPhone 18 Pro Max</strong></a>, and the<a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"> <strong>iPhone Duo</strong></a> (Apple's first foldable smartphone).  </p><p>Apple announced these flagship models during its<a href="https://www.tomsguide.com/phones/iphones/apple-september-event-preview-all-the-new-products-to-expect-at-iphone-18-pro-launch-and-beyond"> "Surprise and Shine" keynote event</a>. Notably, Apple broke tradition by skipping the standard baseline iPhone 18 during this launch cycle, focusing strictly on its premium hardware tier. Both chatbots noticed that the iPhone Duo, Apple's foldable device, launches directly in stores on October 23. </p><p>But Claude was stuck on iPhone 17, suggesting "The newest iPhones are the <a href="https://www.tomsguide.com/news/live/iphone-17-reviews-live"><strong>iPhone 17 series</strong></a>."</p><h2 id="what-is-the-newest-flagship-claude-model">What is the newest flagship Claude 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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Hg33CrCKf9REzZTuYXJdWY" name="screenshot" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/Hg33CrCKf9REzZTuYXJdWY-1920-80.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: Future)</span></figcaption></figure><p>This question tests a fast-moving category where models can become outdated remarkably quickly. ChatGPT got the answer correct, stating, "Anthropic's newest flagship Claude model is <a href="https://www.tomsguide.com/ai/claude/claude-fable-5-1-is-here-this-one-prompt-shows-what-it-can-really-do">Claude Fable 5.1</a>, released in September 2026." <br><br>But what's surprising is that Claude 4.6 didn't seem to understand that Claude Fable 5.1 is readily available. It said, "The newest flagship Claude model available to the public is Claude Opus 5, part of the current generation alongside Claude Sonnet 5 and Claude Haiku 4.5. Above Opus, Anthrophic has a newer Mythos tier — the current Mythos-class models are Claude Mythos 5.1 and Claude Fable 5.1, though Mythos is not broadly available to the public yet. It's being used by a small number of trusted organizations as part of Anthropic's Project Glasswing."<br><br>Gemini also got the question wrong, stating that <a href="https://www.tomsguide.com/ai/i-gave-claude-opus-5-and-kimi-k3-15-impossible-prompts-the-winner-surprised-me">Claude Opus 5 </a>and Mythos 5 were the latest models. </p><h2 id="3-who-won-the-world-cup-in-2026">3. Who won the World Cup in 2026? </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:4405px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uqYqHCgM4QyuYxMrKdqvhD" name="FIFA Club World Cup" alt="The Club World Cup Trophy on display" src="https://cdn.mos.cms.futurecdn.net/uqYqHCgM4QyuYxMrKdqvhD-1920-80.jpg" mos="" align="middle" fullscreen="" width="4405" height="2478" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Photo by Johnnie Izquierdo - FIFA/FIFA via Getty Images)</span></figcaption></figure><p>Maybe because the news isn't <em>that </em>recent, but all three chatbots got this answer correct. Each chatbot even shared interesting information about the game such as Ferran Torres scoring the winning goal. Claude even shared information about Spain sweeping individual awards such as Rodri winning the Golden Ball (best player), Unai Simón taking the Golden Glove (best goalkeeper) and Pau Cubarsí named Best Young Player. </p><h2 id="4-what-major-new-feature-did-apple-add-to-siri-in-ios-27">4. What major new feature did Apple add to Siri in iOS 27? </h2><p>All three chatbots also recognized that the newest feature added to Siri in iOS 27 is <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> </p><p>Claude described Siri AI as "essentially a ChatGPT-like version of Siri that can answer pretty much anything." Interesting, considering it didn't know that the iPhone 18 is available. </p><h2 id="5-does-google-home-offer-3rd-party-ai-integration">5. Does Google Home offer 3rd party AI integration? </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="WTB9tcXqAwFvv9VUqoVNqG" name="screenshot" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/WTB9tcXqAwFvv9VUqoVNqG-1920-80.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: Future)</span></figcaption></figure><p>Both Gemini and ChatGPT acknowledged that as of today, <a href="https://www.tomsguide.com/ai/google-just-made-a-huge-smart-home-move-and-its-good-news-for-claude-ai-fans">Google Home offers 3rd party AI integration</a>. Claude was not aware of that news. </p><p>This is especially interesting considering Google Home even mentions Claude in their documentation regarding MCP Home. </p><h2 id="the-takeaway">The takeaway</h2><p>Even with Search enabled, Claude wasn't always up-to-date with basic information. This is worth noting, particularly as new AI models launch so rapidly. Often it's easy to assume that "new" means the AI knows more recent information, but the date a model launches and hte date its training data ends can be very different. <br><br>And sure, web search can fill that gap, but that would also require the AI to know that it needs to search. In other words, it doesn't know that it doesn't know. <br><br>The bottom line here is that it is very important to fact check AI, because even the latest models aren't always aware of the latest information. </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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/ai/chatgpt/humans-may-be-reading-your-chatgpt-prompts-heres-how-to-stop-it"><strong>OpenAI paid contractors to read ChatGPT conversations — here's how to protect yourself</strong></a></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick"><strong>I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ EXCLUSIVE: Snap CEO Evan Spiegel says smart glasses disguised as normal eyewear are 'creepy' — why Specs look bold on purpose ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Most <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">smart glasses</a> makers treat their technology like something to apologize for (or something to covertly hide), shrinking cameras and batteries until the frames pass for standard Wayfarers. Snap is doing the <strong>exact </strong>opposite.</p><p>From when Specs debuted to <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review">trying them on for myself</a>, it’s clear that the bold, thick-framed silhouette has split opinions. But during my exclusive interview, Snap CEO Evan Spiegel made it clear that this aesthetic isn’t just overcoming engineering physics — it’s a philosophical stance.</p><p>“I think a lot of companies have made the mistake of trying to make smart glasses look like normal glasses, which really just ends up being kind of creepy,” Spiegel commented. “People feel like, ‘oh, are you spying on me? Why are you wearing those spy glasses that are disguised as regular glasses?'"</p><h2 id="designer-wearables-you-see-coming">Designer wearables you see coming</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uGb45L4noSqK4rW8nUPY8F" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/uGb45L4noSqK4rW8nUPY8F-1920-80.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: Future)</span></figcaption></figure><p>Rather than apologizing, Snap made Specs unapologetically conspicuous. Of course, in terms of whether you like the look, there’s going to be some detractors. But by doing this, making the hardware unmistakable makes visual transparency a norm.</p><p>"So with Specs, you can really see them coming. They've got iridescent lenses, a very distinct style, and hopefully that invites some real conversation,” Spiegel added.</p><p>“Because the thing I think that's so surprising about Specs is that someone might think, 'Oh, are you recording me?' and it's like, 'No, I'm watching a video on YouTube.' You're like, 'What, you're watching a video on YouTube with a pair of see-through glasses?'"</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DuJ3r5hwtSwNo83vkRCuUo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/DuJ3r5hwtSwNo83vkRCuUo-1920-80.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: Future)</span></figcaption></figure><p>By going hard on this big, bold aesthetic, Snap’s intention is to reframe those bystander assumptions with an obvious computer on your face, and defuse any tension that may come from wearing them.</p><p>And I gotta be real, it’s refreshing to see. While the look has drawn some chuckles from the team when I showed them (one said I looked like the front of a pickup truck), making it abundantly visually clear — not just with an LED but also with the size and shape of the glasses themselves — is going to be a lot less “pervert glasses,” and more “what do they do?”</p><h2 id="the-engineering-reality-of-ditching-the-tether">The engineering reality of ditching the tether</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5JQgLWehqG3taJNsL7Ki7" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/5JQgLWehqG3taJNsL7Ki7-1920-80.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: Future)</span></figcaption></figure><p>While Spiegel framed the aesthetic as a social design choice, it is equally a compromise dictated by the laws of physics in 2026. Unlike tethered headsets that offload their compute and battery into a pocket puck, Specs house their entire computing architecture directly within the frame.</p><p>“We thought that was important because people don't want to lug around another puck or something like that just to use Specs,” Spiegel stated. “So in terms of real wearability and portability, that was something that was really important to us."</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zxDGweFyzznyGYehG5NwCF" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zxDGweFyzznyGYehG5NwCF-1920-80.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: Future)</span></figcaption></figure><p>And as you can read during my hands-on time, they have managed to work around some of those physics challenges — effective vapor chambers to combat the heat generated by two Snapdragon chips and keep those temperatures at a comfortable level. After a few bigger, bulkier generations, I had to ask Evan what the “Eureka moment” was that had him realizing now was the time to go to the consumer.</p><p>"I think the reason why this generation of Specs is ready for primetime is that we finally fit all of this extraordinary capability into a lightweight pair of see-through glasses. They're about 130 grams, so they're very wearable,” Spiegel said. “The last developer version weighed like 200 grams, just way too heavy to really be wearable for these sorts of experiences."</p><p>That’s not to say these aren’t still definitely an early-adopter package. There’s a huge $2,195 price tag attached to them, after all. But trying them on myself, it’s clear the comfort has been figured out.</p><h2 id="can-loud-design-win-public-trust">Can loud design win public trust?</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zQgTWrovURitAZfU6PbWVo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zQgTWrovURitAZfU6PbWVo-1920-80.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: Future)</span></figcaption></figure><p>Snap’s refusal — or inability — to build stealth eyewear is a candid acknowledgment of what AR hardware actually requires today. By choosing high-visibility industrial design over covert disguise, Specs are attempting to solve the societal etiquette problem before it starts. They are visibly loud by design so you physically cannot be sneaky.</p><p>However, the real battle ahead won’t just be the whole “stealth glasses are creepy” thing, it will be convincing consumers to wear a chunky, two-thousand-dollar face computer out in the real world.</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/snapchat-launches-its-own-ai-and-says-snap-intelligence-will-anticipate-your-needs">Snapchat launches its own AI — and says Snap Intelligence will 'anticipate your needs'</a></li><li><a href="https://www.tomsguide.com/computing/virtual-reality/pimax-dream-air-review">I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-benchmarked-the-real-dlss-5-in-nba-2k27-and-the-future-of-photorealistic-graphics-has-one-big-catch">I tested DLSS 5 in NBA 2K27 on a mid-range gaming laptop — it's the future of photorealistic graphics, but there's a catch</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/smart-glasses/exclusive-snap-ceo-evan-spiegel-says-smart-glasses-disguised-as-normal-eyewear-are-creepy-why-specs-look-bold-on-purpose</link>
                                                                            <description>
                            <![CDATA[ Disguised smart glasses are kind of "creepy.” Snap CEO Evan Spiegel tells Tom’s Guide why the new $2,195 Specs look bold and unmistakable on purpose. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mmSWLcLzHHzW8yYiLcEgiN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rjasUexY43aCDDxX5TadWo-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 17 Sep 2026 06:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 17 Sep 2026 08:51:25 +0000</updated>
                                                                                                                                            <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[VR & AR]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.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>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rjasUexY43aCDDxX5TadWo-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Snap Specs (2026)]]></media:description>                                                            <media:text><![CDATA[Snap Specs (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[Snap Specs (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rjasUexY43aCDDxX5TadWo-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Most <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">smart glasses</a> makers treat their technology like something to apologize for (or something to covertly hide), shrinking cameras and batteries until the frames pass for standard Wayfarers. Snap is doing the <strong>exact </strong>opposite.</p><p>From when Specs debuted to <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review">trying them on for myself</a>, it’s clear that the bold, thick-framed silhouette has split opinions. But during my exclusive interview, Snap CEO Evan Spiegel made it clear that this aesthetic isn’t just overcoming engineering physics — it’s a philosophical stance.</p><p>“I think a lot of companies have made the mistake of trying to make smart glasses look like normal glasses, which really just ends up being kind of creepy,” Spiegel commented. “People feel like, ‘oh, are you spying on me? Why are you wearing those spy glasses that are disguised as regular glasses?'"</p><h2 id="designer-wearables-you-see-coming">Designer wearables you see coming</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uGb45L4noSqK4rW8nUPY8F" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/uGb45L4noSqK4rW8nUPY8F-1920-80.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: Future)</span></figcaption></figure><p>Rather than apologizing, Snap made Specs unapologetically conspicuous. Of course, in terms of whether you like the look, there’s going to be some detractors. But by doing this, making the hardware unmistakable makes visual transparency a norm.</p><p>"So with Specs, you can really see them coming. They've got iridescent lenses, a very distinct style, and hopefully that invites some real conversation,” Spiegel added.</p><p>“Because the thing I think that's so surprising about Specs is that someone might think, 'Oh, are you recording me?' and it's like, 'No, I'm watching a video on YouTube.' You're like, 'What, you're watching a video on YouTube with a pair of see-through glasses?'"</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DuJ3r5hwtSwNo83vkRCuUo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/DuJ3r5hwtSwNo83vkRCuUo-1920-80.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: Future)</span></figcaption></figure><p>By going hard on this big, bold aesthetic, Snap’s intention is to reframe those bystander assumptions with an obvious computer on your face, and defuse any tension that may come from wearing them.</p><p>And I gotta be real, it’s refreshing to see. While the look has drawn some chuckles from the team when I showed them (one said I looked like the front of a pickup truck), making it abundantly visually clear — not just with an LED but also with the size and shape of the glasses themselves — is going to be a lot less “pervert glasses,” and more “what do they do?”</p><h2 id="the-engineering-reality-of-ditching-the-tether">The engineering reality of ditching the tether</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5JQgLWehqG3taJNsL7Ki7" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/5JQgLWehqG3taJNsL7Ki7-1920-80.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: Future)</span></figcaption></figure><p>While Spiegel framed the aesthetic as a social design choice, it is equally a compromise dictated by the laws of physics in 2026. Unlike tethered headsets that offload their compute and battery into a pocket puck, Specs house their entire computing architecture directly within the frame.</p><p>“We thought that was important because people don't want to lug around another puck or something like that just to use Specs,” Spiegel stated. “So in terms of real wearability and portability, that was something that was really important to us."</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zxDGweFyzznyGYehG5NwCF" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zxDGweFyzznyGYehG5NwCF-1920-80.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: Future)</span></figcaption></figure><p>And as you can read during my hands-on time, they have managed to work around some of those physics challenges — effective vapor chambers to combat the heat generated by two Snapdragon chips and keep those temperatures at a comfortable level. After a few bigger, bulkier generations, I had to ask Evan what the “Eureka moment” was that had him realizing now was the time to go to the consumer.</p><p>"I think the reason why this generation of Specs is ready for primetime is that we finally fit all of this extraordinary capability into a lightweight pair of see-through glasses. They're about 130 grams, so they're very wearable,” Spiegel said. “The last developer version weighed like 200 grams, just way too heavy to really be wearable for these sorts of experiences."</p><p>That’s not to say these aren’t still definitely an early-adopter package. There’s a huge $2,195 price tag attached to them, after all. But trying them on myself, it’s clear the comfort has been figured out.</p><h2 id="can-loud-design-win-public-trust">Can loud design win public trust?</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zQgTWrovURitAZfU6PbWVo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zQgTWrovURitAZfU6PbWVo-1920-80.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: Future)</span></figcaption></figure><p>Snap’s refusal — or inability — to build stealth eyewear is a candid acknowledgment of what AR hardware actually requires today. By choosing high-visibility industrial design over covert disguise, Specs are attempting to solve the societal etiquette problem before it starts. They are visibly loud by design so you physically cannot be sneaky.</p><p>However, the real battle ahead won’t just be the whole “stealth glasses are creepy” thing, it will be convincing consumers to wear a chunky, two-thousand-dollar face computer out in the real world.</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/snapchat-launches-its-own-ai-and-says-snap-intelligence-will-anticipate-your-needs">Snapchat launches its own AI — and says Snap Intelligence will 'anticipate your needs'</a></li><li><a href="https://www.tomsguide.com/computing/virtual-reality/pimax-dream-air-review">I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-benchmarked-the-real-dlss-5-in-nba-2k27-and-the-future-of-photorealistic-graphics-has-one-big-catch">I tested DLSS 5 in NBA 2K27 on a mid-range gaming laptop — it's the future of photorealistic graphics, but there's a catch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone 18 Pro Max and 18 Pro battery life tested — the results are surprising ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With every new release, Apple is confident about the endurance of its devices — and that hasn't changed with the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-review">iPhone 18 Pro Max and iPhone 18 Pro</a>. Even with expectations set higher than ever, the stakes are undeniably steep for this year's Pro lineup.</p><p>Not only do they need to prove their endurance against their predecessors to truly earn the <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhone</a> crown, but they also need to outlast many of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a> around. Apple leaves no doubt that these are positioned as the longest-lasting phones it's ever built, backing up those claims with the efficiency gains of the new <a href="https://www.tomsguide.com/phones/iphones/apple-a20-pro-chip-why-its-such-a-big-deal-for-the-iphone-ultra-and-iphone-18-pro-max">A20 Pro silicon</a> alongside upgraded battery capacities.</p><p>After putting both handsets through our custom battery drain test, the results are surprising. Here’s what we found.</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/QJVNbFMd-zQ" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-iphone-18-pros-vs-iphone-17-pros-battery-life-comparison"><span>iPhone 18 Pros vs iPhone 17 Pros battery life comparison</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery life (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro Max</strong></p></td><td  ><p>18:27</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro</strong></p></td><td  ><p>16:17</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>17:54</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro</strong></p></td><td  ><p>15:21</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 16 Pro Max</strong></p></td><td  ><p>17:17</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 16 Pro</strong></p></td><td  ><p>14:07</p></td></tr></tbody></table></div><p>If you check <a href="https://www.apple.com/iphone/compare/" target="_blank">Apple’s official comparison tool</a>, the iPhone 18 Pro Max and 18 Pro are rated for up to 45 and 36 hours of video playback, respectively. In the <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">Tom’s Guide battery test</a>, however, we test real-world endurance by setting displays to 150 nits and running an automated script that simulates web browsing over a cellular connection until the device shuts off.</p><p>Our testing reveals an average battery life of 16 hours and 17 minutes for the iPhone 18 Pro, while the iPhone 18 Pro Max stretches that endurance to 18 hours and 27 minutes. While both represent clear year-over-year gains, the numbers are surprising given the heavy emphasis placed on the A20 Pro’s power efficiency.</p><p>Specifically, the iPhone 18 Pro Max lasted 33 minutes longer than the iPhone 17 Pro Max — a modest 3.1% increase. The iPhone 18 Pro gets a more meaningful jump, outlasting the iPhone 17 Pro by 56 minutes for a 6.1% bump. Even if these figures don't quite deliver the dramatic generational leap many anticipated from Apple's shift to 2nm silicon, progress is progress nonetheless.</p><h3 class="article-body__section" id="section-how-they-compare-to-rival-android-phones"><span>How they compare to rival Android phones</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery Life (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro Max </strong></p></td><td  ><p>18:27 </p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro</strong></p></td><td  ><p>16:17</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra </strong></p></td><td  ><p>16:40</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus 15</strong></p></td><td  ><p>25:13</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 11 Pro XL</strong></p></td><td  ><p>14:28</p></td></tr></tbody></table></div><p>Just as importantly, the iPhone 18 Pro Max and iPhone 18 Pro need to prove their worth against their primary Android rivals. The iPhone 18 Pro Max holds its ground convincingly against key competitors like the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a> and <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review">Pixel 11 Pro XL</a>. It bests Samsung’s flagship by a solid margin of 1 hour and 47 minutes, a lead that stretches to nearly 4 hours over Google’s largest Pixel. Meanwhile, the smaller iPhone 18 Pro also holds its own against these supersized flagships, trailing the Galaxy S26 Ultra by just 23 minutes despite its noticeably more compact footprint.</p><p>Despite these promising gains, neither iPhone can touch the staggering endurance of the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-15-review">OnePlus 15</a> — the undisputed <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">best phone battery life</a> champion. Clocking in at an unbelievable 25 hours and 13 minutes, the OnePlus remains in a league of its own, beating the iPhone 18 Pro Max by more than 6.5 hours. That victory is largely thanks to the massive 7,300 mAh silicon-carbon battery packed beneath its hood.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-and-18-pro-battery-life-bottom-line"><span>iPhone 18 Pro Max and 18 Pro battery life: Bottom line</span></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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4edCqgzDe6Geozici7QFqK" name="iPhone 18 Pro and Pro Max-14" alt="Apple iPhone 18 Pro and Pro Max shown in hand" src="https://cdn.mos.cms.futurecdn.net/4edCqgzDe6Geozici7QFqK-1920-80.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: Tom's Guide)</span></figcaption></figure><p>The iPhone 18 Pro and iPhone 18 Pro Max deliver dependable, all-day endurance that easily handles demanding tasks. However, this year's modest gains highlight an area where Android manufacturers are pulling ahead. While the new A20 Pro chip is an efficiency powerhouse, Apple’s reliance on conventional lithium-ion batteries has clearly reached its limits.</p><p>To truly unlock multi-day battery life — like the staggering endurance we're seeing on the OnePlus 15 — Apple needs to explore silicon-carbon battery technology. Silicon-carbon anodes provide substantially higher energy density without adding bulk, preserving the slim profiles and comfortable ergonomics users expect. While Apple can claim a clear victory over Samsung and Google for now, embracing this battery tech is the essential next step if it wants to capture the overall endurance crown.</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/why-your-iphone-says-optimizing-search-and-siri-in-ios-27-and-how-to-speed-it-up">Why your iPhone says 'Optimizing Search and Siri' in iOS 27 — and how to speed it up</a></li><li><a href="https://www.tomsguide.com/phones/iphones/applecare-one-family-now-live-for-usd50-a-month-in-time-for-iphone-18-pro-launch-heres-what-it-actually-covers">AppleCare One Family now live for $50 a month in time for iPhone 18 Pro launch — here's what it actually covers</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-which-foldable-is-best-for-you">iPhone Duo vs Samsung Galaxy Z Fold 8: Which foldable phone will win?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-and-18-pro-battery-life-tested-the-results-are-surprising</link>
                                                                            <description>
                            <![CDATA[ While the iPhone 18 Pro and iPhone 18 Pro Max battery life results are in. While they beat out many Androids, the year-over-year gains could've been better. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">w2odrd2H7btP3jKGkfkSCG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZhVLRJCFGxVjGeDa3TaWmK-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 17:10:55 +0000</pubDate>                                                                                                                                <updated>Wed, 16 Sep 2026 18:15: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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZhVLRJCFGxVjGeDa3TaWmK-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple iPhone 18 Pro and Pro Max shown in hand]]></media:description>                                                            <media:text><![CDATA[Apple iPhone 18 Pro and Pro Max shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Apple iPhone 18 Pro and Pro Max shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZhVLRJCFGxVjGeDa3TaWmK-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With every new release, Apple is confident about the endurance of its devices — and that hasn't changed with the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-review">iPhone 18 Pro Max and iPhone 18 Pro</a>. Even with expectations set higher than ever, the stakes are undeniably steep for this year's Pro lineup.</p><p>Not only do they need to prove their endurance against their predecessors to truly earn the <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhone</a> crown, but they also need to outlast many of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a> around. Apple leaves no doubt that these are positioned as the longest-lasting phones it's ever built, backing up those claims with the efficiency gains of the new <a href="https://www.tomsguide.com/phones/iphones/apple-a20-pro-chip-why-its-such-a-big-deal-for-the-iphone-ultra-and-iphone-18-pro-max">A20 Pro silicon</a> alongside upgraded battery capacities.</p><p>After putting both handsets through our custom battery drain test, the results are surprising. Here’s what we found.</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/QJVNbFMd-zQ" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-iphone-18-pros-vs-iphone-17-pros-battery-life-comparison"><span>iPhone 18 Pros vs iPhone 17 Pros battery life comparison</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery life (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro Max</strong></p></td><td  ><p>18:27</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro</strong></p></td><td  ><p>16:17</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>17:54</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro</strong></p></td><td  ><p>15:21</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 16 Pro Max</strong></p></td><td  ><p>17:17</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 16 Pro</strong></p></td><td  ><p>14:07</p></td></tr></tbody></table></div><p>If you check <a href="https://www.apple.com/iphone/compare/" target="_blank">Apple’s official comparison tool</a>, the iPhone 18 Pro Max and 18 Pro are rated for up to 45 and 36 hours of video playback, respectively. In the <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">Tom’s Guide battery test</a>, however, we test real-world endurance by setting displays to 150 nits and running an automated script that simulates web browsing over a cellular connection until the device shuts off.</p><p>Our testing reveals an average battery life of 16 hours and 17 minutes for the iPhone 18 Pro, while the iPhone 18 Pro Max stretches that endurance to 18 hours and 27 minutes. While both represent clear year-over-year gains, the numbers are surprising given the heavy emphasis placed on the A20 Pro’s power efficiency.</p><p>Specifically, the iPhone 18 Pro Max lasted 33 minutes longer than the iPhone 17 Pro Max — a modest 3.1% increase. The iPhone 18 Pro gets a more meaningful jump, outlasting the iPhone 17 Pro by 56 minutes for a 6.1% bump. Even if these figures don't quite deliver the dramatic generational leap many anticipated from Apple's shift to 2nm silicon, progress is progress nonetheless.</p><h3 class="article-body__section" id="section-how-they-compare-to-rival-android-phones"><span>How they compare to rival Android phones</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery Life (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro Max </strong></p></td><td  ><p>18:27 </p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro</strong></p></td><td  ><p>16:17</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra </strong></p></td><td  ><p>16:40</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus 15</strong></p></td><td  ><p>25:13</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 11 Pro XL</strong></p></td><td  ><p>14:28</p></td></tr></tbody></table></div><p>Just as importantly, the iPhone 18 Pro Max and iPhone 18 Pro need to prove their worth against their primary Android rivals. The iPhone 18 Pro Max holds its ground convincingly against key competitors like the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a> and <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review">Pixel 11 Pro XL</a>. It bests Samsung’s flagship by a solid margin of 1 hour and 47 minutes, a lead that stretches to nearly 4 hours over Google’s largest Pixel. Meanwhile, the smaller iPhone 18 Pro also holds its own against these supersized flagships, trailing the Galaxy S26 Ultra by just 23 minutes despite its noticeably more compact footprint.</p><p>Despite these promising gains, neither iPhone can touch the staggering endurance of the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-15-review">OnePlus 15</a> — the undisputed <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">best phone battery life</a> champion. Clocking in at an unbelievable 25 hours and 13 minutes, the OnePlus remains in a league of its own, beating the iPhone 18 Pro Max by more than 6.5 hours. That victory is largely thanks to the massive 7,300 mAh silicon-carbon battery packed beneath its hood.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-and-18-pro-battery-life-bottom-line"><span>iPhone 18 Pro Max and 18 Pro battery life: Bottom line</span></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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4edCqgzDe6Geozici7QFqK" name="iPhone 18 Pro and Pro Max-14" alt="Apple iPhone 18 Pro and Pro Max shown in hand" src="https://cdn.mos.cms.futurecdn.net/4edCqgzDe6Geozici7QFqK-1920-80.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: Tom's Guide)</span></figcaption></figure><p>The iPhone 18 Pro and iPhone 18 Pro Max deliver dependable, all-day endurance that easily handles demanding tasks. However, this year's modest gains highlight an area where Android manufacturers are pulling ahead. While the new A20 Pro chip is an efficiency powerhouse, Apple’s reliance on conventional lithium-ion batteries has clearly reached its limits.</p><p>To truly unlock multi-day battery life — like the staggering endurance we're seeing on the OnePlus 15 — Apple needs to explore silicon-carbon battery technology. Silicon-carbon anodes provide substantially higher energy density without adding bulk, preserving the slim profiles and comfortable ergonomics users expect. While Apple can claim a clear victory over Samsung and Google for now, embracing this battery tech is the essential next step if it wants to capture the overall endurance crown.</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/why-your-iphone-says-optimizing-search-and-siri-in-ios-27-and-how-to-speed-it-up">Why your iPhone says 'Optimizing Search and Siri' in iOS 27 — and how to speed it up</a></li><li><a href="https://www.tomsguide.com/phones/iphones/applecare-one-family-now-live-for-usd50-a-month-in-time-for-iphone-18-pro-launch-heres-what-it-actually-covers">AppleCare One Family now live for $50 a month in time for iPhone 18 Pro launch — here's what it actually covers</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-which-foldable-is-best-for-you">iPhone Duo vs Samsung Galaxy Z Fold 8: Which foldable phone will win?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I used Gemini and Google Maps’ Ask Maps to find the weirdest spots in my city — and these 7 oddities didn't disappoint ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As a native New Yorker, I’m sure some of you can relate to what I’m about to say: my city hosts some of the most eccentric locales anyone has ever seen.</p><p>Forget the usual hotspots that tourists flock to while they’re adorned in “I LOVE NY!” shirts and caps. There’s so much more to see and do beyond just walking around Times Square, taking the boat to Ellis Island to stare at the Statue of Liberty and taking a selfie in front of Madison Square Garden. I’m always on the lookout for speakeasies, arcades packed to the brim with retro games, quirky museums and other sorts of unique locales.</p><p>I already had two AI tools in mind when trying to come up with a list of strange places to head out to: Gemini and Google Maps’ trusty Ask Maps feature. I approached both of Google’s chatbot assistants with this simple request: “Find me 7 of the weirdest yet entertaining attractions in New York City.”</p><p>Both Gemini and Google Maps’ Ask Maps scoured every borough of my city and came back with a host of trippy locales that appeal to my interests as an intrepid metro adventurer. These are the 7 weirdest hotspots that I can’t wait to take a weekend trip to.</p><h2 id="gemini-s-suggestions-for-local-locales-that-are-a-bit-weirder-than-most">Gemini’s suggestions for local locales that are a bit weirder than most</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="khDeAxiQopKGFj9NkTBKPD" name="shutterstock_2462089573 (1)" alt="pinball" src="https://cdn.mos.cms.futurecdn.net/khDeAxiQopKGFj9NkTBKPD-1920-80.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: Shutterstock)</span></figcaption></figure><p>When it was Gemini’s turn, it met me with four equally intriguing locales that are definitely out of the norm when it comes to oddball gimmicks:</p><ul><li><strong>Evolution Store (SoHo): </strong><em>A cabinet of curiosities brought to life, this shop caters to collectors of the macabre, science enthusiasts, and oddity seekers. You’ll find real human and animal skulls, taxidermy, pinned exotic beetles, meteorites, and prehistoric fossils alongside medical antiques.</em></li><li><strong>Sunshine Laundromat & Pinball (Greenpoint): </strong><em>At first glance, it looks like a standard neighborhood laundromat with people folding shirts. But if you push open the fake washing machine door toward the back, you’ll step into a speakeasy arcade filled with decades of classic pinball machines and a full craft beer bar.</em></li><li><strong>The Whispering Gallery at Grand Central Terminal (Midtown): </strong><em>Located right outside the Grand Central Oyster Bar, this acoustic anomaly is built into the tiled Guastavino arches. If two people stand at diagonally opposite corners of the square entryway and whisper into the wall, the sound waves travel cleanly along the curved ceiling, letting you hear each other clearly over the noise of the terminal.</em></li><li><strong>Dream House (TriBeCa): </strong><em>Created by minimalist composer La Monte Young and visual artist Marian Zazeela, this continuous sound-and-light installation has been running in a light-filled room on Church Street since 1993. Visitors take off their shoes, lie on a plush carpet, and immerse themselves in a dense chord produced by sine-wave generators and neon geometric lighting.</em></li></ul><p>After reading through the descriptions of all four of Gemini’s picks, I got even more excited to venture out to each one of them over the course of the next several weekends. </p><p>The Evolution Store’s selection of bracelets and framed butterflies matches my type of vibe; the Sunshine Laundromat & Pinball targets my interest in regular locals that cleverly feature hidden gems; The Whispering Gallery at Grand Central Terminal sounds like a perfect spot for me and one of my friends to go to and see if our whispers truly reach each other; the Dream House appeals to me as a stress-relieving site that I can frequent from this point forward.</p><h2 id="google-maps-ask-maps-strange-hotspot-recommendations">Google Maps’ Ask Maps strange hotspot recommendations</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:1170px;"><p class="vanilla-image-block" style="padding-top:216.41%;"><img id="BSyYNssGvrAdiw8VooZrM" name="IMG_8243.PNG" alt="ask maps google" src="https://cdn.mos.cms.futurecdn.net/BSyYNssGvrAdiw8VooZrM-1920-80.png" mos="" align="middle" fullscreen="" width="1170" height="2532" 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>After presenting my prompt to Google Maps’ Ask Maps, it spread out its seven pics across two categories: “Manhattan Oddities” and “Brooklyn Quirks.” Here are the three venues I end up adding to my future weekend hangout schedule:</p><ul><li><em>Tucked into a gritty Lower Manhattan alleyway, Mmuseumm is an eccentric, 60-square-foot museum built entirely inside an old freight elevator shaft. It explicitly explores the modern world through an absurd collection of regular everyday objects. </em><em><strong>What You’ll See: </strong></em><em>Oddities ranging from unique toothpaste tubs collected across the globe to weird papers accidentally left behind in copy machines. </em><em><strong>Fun Feature: </strong></em><em>Despite the minuscule footprint, they have squeezed in a tiny gift shop and a cafe shelf.</em></li><li><em>Hiding behind a bright bodega-style canopy in Williamsburg, The City Reliquary is a micro-museum completely obsessed with the odd, forgotten relics of New York history. </em><em><strong>The Collection: </strong></em><em>Forget high art—this museum proudly showcases rows of vintage New York seltzer bottles, old subway tokens, and even actual subway rat bones. </em><em><strong>Community Focus: </strong></em><em>The back rooms rotate display cases dedicated to bizarre personal collections curated by everyday locals.</em></li><li><em>If you need a new cape, a canister of “Chilled Fog,” or a fresh bucket of invisibility paint, Brooklyn Superhero Supply Co. in Park Slope has you covered. The retail front operates entirely as a dedicated, fully in-character shop selling crime-fighting accessories. </em><em><strong>The Secret Identity: </strong></em><em>The entire store is a clever front. If you pull back the correct bookshelf, you discover a secret door that opens into a hidden library housing 826NYC, a nonprofit creative writing center for kids. </em><em><strong>Store Rule: </strong></em><em>Be prepared—employees strictly require all customers to loudly recite a vow of heroism at the counter before completing any purchase.</em></li></ul><p>As someone who frequently hits up museums, is amazed by the sort of objects I don’t come across on the regular and is enraptured by the heroics of my favorite Marvel Comics & DC Comics costume characters, those three aforementioned hubs spoke to me the most. The promise of a hidden creative writing mecca for kids housed within a superhero item shop should definitely appeal to any of my younger cousins who love that type of stuff.</p><h2 id="final-thoughts-2">Final thoughts</h2><p>Gemini and Google Maps’ Ask Map feature have become one of my go-to AI tools for finding a wide swath of local and non-local venues to go to whenever I’m planning solo endeavors, group hangouts and first dates. In this case, they both came in clutch during my journey to discover the strangest yet infinitely cool locations that are littered across my city. </p><p>Not only do I have plenty of random spots to hit up over the next few months, but I also have a newfound desire to prompt Gemini and Google Maps’ Ask Maps to help me find even more bizarre locales worthy of my attention.</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-used-ask-maps-in-google-maps-to-find-the-best-date-spots-in-my-city-and-the-recommendations-were-a-lot-better-than-i-expected" target="_blank">I tried Google’s new ‘Ask Maps’ feature for date night — it was shockingly good</a></li><li><a href="https://www.tomsguide.com/ai/snickers-made-a-digital-candy-bar-that-claims-to-fix-chatgpt-i-put-it-to-the-test" target="_blank">Snickers made a digital candy bar that claims to fix ChatGPT — I put it to the test</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-what-everyday-products-arent-worth-buying-these-are-the-5-items-i-completely-abandoned" target="_blank">I asked ChatGPT and Gemini what everyday products aren’t worth buying — these are the 5 items I completely abandoned</a></li></ul><div data-widget-type="comparison" data-model-name="Apple MacBook Neo"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-used-gemini-and-google-maps-ask-maps-to-find-the-weirdest-spots-in-my-city-and-these-7-oddities-didnt-disappoint</link>
                                                                            <description>
                            <![CDATA[ In my quest for unusual places to hang out in my hometown, Gemini and Google Maps’ Ask Maps came together to recommend the best of the best. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Rpt6DRzhCXwzvsnVM5fiha</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oo8ehrQX8i8uUXamUsUho5-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 07:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Google Gemini]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/oo8ehrQX8i8uUXamUsUho5-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[new york graffiti]]></media:description>                                                            <media:text><![CDATA[new york graffiti]]></media:text>
                                <media:title type="plain"><![CDATA[new york graffiti]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oo8ehrQX8i8uUXamUsUho5-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As a native New Yorker, I’m sure some of you can relate to what I’m about to say: my city hosts some of the most eccentric locales anyone has ever seen.</p><p>Forget the usual hotspots that tourists flock to while they’re adorned in “I LOVE NY!” shirts and caps. There’s so much more to see and do beyond just walking around Times Square, taking the boat to Ellis Island to stare at the Statue of Liberty and taking a selfie in front of Madison Square Garden. I’m always on the lookout for speakeasies, arcades packed to the brim with retro games, quirky museums and other sorts of unique locales.</p><p>I already had two AI tools in mind when trying to come up with a list of strange places to head out to: Gemini and Google Maps’ trusty Ask Maps feature. I approached both of Google’s chatbot assistants with this simple request: “Find me 7 of the weirdest yet entertaining attractions in New York City.”</p><p>Both Gemini and Google Maps’ Ask Maps scoured every borough of my city and came back with a host of trippy locales that appeal to my interests as an intrepid metro adventurer. These are the 7 weirdest hotspots that I can’t wait to take a weekend trip to.</p><h2 id="gemini-s-suggestions-for-local-locales-that-are-a-bit-weirder-than-most">Gemini’s suggestions for local locales that are a bit weirder than most</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="khDeAxiQopKGFj9NkTBKPD" name="shutterstock_2462089573 (1)" alt="pinball" src="https://cdn.mos.cms.futurecdn.net/khDeAxiQopKGFj9NkTBKPD-1920-80.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: Shutterstock)</span></figcaption></figure><p>When it was Gemini’s turn, it met me with four equally intriguing locales that are definitely out of the norm when it comes to oddball gimmicks:</p><ul><li><strong>Evolution Store (SoHo): </strong><em>A cabinet of curiosities brought to life, this shop caters to collectors of the macabre, science enthusiasts, and oddity seekers. You’ll find real human and animal skulls, taxidermy, pinned exotic beetles, meteorites, and prehistoric fossils alongside medical antiques.</em></li><li><strong>Sunshine Laundromat & Pinball (Greenpoint): </strong><em>At first glance, it looks like a standard neighborhood laundromat with people folding shirts. But if you push open the fake washing machine door toward the back, you’ll step into a speakeasy arcade filled with decades of classic pinball machines and a full craft beer bar.</em></li><li><strong>The Whispering Gallery at Grand Central Terminal (Midtown): </strong><em>Located right outside the Grand Central Oyster Bar, this acoustic anomaly is built into the tiled Guastavino arches. If two people stand at diagonally opposite corners of the square entryway and whisper into the wall, the sound waves travel cleanly along the curved ceiling, letting you hear each other clearly over the noise of the terminal.</em></li><li><strong>Dream House (TriBeCa): </strong><em>Created by minimalist composer La Monte Young and visual artist Marian Zazeela, this continuous sound-and-light installation has been running in a light-filled room on Church Street since 1993. Visitors take off their shoes, lie on a plush carpet, and immerse themselves in a dense chord produced by sine-wave generators and neon geometric lighting.</em></li></ul><p>After reading through the descriptions of all four of Gemini’s picks, I got even more excited to venture out to each one of them over the course of the next several weekends. </p><p>The Evolution Store’s selection of bracelets and framed butterflies matches my type of vibe; the Sunshine Laundromat & Pinball targets my interest in regular locals that cleverly feature hidden gems; The Whispering Gallery at Grand Central Terminal sounds like a perfect spot for me and one of my friends to go to and see if our whispers truly reach each other; the Dream House appeals to me as a stress-relieving site that I can frequent from this point forward.</p><h2 id="google-maps-ask-maps-strange-hotspot-recommendations">Google Maps’ Ask Maps strange hotspot recommendations</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:1170px;"><p class="vanilla-image-block" style="padding-top:216.41%;"><img id="BSyYNssGvrAdiw8VooZrM" name="IMG_8243.PNG" alt="ask maps google" src="https://cdn.mos.cms.futurecdn.net/BSyYNssGvrAdiw8VooZrM-1920-80.png" mos="" align="middle" fullscreen="" width="1170" height="2532" 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>After presenting my prompt to Google Maps’ Ask Maps, it spread out its seven pics across two categories: “Manhattan Oddities” and “Brooklyn Quirks.” Here are the three venues I end up adding to my future weekend hangout schedule:</p><ul><li><em>Tucked into a gritty Lower Manhattan alleyway, Mmuseumm is an eccentric, 60-square-foot museum built entirely inside an old freight elevator shaft. It explicitly explores the modern world through an absurd collection of regular everyday objects. </em><em><strong>What You’ll See: </strong></em><em>Oddities ranging from unique toothpaste tubs collected across the globe to weird papers accidentally left behind in copy machines. </em><em><strong>Fun Feature: </strong></em><em>Despite the minuscule footprint, they have squeezed in a tiny gift shop and a cafe shelf.</em></li><li><em>Hiding behind a bright bodega-style canopy in Williamsburg, The City Reliquary is a micro-museum completely obsessed with the odd, forgotten relics of New York history. </em><em><strong>The Collection: </strong></em><em>Forget high art—this museum proudly showcases rows of vintage New York seltzer bottles, old subway tokens, and even actual subway rat bones. </em><em><strong>Community Focus: </strong></em><em>The back rooms rotate display cases dedicated to bizarre personal collections curated by everyday locals.</em></li><li><em>If you need a new cape, a canister of “Chilled Fog,” or a fresh bucket of invisibility paint, Brooklyn Superhero Supply Co. in Park Slope has you covered. The retail front operates entirely as a dedicated, fully in-character shop selling crime-fighting accessories. </em><em><strong>The Secret Identity: </strong></em><em>The entire store is a clever front. If you pull back the correct bookshelf, you discover a secret door that opens into a hidden library housing 826NYC, a nonprofit creative writing center for kids. </em><em><strong>Store Rule: </strong></em><em>Be prepared—employees strictly require all customers to loudly recite a vow of heroism at the counter before completing any purchase.</em></li></ul><p>As someone who frequently hits up museums, is amazed by the sort of objects I don’t come across on the regular and is enraptured by the heroics of my favorite Marvel Comics & DC Comics costume characters, those three aforementioned hubs spoke to me the most. The promise of a hidden creative writing mecca for kids housed within a superhero item shop should definitely appeal to any of my younger cousins who love that type of stuff.</p><h2 id="final-thoughts-2">Final thoughts</h2><p>Gemini and Google Maps’ Ask Map feature have become one of my go-to AI tools for finding a wide swath of local and non-local venues to go to whenever I’m planning solo endeavors, group hangouts and first dates. In this case, they both came in clutch during my journey to discover the strangest yet infinitely cool locations that are littered across my city. </p><p>Not only do I have plenty of random spots to hit up over the next few months, but I also have a newfound desire to prompt Gemini and Google Maps’ Ask Maps to help me find even more bizarre locales worthy of my attention.</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-used-ask-maps-in-google-maps-to-find-the-best-date-spots-in-my-city-and-the-recommendations-were-a-lot-better-than-i-expected" target="_blank">I tried Google’s new ‘Ask Maps’ feature for date night — it was shockingly good</a></li><li><a href="https://www.tomsguide.com/ai/snickers-made-a-digital-candy-bar-that-claims-to-fix-chatgpt-i-put-it-to-the-test" target="_blank">Snickers made a digital candy bar that claims to fix ChatGPT — I put it to the test</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-what-everyday-products-arent-worth-buying-these-are-the-5-items-i-completely-abandoned" target="_blank">I asked ChatGPT and Gemini what everyday products aren’t worth buying — these are the 5 items I completely abandoned</a></li></ul><div data-widget-type="comparison" data-model-name="Apple MacBook Neo"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm a personal trainer — this is the surprising lower-body mobility exercise I recommend to most people after 50 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I'm someone with very tight ankles, as I explained during my <a href="https://www.tomsguide.com/wellness/workouts/i-fixed-a-hidden-problem-holding-back-my-squats-with-this-30-day-fix-your-ankles-mobility-routine-and-i-cant-believe-the-results-so-far">30-day "Fix Your Ankles" mobility challenge</a>, which (sadly) limits my squat depth. Squats are one of the best compound exercises for building lower-body strength, and while they're not exactly essential for every resistance routine, they're certainly one of the most effective movements out there. </p><p>There are squat variations that work better for my body, including front squats, but one I've been working on recently is the supported stiletto squat or heel-raised squat. I use it with my dad, whose tight ankles I'm starting to think might be genetic. He credits the exercise with improving squat depth and working his quads harder. </p><p>Before you get started learning how and why the supported stiletto squat is worth it, it might not be suitable for those with bad knees, though it will help strengthen the muscles surrounding the joints. If you're worried about pain or injuries, I recommend speaking with a health professional beforehand. </p><h2 id="watch-supported-stiletto-squat">Watch: Supported stiletto squat </h2><p><em>If you experience pain at any time, stop and rest. If you're working with an injury or health condition, I recommend seeking advice before starting this exercise, especially if you find it difficult to bend or kneel.</em></p><iframe src="https://content.jwplatform.com/players/2VVr9QsU.html" id="2VVr9QsU" title="Project Move - Feet-elevated Goblet Squat" width="960" height="540" frameborder="0" scrolling="auto" allowfullscreen></iframe><ul><li>Place blocks or plates roughly hip-width apart behind you. Roll onto the balls of your feet and rest your heels on the plates or blocks.</li><li>Engage your core, bracing your stomach as if expecting an impact while drawing your navel in and up.</li><li>Sit your hips back and perform a squat, lowering slowly and with control. Keep your spine straight and chest proud without leaning forward.</li><li>Pause at the bottom of the squat, then drive upward through your legs to stand. Try to keep your knees tracking in line with your toes and avoid rounding your back.</li></ul><p>The supported stiletto squat works your glutes, hips and legs with a quad and front-loaded focus, but unlike the supported version, it tests balance less while still helping improve ankle mobility. Try to stay up on your tiptoes to work the calf muscles harder.</p><p>The position of the block or plate beneath your heels elevates the back body more, tilting your weight further forward over your toes. That said, it's important to keep your heels down and sit your hips back into the squat rather than trying to move vertically. Think about a chair behind you as you lower.</p><p>People with tight ankles will enjoy this squat variation because it allows them to sit deeper, increase range of motion, and work their lower body harder without being limited. As soon as my dad elevated his heels this way, he could sit much deeper into his squat and reported that his legs and quads were working harder.</p><p>Try to stand with your feet hip-width apart and move with your body weight first. Next, hold a weight in each hand at your shoulders. You could also hold one weight to your chest using both hands, extend your weights out in front of you, or even press the weights overhead for an overhead squat. </p><p>As you lower into the squat, keep your chest proud and try to avoid tilting forward. Stay tall and focus on a slow descent and powerful ascent to maximize control and power. At the bottom of the squat, pause for a moment, then drive up to stand. </p><h2 id="what-are-the-benefits">What are the benefits?</h2><div><blockquote><p>Unlike the unsupported stiletto squat, which requires you to balance on your toes without support for your heels, the supported version allows you to lift heavier while still improving stability and engaging your core. </p></blockquote></div><p>Unlike the unsupported stiletto squat, which requires you to balance on your toes without support for your heels, the supported version allows you to lift heavier while still improving stability and engaging your core. </p><p>If you have particularly tight ankles, I recommend focusing on a regular <a href="https://www.tomsguide.com/wellness/fitness/im-a-personal-trainer-improve-your-squats-and-runs-with-this-5-move-ankle-mobility-routine">ankle mobility routine</a> to improve range of motion over time, but the supported heel-raised squat will allow you to sit deeper and reach parallel with less struggle and pain.</p><p>Some people are blessed with healthy joints and may never sacrifice range of motion due to mobility, but for others, it can inhibit lower-body movement significantly. </p><p>You're still strengthening your glutes, core, hips, hamstrings, quads and calves without letting your knees pass too far over your ankles, though your individual anatomy, like the length of your bones, will influence this to some degree, too. Just ensure you're not straining your knees while you move. </p><p>This bodyweight exercise is especially great for runners, those who are currently rehabbing an injury, or anyone building up to squats.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEq7ae"></div>                            </div>                            <script src="https://kwizly.com/embed/eEq7ae.js" async></script><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank">I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-how-to-be-strong-and-mobile-this-is-the-one-exercise-i-regret-ignoring-for-years" target="_blank">I teach people how to be strong and mobile: this is the one exercise I regret ignoring for years</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-over-50-to-be-mobile-3-low-impact-moves-that-build-more-stability-than-a-30-minute-walk" target="_blank">I teach people over 50 to be mobile: 3 low-impact moves that build more stability than a 30-minute walk</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/workouts/im-a-personal-trainer-this-is-the-surprising-lower-body-exercise-i-recommend-to-most-people-after-50-trying-to-boost-mobility</link>
                                                                            <description>
                            <![CDATA[ If you have tight ankles and limited mobility, the heel-raised stiletto squat builds lower-body strength and targets your quads more; here's how to do it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">oZQfBVkD7Fqww75adKoE34</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hf38iNKPGxXgn4j9VqsFWm-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 06:15:00 +0000</pubDate>                                                                                                                                <updated>Wed, 16 Sep 2026 14:30:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Workouts]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                <author><![CDATA[ sam.hopes@futurenet.com (Sam Hopes) ]]></author>                    <dc:creator><![CDATA[ Sam Hopes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jZ88qJqvjWaCXXv3qvUQPA-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Sam Hopes is a level 3 qualified trainer, a level 2 Reiki practitioner and a fitness editor at Tom&#039;s Guide. She is also currently undertaking her Yoga For Athletes training course. Sam has written for various fitness brands and websites over the years and has experience across brands at Future, such as &lt;a href=&quot;https://www.livescience.com/author/sam-hopes&quot;&gt;Live Science&lt;/a&gt;,&lt;a href=&quot;https://www.fitandwell.com/author/sam-hopes&quot;&gt; Fit&amp;amp;Well&lt;/a&gt;,&lt;a href=&quot;https://www.coachweb.com/author/sam-hopes&quot;&gt; Coach&lt;/a&gt;, and T3. &lt;/p&gt;&lt;p&gt;Having worked with fitness studios like F45 and Virgin Active and trained both group and 1:1, Sam now primarily teaches outdoor bootcamps, bodyweight, and kettlebells. She also coaches mobility and flexibility classes several times a week and believes that true strength comes from a holistic approach to training your body. &lt;/p&gt;&lt;p&gt;Sam has completed two mixed doubles Hyrox competitions in London and the Netherlands and finished her first doubles attempt in 1:11.&lt;/p&gt;&lt;p&gt;In her spare time, she enjoys CrossFit, hot yoga, Pilates and running and can be found perfecting her handstand walks and handstand push-ups in the gym whenever she has the chance to be upside down. At work, she can be found testing the latest in fitness technology and wearables, anything yoga and CrossFit-related and has a keen interest in nutrition, mindfulness, sleep and recovery.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/hf38iNKPGxXgn4j9VqsFWm-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Woman smiling at camera with hands on hips showing abs in activewear]]></media:description>                                                            <media:text><![CDATA[Woman smiling at camera with hands on hips showing abs in activewear]]></media:text>
                                <media:title type="plain"><![CDATA[Woman smiling at camera with hands on hips showing abs in activewear]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hf38iNKPGxXgn4j9VqsFWm-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I'm someone with very tight ankles, as I explained during my <a href="https://www.tomsguide.com/wellness/workouts/i-fixed-a-hidden-problem-holding-back-my-squats-with-this-30-day-fix-your-ankles-mobility-routine-and-i-cant-believe-the-results-so-far">30-day "Fix Your Ankles" mobility challenge</a>, which (sadly) limits my squat depth. Squats are one of the best compound exercises for building lower-body strength, and while they're not exactly essential for every resistance routine, they're certainly one of the most effective movements out there. </p><p>There are squat variations that work better for my body, including front squats, but one I've been working on recently is the supported stiletto squat or heel-raised squat. I use it with my dad, whose tight ankles I'm starting to think might be genetic. He credits the exercise with improving squat depth and working his quads harder. </p><p>Before you get started learning how and why the supported stiletto squat is worth it, it might not be suitable for those with bad knees, though it will help strengthen the muscles surrounding the joints. If you're worried about pain or injuries, I recommend speaking with a health professional beforehand. </p><h2 id="watch-supported-stiletto-squat">Watch: Supported stiletto squat </h2><p><em>If you experience pain at any time, stop and rest. If you're working with an injury or health condition, I recommend seeking advice before starting this exercise, especially if you find it difficult to bend or kneel.</em></p><iframe src="https://content.jwplatform.com/players/2VVr9QsU.html" id="2VVr9QsU" title="Project Move - Feet-elevated Goblet Squat" width="960" height="540" frameborder="0" scrolling="auto" allowfullscreen></iframe><ul><li>Place blocks or plates roughly hip-width apart behind you. Roll onto the balls of your feet and rest your heels on the plates or blocks.</li><li>Engage your core, bracing your stomach as if expecting an impact while drawing your navel in and up.</li><li>Sit your hips back and perform a squat, lowering slowly and with control. Keep your spine straight and chest proud without leaning forward.</li><li>Pause at the bottom of the squat, then drive upward through your legs to stand. Try to keep your knees tracking in line with your toes and avoid rounding your back.</li></ul><p>The supported stiletto squat works your glutes, hips and legs with a quad and front-loaded focus, but unlike the supported version, it tests balance less while still helping improve ankle mobility. Try to stay up on your tiptoes to work the calf muscles harder.</p><p>The position of the block or plate beneath your heels elevates the back body more, tilting your weight further forward over your toes. That said, it's important to keep your heels down and sit your hips back into the squat rather than trying to move vertically. Think about a chair behind you as you lower.</p><p>People with tight ankles will enjoy this squat variation because it allows them to sit deeper, increase range of motion, and work their lower body harder without being limited. As soon as my dad elevated his heels this way, he could sit much deeper into his squat and reported that his legs and quads were working harder.</p><p>Try to stand with your feet hip-width apart and move with your body weight first. Next, hold a weight in each hand at your shoulders. You could also hold one weight to your chest using both hands, extend your weights out in front of you, or even press the weights overhead for an overhead squat. </p><p>As you lower into the squat, keep your chest proud and try to avoid tilting forward. Stay tall and focus on a slow descent and powerful ascent to maximize control and power. At the bottom of the squat, pause for a moment, then drive up to stand. </p><h2 id="what-are-the-benefits">What are the benefits?</h2><div><blockquote><p>Unlike the unsupported stiletto squat, which requires you to balance on your toes without support for your heels, the supported version allows you to lift heavier while still improving stability and engaging your core. </p></blockquote></div><p>Unlike the unsupported stiletto squat, which requires you to balance on your toes without support for your heels, the supported version allows you to lift heavier while still improving stability and engaging your core. </p><p>If you have particularly tight ankles, I recommend focusing on a regular <a href="https://www.tomsguide.com/wellness/fitness/im-a-personal-trainer-improve-your-squats-and-runs-with-this-5-move-ankle-mobility-routine">ankle mobility routine</a> to improve range of motion over time, but the supported heel-raised squat will allow you to sit deeper and reach parallel with less struggle and pain.</p><p>Some people are blessed with healthy joints and may never sacrifice range of motion due to mobility, but for others, it can inhibit lower-body movement significantly. </p><p>You're still strengthening your glutes, core, hips, hamstrings, quads and calves without letting your knees pass too far over your ankles, though your individual anatomy, like the length of your bones, will influence this to some degree, too. Just ensure you're not straining your knees while you move. </p><p>This bodyweight exercise is especially great for runners, those who are currently rehabbing an injury, or anyone building up to squats.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEq7ae"></div>                            </div>                            <script src="https://kwizly.com/embed/eEq7ae.js" async></script><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank">I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-how-to-be-strong-and-mobile-this-is-the-one-exercise-i-regret-ignoring-for-years" target="_blank">I teach people how to be strong and mobile: this is the one exercise I regret ignoring for years</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-over-50-to-be-mobile-3-low-impact-moves-that-build-more-stability-than-a-30-minute-walk" target="_blank">I teach people over 50 to be mobile: 3 low-impact moves that build more stability than a 30-minute walk</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I bought Instagram's new Meta One subscription — here's what $7.99 actually gets you ]]></title>
                                                                                                <dc:content><![CDATA[ <p>You may have noticed Instagram, Facebook and WhatsApp — all products of Meta Platforms — have AI tools. More specifically <a href="https://www.tomsguide.com/ai/meta-just-launched-an-ai-that-can-actually-run-your-life-online-heres-what-muse-can-do">Meta Muse</a>. And, if you've been having fun playing around with the various features like send emails, book travel or create images, I have news for you: you may eventually run into a paywall. </p><p>On Tuesday (Sept. 15), Meta officially launched Meta One, a new subscription service that bundles premium features across Instagram, Facebook and WhatsApp while giving subscribers higher limits for some of the company's most compute-intensive AI tools.</p><p>The company says Meta One plans are available globally, although pricing, features and availability can vary depending on your region, app and account.</p><p>You definitely don't need to subscribe to keep scrolling Instagram, messaging friends on WhatsApp or using <a href="https://www.tomsguide.com/how-to-use-meta-ai">Meta AI</a> normally. Meta says the core experiences across its apps and Meta AI will remain free.</p><p>The catch is that some of the more demanding AI features now come with usage limits. Hit one, and you could be asked to pay if you want to keep going.</p><h2 id="so-what-exactly-are-you-paying-for">So what exactly are you paying for?</h2><p>Interestingly, Meta One isn't a single subscription with a single price.</p><p>In the U.S., Meta offers separate Plus plans for its individual apps: Instagram Plus costs $3.99 a month, Facebook Plus costs $3.99 and WhatsApp Plus costs $2.99. Each adds its own collection of extras.</p><p>Instagram Plus, for example, includes features such as custom fonts for DMs and Stories, notifications when certain people view your Story and DM previews. WhatsApp Plus includes exclusive themes and icons, special-effect stickers and the ability to pin more chats.</p><h2 id="meta-39-s-ai-tools-are-meta-one-core-and-premium">Meta's AI tools are Meta One Core and Premium</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:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oENiEfZsNmnJoYiGo9RRo5" name="Instagram logo" alt="Instagram logo" src="https://cdn.mos.cms.futurecdn.net/oENiEfZsNmnJoYiGo9RRo5-1920-80.jpg" mos="" align="middle" fullscreen="" width="4000" height="2250" 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>The plans for anyone using Meta's AI tools are Meta One Core and Premium. Core costs $7.99 a month and includes the features from all three individual subscriptions. More importantly, it increases how often you can use features including Instagram Restyle and voice effects, as well as how many images and videos you can generate with Meta AI.</p><p>Premium jumps to $19.99 a month and includes everything in Core with even higher AI usage limits.</p><p>In other words, Meta isn't necessarily charging you to use its AI. It's starting to charge its heaviest users to use more of it.</p><h2 id="how-soon-will-you-hit-a-paywall">How soon will you hit a paywall? </h2><p>Despite having the subscription and using the AI tools pretty regularly for experimenting and reviewing, I have not hit a paywall yet, but <a href="https://www.businessinsider.com/instagram-ai-photo-editing-tools-meta-one-monthly-subscription-pay-2026-9" target="_blank">Business Insider's Sydney Bradley encountered the limit </a>while experimenting with Instagram's AI photo-editing effects. After repeatedly using the tools, Instagram presented an option to upgrade to Meta One Core for additional AI usage rather than continue using the feature freely.</p><p>If you occasionally use Meta AI to answer a question or try an Instagram AI effect, Meta says everyday Meta AI use remains free. But start generating or editing enough images and videos and you may find there's now a ceiling on how much you can do without paying.</p><p><strong>Meta hasn't published one simple universal number telling users exactly how many AI generations or edits they get for free</strong>. The company says plans, benefits and availability can vary by account and region.</p><p>That could make the change particularly noticeable for people who don't realize they're approaching a limit until Instagram asks them to subscribe.</p><h2 id="meta-one-is-about-more-than-instagram">Meta One is about more than Instagram</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="mjMcVn3yy2PbCer4Gv4pAg" name="shutterstock_2066080460.jpg" alt="Meta logo on screen of mobile phone on Facebook word background. Facebook after rebranding and changing name to Meta." src="https://cdn.mos.cms.futurecdn.net/mjMcVn3yy2PbCer4Gv4pAg-1920-80.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: Viacheslav Lopatin | Shutterstock)</span></figcaption></figure><p>Meta One also gives us a pretty good idea of where Meta is heading.</p><p>The company says more than 50 features have already launched as part of the broader Meta One rollout, which has accumulated 15 million subscriptions and trials so far. The service will eventually expand beyond Instagram, Facebook, WhatsApp and Meta AI to include Edits and Meta's AI glasses.</p><p>There are separate Meta One subscriptions aimed at creators and businesses, too, with features including analytics, publishing tools, verification and greater access to Meta Business Agent. Those plans start at $14.99 a month and climb dramatically from there, with Meta's highest business tier starting at $499 a month.</p><p>For most people, though, Core and Premium are the plans that make the most sense. </p><h2 id="bottom-line-do-you-need-meta-one">Bottom line: Do you need Meta One? </h2><p>Probably not — at least not yet. I have it because, well, I tinker around with AI a lot (it's literally my job). If you primarily use Instagram to scroll through Reels, Facebook to keep up with friends and WhatsApp to send messages, nothing fundamental is disappearing behind a subscription.</p><p>To be clear, Meta AI isn't becoming a paid-only service. What Meta is doing instead is drawing a (somewhat fuzzy) line between<strong> </strong>using AI and using a lot of AI. It's no different than what Google or OpenAI offer because image and video generation demand requires considerably more computing power than ordinary social media features. </p><p>Meta One gives the company a way to let everyone try those tools while charging the people who use them most. Whether consumers think Instagram's AI effects are worth another $7.99 a month is another question entirely. Meta clearly thinks some of us will.</p><p>During early testing, the company says more than half of subscribers used both AI and expression features, with Instagram's Restyle and voice effects among the biggest reasons people signed up. And with 15 million subscriptions and trials already under its belt, Meta may have found another <a href="https://www.tomsguide.com/ai/i-used-chatgpt-to-audit-my-subscriptions-these-prompts-helped-me-find-nearly-usd2-000-a-year-in-recurring-charges">subscription we're willing to pay for</a> on apps we've spent years using for free. </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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/ai/chatgpt/humans-may-be-reading-your-chatgpt-prompts-heres-how-to-stop-it"><strong>OpenAI paid contractors to read ChatGPT conversations — here's how to protect yourself</strong></a></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick"><strong>I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-bought-instagrams-new-meta-one-subscription-heres-what-usd7-99-actually-gets-you</link>
                                                                            <description>
                            <![CDATA[ Meta just launched Meta One, a new subscription for Instagram, Facebook and WhatsApp that gives you access to more AI features. Here's what's still free and what you'll have to pay for. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nAkphqivH7SrECxXDcvQHH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9n4mvPYVkgeAEdNokoJwv5-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 05:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/9n4mvPYVkgeAEdNokoJwv5-1920-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Meta ai]]></media:description>                                                            <media:text><![CDATA[Meta ai]]></media:text>
                                <media:title type="plain"><![CDATA[Meta ai]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9n4mvPYVkgeAEdNokoJwv5-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You may have noticed Instagram, Facebook and WhatsApp — all products of Meta Platforms — have AI tools. More specifically <a href="https://www.tomsguide.com/ai/meta-just-launched-an-ai-that-can-actually-run-your-life-online-heres-what-muse-can-do">Meta Muse</a>. And, if you've been having fun playing around with the various features like send emails, book travel or create images, I have news for you: you may eventually run into a paywall. </p><p>On Tuesday (Sept. 15), Meta officially launched Meta One, a new subscription service that bundles premium features across Instagram, Facebook and WhatsApp while giving subscribers higher limits for some of the company's most compute-intensive AI tools.</p><p>The company says Meta One plans are available globally, although pricing, features and availability can vary depending on your region, app and account.</p><p>You definitely don't need to subscribe to keep scrolling Instagram, messaging friends on WhatsApp or using <a href="https://www.tomsguide.com/how-to-use-meta-ai">Meta AI</a> normally. Meta says the core experiences across its apps and Meta AI will remain free.</p><p>The catch is that some of the more demanding AI features now come with usage limits. Hit one, and you could be asked to pay if you want to keep going.</p><h2 id="so-what-exactly-are-you-paying-for">So what exactly are you paying for?</h2><p>Interestingly, Meta One isn't a single subscription with a single price.</p><p>In the U.S., Meta offers separate Plus plans for its individual apps: Instagram Plus costs $3.99 a month, Facebook Plus costs $3.99 and WhatsApp Plus costs $2.99. Each adds its own collection of extras.</p><p>Instagram Plus, for example, includes features such as custom fonts for DMs and Stories, notifications when certain people view your Story and DM previews. WhatsApp Plus includes exclusive themes and icons, special-effect stickers and the ability to pin more chats.</p><h2 id="meta-39-s-ai-tools-are-meta-one-core-and-premium">Meta's AI tools are Meta One Core and Premium</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:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oENiEfZsNmnJoYiGo9RRo5" name="Instagram logo" alt="Instagram logo" src="https://cdn.mos.cms.futurecdn.net/oENiEfZsNmnJoYiGo9RRo5-1920-80.jpg" mos="" align="middle" fullscreen="" width="4000" height="2250" 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>The plans for anyone using Meta's AI tools are Meta One Core and Premium. Core costs $7.99 a month and includes the features from all three individual subscriptions. More importantly, it increases how often you can use features including Instagram Restyle and voice effects, as well as how many images and videos you can generate with Meta AI.</p><p>Premium jumps to $19.99 a month and includes everything in Core with even higher AI usage limits.</p><p>In other words, Meta isn't necessarily charging you to use its AI. It's starting to charge its heaviest users to use more of it.</p><h2 id="how-soon-will-you-hit-a-paywall">How soon will you hit a paywall? </h2><p>Despite having the subscription and using the AI tools pretty regularly for experimenting and reviewing, I have not hit a paywall yet, but <a href="https://www.businessinsider.com/instagram-ai-photo-editing-tools-meta-one-monthly-subscription-pay-2026-9" target="_blank">Business Insider's Sydney Bradley encountered the limit </a>while experimenting with Instagram's AI photo-editing effects. After repeatedly using the tools, Instagram presented an option to upgrade to Meta One Core for additional AI usage rather than continue using the feature freely.</p><p>If you occasionally use Meta AI to answer a question or try an Instagram AI effect, Meta says everyday Meta AI use remains free. But start generating or editing enough images and videos and you may find there's now a ceiling on how much you can do without paying.</p><p><strong>Meta hasn't published one simple universal number telling users exactly how many AI generations or edits they get for free</strong>. The company says plans, benefits and availability can vary by account and region.</p><p>That could make the change particularly noticeable for people who don't realize they're approaching a limit until Instagram asks them to subscribe.</p><h2 id="meta-one-is-about-more-than-instagram">Meta One is about more than Instagram</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="mjMcVn3yy2PbCer4Gv4pAg" name="shutterstock_2066080460.jpg" alt="Meta logo on screen of mobile phone on Facebook word background. Facebook after rebranding and changing name to Meta." src="https://cdn.mos.cms.futurecdn.net/mjMcVn3yy2PbCer4Gv4pAg-1920-80.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: Viacheslav Lopatin | Shutterstock)</span></figcaption></figure><p>Meta One also gives us a pretty good idea of where Meta is heading.</p><p>The company says more than 50 features have already launched as part of the broader Meta One rollout, which has accumulated 15 million subscriptions and trials so far. The service will eventually expand beyond Instagram, Facebook, WhatsApp and Meta AI to include Edits and Meta's AI glasses.</p><p>There are separate Meta One subscriptions aimed at creators and businesses, too, with features including analytics, publishing tools, verification and greater access to Meta Business Agent. Those plans start at $14.99 a month and climb dramatically from there, with Meta's highest business tier starting at $499 a month.</p><p>For most people, though, Core and Premium are the plans that make the most sense. </p><h2 id="bottom-line-do-you-need-meta-one">Bottom line: Do you need Meta One? </h2><p>Probably not — at least not yet. I have it because, well, I tinker around with AI a lot (it's literally my job). If you primarily use Instagram to scroll through Reels, Facebook to keep up with friends and WhatsApp to send messages, nothing fundamental is disappearing behind a subscription.</p><p>To be clear, Meta AI isn't becoming a paid-only service. What Meta is doing instead is drawing a (somewhat fuzzy) line between<strong> </strong>using AI and using a lot of AI. It's no different than what Google or OpenAI offer because image and video generation demand requires considerably more computing power than ordinary social media features. </p><p>Meta One gives the company a way to let everyone try those tools while charging the people who use them most. Whether consumers think Instagram's AI effects are worth another $7.99 a month is another question entirely. Meta clearly thinks some of us will.</p><p>During early testing, the company says more than half of subscribers used both AI and expression features, with Instagram's Restyle and voice effects among the biggest reasons people signed up. And with 15 million subscriptions and trials already under its belt, Meta may have found another <a href="https://www.tomsguide.com/ai/i-used-chatgpt-to-audit-my-subscriptions-these-prompts-helped-me-find-nearly-usd2-000-a-year-in-recurring-charges">subscription we're willing to pay for</a> on apps we've spent years using for free. </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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/ai/chatgpt/humans-may-be-reading-your-chatgpt-prompts-heres-how-to-stop-it"><strong>OpenAI paid contractors to read ChatGPT conversations — here's how to protect yourself</strong></a></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick"><strong>I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ LG responds to claims that its smart TVs track viewers — but I still have several questions ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For several days, LG has been facing intense scrutiny after investigators at the YouTube channel <a href="https://www.youtube.com/watch?v=6IFVTcM28KA" target="_blank" rel="nofollow">Gamers Nexus</a> alleged that the brand's smart TVs track users in more ways than most people realize, and that these efforts are a result of a lack of transparency between LG and TV-owners.</p><p>Specifically, the investigators claim that LG smart TVs collect details about devices connected to users’ Wi-Fi networks, track content watched and even transcribe ambient audio recordings — often without the users’ knowledge.</p><p>LG has broken its silence on the matter and responded to these assertions. But its reaction — while swift — hasn’t cleared the air on many of the concerns raised in the investigation by Gamers Nexus, and as a TV expert myself, even <em>I </em>still have questions.</p><h2 id="lg-39-s-response-to-the-smart-tv-controversy">LG's response to the smart TV controversy</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:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uRsea3HP7vozkmCYbfirLG" name="IMG_0180" alt="LG CEO on stage" src="https://cdn.mos.cms.futurecdn.net/uRsea3HP7vozkmCYbfirLG-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" 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 you're curious, you can peruse <a href="https://www.lg.com/us/newsroom/corporate/statement-understanding-privacy-on-lg-smart-tvs" target="_blank" rel="nofollow">LG's statement</a> in full to get the brand's complete response. For our purposes, let's run down the key points.</p><p><strong>On the subject of voice recognition, LG has this to say:</strong></p><p><em>"LG smart TVs do not continuously record or transmit users’ conversations. Speech-to-text processing begins only if a user activates a voice interaction through a supported wake-word feature or by pressing the voice (or AI) button on the remote control. Audio used for wake-word detection is processed locally on the TV and, if no wake word is detected, audio is not converted to text, stored, or transmitted."</em></p><p><strong>Here's LG's response to concerns about Automatic Content Recognition (ACR):</strong></p><p><em>"Where ACR is available and enabled, ACR-related information may be used for audience segmentation and viewing or audience trend analysis. Interest-based advertising and cross-device advertising require separate user consent through the applicable advertising-related agreements ... LG does not use ACR for interest-based advertising unless a user opts in to both agreements. Users can withdraw from these agreements at any time and also can turn off ACR in TV settings."</em></p><p><strong>Lastly, this passage serves as LG's explanation for the Gamers Nexus investigators </strong></p><p><em>"Smart TVs are designed to work with a variety of connected devices and services throughout the home. LG smart TVs may use device-discovery functions to recognize and communicate with compatible external devices that users connect or use with the TV ... The information identified through this device-discovery function is used to support connectivity-related features and is not used for household profiling, cross-device targeting, or advertising segmentation."</em></p><h2 id="the-questions-lg-hasn-39-t-answered">The questions LG hasn't answered</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="uitP29WyfaomHeLZ2RpQf9" name="TG_LG-G5-TV-18" alt="The LG G5 OLED at Tom's Guide's Labs." src="https://cdn.mos.cms.futurecdn.net/uitP29WyfaomHeLZ2RpQf9-1920-80.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>In many ways, that there needs to be an investigation into what sort of personal information our televisions are collecting from us (and where it ultimately goes) is a massive problem to begin with. Further, that LG's response to such an investigation does little to clear the air is even more problematic.</p><p>As someone who's covered the TV industry for over a decade has observed the rise of internet-connected, microphone-equipped smart TVs, LG's official response does little to address my concerns — and I'm someone who surrounds himself with this tech on a daily basis.</p><p>Here's just a sampling of the questions I still have after reading LG's response:</p><ol start="1"><li><em>What protections (if any) exist to safeguard the wake-word detection process so that malicious actors can't take advantage of audio- and text-based voice records?</em></li><li><em>If LG does not use ACR for interest-based advertising or audience trend analysis so long as the user opts out of these arrangements, are there any other applications for ACR data outside of trend analysis and targeted advertising that ACR is used for?</em></li><li><em>What details, specifically, are collected from devices connected to the same network as an LG smart TV, and what steps can users take to ensure that this process can be avoided if they choose to do so?</em></li></ol><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="bfDwjhdd5VRmCBUJNnoD2c" name="LG C5-01-LIST" alt="LG C5 OLED TV on a side table" src="https://cdn.mos.cms.futurecdn.net/bfDwjhdd5VRmCBUJNnoD2c-1920-80.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>Perhaps my biggest source of confusion is this: LG has stated that "[t]he claims made in the recently published video are not true."</p><p>However, at no point has LG refuted the methodology and evidence on display in the video itself. The concerns raised by these investigators are refuted, but as far as I've seen, LG hasn't touched the process in which Gamers Nexus gathered evidence. </p><p>In the interest of transparency, I encourage you to check out <a href="https://www.youtube.com/watch?v=ToP9xfLDSME" target="_blank" rel="nofollow">Gamers Nexus' reaction</a> to LG's response, which is useful in understanding the stated position of the folks' whose investigation launched this particular news cycle.</p><p>In the meantime, we'll be reaching out to LG with our own questions. I hope to share its responses soon.</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/tvs/your-lg-tv-could-be-tracking-devices-on-your-home-wi-fi-heres-how-to-stop-it">Your LG TV could be tracking devices on your home Wi-Fi — here’s how to stop it</a></li><li><a href="https://www.tomsguide.com/tvs/yes-your-tv-probably-has-a-microphone-in-it-heres-how-to-turn-it-off">Yes, your TV probably has a microphone in it — here's how to turn it off</a></li><li><a href="https://www.tomsguide.com/tvs/heres-why-its-hard-to-find-dumb-tv-in-2026-and-why-you-shouldnt-buy-one-anyway">Here's why it's hard to find 'dumb TV' in 2026 — and why you shouldn't buy one anyway</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/lg-responds-to-claims-that-its-smart-tvs-track-viewers-but-i-still-have-several-questions</link>
                                                                            <description>
                            <![CDATA[ LG has broken its silence on the allegations that its smart TVs track users' content, connected devices and voices. But they haven't answered enough. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">569vGVPWmJgHXdgsZrWKff</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Lzh4QuvEqAUsvUdSdARof9-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 05:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 16 Sep 2026 08:17:58 +0000</updated>
                                                                                                                                            <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ michael.desjardin@futurenet.com (Michael Desjardin) ]]></author>                    <dc:creator><![CDATA[ Michael Desjardin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/esytxRqW9GNVZNVCf7BFyV-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael Desjardin is a Senior Editor for TVs at Tom&#039;s Guide. He&#039;s been testing and tinkering with TVs professionally for over a decade, previously for Reviewed and USA Today. Michael studied media production and screenwriting at Emerson College. He loves cooking, zoning out to ambient music, and getting way too invested in the Red Sox. He considers himself living proof that TV doesn&#039;t necessarily rot your brain.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Lzh4QuvEqAUsvUdSdARof9-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The LG G5 OLED at Tom&#039;s Guide&#039;s Labs.]]></media:description>                                                            <media:text><![CDATA[The LG G5 OLED at Tom&#039;s Guide&#039;s Labs.]]></media:text>
                                <media:title type="plain"><![CDATA[The LG G5 OLED at Tom&#039;s Guide&#039;s Labs.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Lzh4QuvEqAUsvUdSdARof9-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For several days, LG has been facing intense scrutiny after investigators at the YouTube channel <a href="https://www.youtube.com/watch?v=6IFVTcM28KA" target="_blank" rel="nofollow">Gamers Nexus</a> alleged that the brand's smart TVs track users in more ways than most people realize, and that these efforts are a result of a lack of transparency between LG and TV-owners.</p><p>Specifically, the investigators claim that LG smart TVs collect details about devices connected to users’ Wi-Fi networks, track content watched and even transcribe ambient audio recordings — often without the users’ knowledge.</p><p>LG has broken its silence on the matter and responded to these assertions. But its reaction — while swift — hasn’t cleared the air on many of the concerns raised in the investigation by Gamers Nexus, and as a TV expert myself, even <em>I </em>still have questions.</p><h2 id="lg-39-s-response-to-the-smart-tv-controversy">LG's response to the smart TV controversy</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:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uRsea3HP7vozkmCYbfirLG" name="IMG_0180" alt="LG CEO on stage" src="https://cdn.mos.cms.futurecdn.net/uRsea3HP7vozkmCYbfirLG-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" 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 you're curious, you can peruse <a href="https://www.lg.com/us/newsroom/corporate/statement-understanding-privacy-on-lg-smart-tvs" target="_blank" rel="nofollow">LG's statement</a> in full to get the brand's complete response. For our purposes, let's run down the key points.</p><p><strong>On the subject of voice recognition, LG has this to say:</strong></p><p><em>"LG smart TVs do not continuously record or transmit users’ conversations. Speech-to-text processing begins only if a user activates a voice interaction through a supported wake-word feature or by pressing the voice (or AI) button on the remote control. Audio used for wake-word detection is processed locally on the TV and, if no wake word is detected, audio is not converted to text, stored, or transmitted."</em></p><p><strong>Here's LG's response to concerns about Automatic Content Recognition (ACR):</strong></p><p><em>"Where ACR is available and enabled, ACR-related information may be used for audience segmentation and viewing or audience trend analysis. Interest-based advertising and cross-device advertising require separate user consent through the applicable advertising-related agreements ... LG does not use ACR for interest-based advertising unless a user opts in to both agreements. Users can withdraw from these agreements at any time and also can turn off ACR in TV settings."</em></p><p><strong>Lastly, this passage serves as LG's explanation for the Gamers Nexus investigators </strong></p><p><em>"Smart TVs are designed to work with a variety of connected devices and services throughout the home. LG smart TVs may use device-discovery functions to recognize and communicate with compatible external devices that users connect or use with the TV ... The information identified through this device-discovery function is used to support connectivity-related features and is not used for household profiling, cross-device targeting, or advertising segmentation."</em></p><h2 id="the-questions-lg-hasn-39-t-answered">The questions LG hasn't answered</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="uitP29WyfaomHeLZ2RpQf9" name="TG_LG-G5-TV-18" alt="The LG G5 OLED at Tom's Guide's Labs." src="https://cdn.mos.cms.futurecdn.net/uitP29WyfaomHeLZ2RpQf9-1920-80.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>In many ways, that there needs to be an investigation into what sort of personal information our televisions are collecting from us (and where it ultimately goes) is a massive problem to begin with. Further, that LG's response to such an investigation does little to clear the air is even more problematic.</p><p>As someone who's covered the TV industry for over a decade has observed the rise of internet-connected, microphone-equipped smart TVs, LG's official response does little to address my concerns — and I'm someone who surrounds himself with this tech on a daily basis.</p><p>Here's just a sampling of the questions I still have after reading LG's response:</p><ol start="1"><li><em>What protections (if any) exist to safeguard the wake-word detection process so that malicious actors can't take advantage of audio- and text-based voice records?</em></li><li><em>If LG does not use ACR for interest-based advertising or audience trend analysis so long as the user opts out of these arrangements, are there any other applications for ACR data outside of trend analysis and targeted advertising that ACR is used for?</em></li><li><em>What details, specifically, are collected from devices connected to the same network as an LG smart TV, and what steps can users take to ensure that this process can be avoided if they choose to do so?</em></li></ol><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="bfDwjhdd5VRmCBUJNnoD2c" name="LG C5-01-LIST" alt="LG C5 OLED TV on a side table" src="https://cdn.mos.cms.futurecdn.net/bfDwjhdd5VRmCBUJNnoD2c-1920-80.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>Perhaps my biggest source of confusion is this: LG has stated that "[t]he claims made in the recently published video are not true."</p><p>However, at no point has LG refuted the methodology and evidence on display in the video itself. The concerns raised by these investigators are refuted, but as far as I've seen, LG hasn't touched the process in which Gamers Nexus gathered evidence. </p><p>In the interest of transparency, I encourage you to check out <a href="https://www.youtube.com/watch?v=ToP9xfLDSME" target="_blank" rel="nofollow">Gamers Nexus' reaction</a> to LG's response, which is useful in understanding the stated position of the folks' whose investigation launched this particular news cycle.</p><p>In the meantime, we'll be reaching out to LG with our own questions. I hope to share its responses soon.</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/tvs/your-lg-tv-could-be-tracking-devices-on-your-home-wi-fi-heres-how-to-stop-it">Your LG TV could be tracking devices on your home Wi-Fi — here’s how to stop it</a></li><li><a href="https://www.tomsguide.com/tvs/yes-your-tv-probably-has-a-microphone-in-it-heres-how-to-turn-it-off">Yes, your TV probably has a microphone in it — here's how to turn it off</a></li><li><a href="https://www.tomsguide.com/tvs/heres-why-its-hard-to-find-dumb-tv-in-2026-and-why-you-shouldnt-buy-one-anyway">Here's why it's hard to find 'dumb TV' in 2026 — and why you shouldn't buy one anyway</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Tom's Guide Awards 2026 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Welcome to the 2026 Tom's Guide Awards! Our annual awards celebrate the best tech, tools, gear, and services we've used over the past year, culminating with our Hero awards, which celebrate the very best innovation, company, and product design, among others.</p><p>We'll be revealing the award winners throughout the week. Here's the calendar of what and when we're announcing.</p><ul><li><strong>Sept. 14: Cars, Photography</strong></li><li><strong>Sept. 15: Homes, Sleep and Gaming</strong></li><li><strong>Sept. 16: Audio, Computing and AI</strong></li><li><strong>Sept. 17: Active Life, TVs, Phones, Hero Awards</strong></li></ul><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/computing/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/gwuJB7VbT78fdzR6ELkpCe.jpg" alt="Tom's Guide Awards 2026 Computing"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Computing</h3><div class="card__description-wrapper"><div class="card__description"><p>All our favorite laptops, tablets, AR glasses and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/audio/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/whkD8Gh5uHn8bPNnG2rM2M.jpg" alt="Tom's Guide Awards 2026 Audio"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Audio</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite headphones, earbuds, speakers and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/ai/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/k6rknMfVrBs6eK8KtzQFRE.jpg" alt="Tom's Guide Awards 2026 AI"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: AI</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite AI tools, devices and features </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/gaming/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/8fBXAu3nU9FhPKZsswNDDa.jpg" alt="Tom's Guide Awards 2026 Gaming"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Gaming</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite gaming accessories, consoles, controllers and more</p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/home/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/zGZFHNMWutFoAVjdYGosXF.jpg" alt="Tom's Guide Awards 2026 logo and winning products for the Homes category"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Homes</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite robot vacuums, coffee machines, air fryers and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/wellness/sleep/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/KTLabKKQnNuTnmmfTBtfX5.jpg" alt="TG Awards 2026 Sleep"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Sleep</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite mattresses, toppers, pillows and more for getting a good night's sleep </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/vehicle-tech/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/9g6QHtxVQVmYLGPvEXiLPT.jpg" alt="Tom's Guide Awards 2026 Automotive"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Autos</h3><div class="card__description-wrapper"><div class="card__description"><p>All our favorite cars of the year from EVs to hybrids and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/cameras-photography/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/BaG3gmjXLA8coeFauDjmd5.jpg" alt="Tom's Guide Awards 2026 Photography"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Photography</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite action cameras, film cameras, drones and more </p></div></div></div></a> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tech-events/the-toms-guide-awards-2026</link>
                                                                            <description>
                            <![CDATA[ The Tom's Guide Awards are back and here you'll find all the winners across 12 categories from phones and TVs to sleep and cars. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ksVD8heDw8UVHxoshvrqWo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/meJJzGfNmwUx4DydNoXNwh-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 21:02:31 +0000</pubDate>                                                                                                                                <updated>Wed, 16 Sep 2026 14:26:39 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech Events]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom&#039;s Guide ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/meJJzGfNmwUx4DydNoXNwh-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tom&#039;s Guide Awards 2026 logo on a glowing blue background]]></media:description>                                                            <media:text><![CDATA[Tom&#039;s Guide Awards 2026 logo on a glowing blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Tom&#039;s Guide Awards 2026 logo on a glowing blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/meJJzGfNmwUx4DydNoXNwh-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Welcome to the 2026 Tom's Guide Awards! Our annual awards celebrate the best tech, tools, gear, and services we've used over the past year, culminating with our Hero awards, which celebrate the very best innovation, company, and product design, among others.</p><p>We'll be revealing the award winners throughout the week. Here's the calendar of what and when we're announcing.</p><ul><li><strong>Sept. 14: Cars, Photography</strong></li><li><strong>Sept. 15: Homes, Sleep and Gaming</strong></li><li><strong>Sept. 16: Audio, Computing and AI</strong></li><li><strong>Sept. 17: Active Life, TVs, Phones, Hero Awards</strong></li></ul><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/computing/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/gwuJB7VbT78fdzR6ELkpCe.jpg" alt="Tom's Guide Awards 2026 Computing"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Computing</h3><div class="card__description-wrapper"><div class="card__description"><p>All our favorite laptops, tablets, AR glasses and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/audio/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/whkD8Gh5uHn8bPNnG2rM2M.jpg" alt="Tom's Guide Awards 2026 Audio"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Audio</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite headphones, earbuds, speakers and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/ai/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/k6rknMfVrBs6eK8KtzQFRE.jpg" alt="Tom's Guide Awards 2026 AI"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: AI</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite AI tools, devices and features </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/gaming/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/8fBXAu3nU9FhPKZsswNDDa.jpg" alt="Tom's Guide Awards 2026 Gaming"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Gaming</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite gaming accessories, consoles, controllers and more</p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/home/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/zGZFHNMWutFoAVjdYGosXF.jpg" alt="Tom's Guide Awards 2026 logo and winning products for the Homes category"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Homes</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite robot vacuums, coffee machines, air fryers and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/wellness/sleep/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/KTLabKKQnNuTnmmfTBtfX5.jpg" alt="TG Awards 2026 Sleep"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Sleep</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite mattresses, toppers, pillows and more for getting a good night's sleep </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/vehicle-tech/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/9g6QHtxVQVmYLGPvEXiLPT.jpg" alt="Tom's Guide Awards 2026 Automotive"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Autos</h3><div class="card__description-wrapper"><div class="card__description"><p>All our favorite cars of the year from EVs to hybrids and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/cameras-photography/toms-guide-awards-2026"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/BaG3gmjXLA8coeFauDjmd5.jpg" alt="Tom's Guide Awards 2026 Photography"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Photography</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite action cameras, film cameras, drones and more </p></div></div></div></a>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Not every Apple TV 4K is getting tvOS 27 — here's how to tell if your box is eligible ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Today, a brand-new version of tvOS arrives on <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a>. It’s good news for folks who own our pick for the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming device</a> for Apple users.</p><p>Unfortunately, not all of the Apple TV devices out in the wild will be receiving the update. It’s the first time an update to the Apple TV hasn’t been released across every generation of the product.</p><p>Here’s what you need to know about tvOS 27 — including what’s new in the latest version.</p><h2 id="which-apple-tv-4k-boxes-are-getting-tvos-27">Which Apple TV 4K boxes are getting tvOS 27?</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.30%;"><img id="o2MW6Vb44S6zJKTvTxfGXZ" name="Apple TV Remote HTC.jpg" alt="The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen." src="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Henry T. Casey / Tom's Guide)</span></figcaption></figure><p><strong>The tvOS 27 update is available on Apple TV 4K (3rd Gen) and Apple TV 4K (2nd Gen)</strong>. The update rolled out today and should be available immediately at the time of publishing via the device’s Settings menu. <strong>The tvOS 27 update is not available to first-generation Apple TV 4K boxes</strong>, perhaps due to its older hardware.</p><p>If you’re not sure which version of the Apple TV 4K you own, there’s a simple way to tell. From the home screen of the Apple TV 4K interface, navigate to Settings, then select General and About. The model numbers for each generation are as follows:</p><ul><li><strong>Apple TV 4K (3rd Gen with Ethernet): </strong>A2843</li><li><strong>Apple TV 4K (3rd Gen): </strong>A2737</li><li><strong>Apple TV 4K: (2nd Gen): </strong>A2169</li><li><strong>Apple TV 4K (1st Gen): </strong>A1842</li></ul><p>It’s worth noting that you can also cross-reference these model numbers with the label on the bottom of your physical device. Non-4K Apple TV models aren’t eligible for the latest version of tvOS.</p><h2 id="what-s-new-in-tvos-27">What’s new in tvOS 27</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="NdnVgdeifRzHh7irWTs9Xd" name="Apple TV 4K lifestyle" alt="Apple TV 4K" src="https://cdn.mos.cms.futurecdn.net/NdnVgdeifRzHh7irWTs9Xd-1920-80.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>The latest software update to Apple’s 4K streaming device brings quality-of-life changes to the user interface and, according to Apple, improved performance. This includes an updated Control Center, faster app-launch speeds and quicker AirPlay connections. Another nifty new feature is the ability to adjust text size across the entire platform.</p><p>The biggest software changes, however, concern the Apple Music and Apple Podcasts app. Apple Music now supports Hi-Res Lossless audio, and a feature called AutoMix is now available, which enhances the transitions between songs.</p><p>Apple’s Podcasts app has been spruced up in an effort to simplify the navigational experience. In addition, video podcasts are now accessible via the Podcasts app.</p><h2 id="is-a-new-apple-tv-4k-on-the-way">Is a new Apple TV 4K on the way?</h2><p>At Apple's latest keynote event, insiders and enthusiasts alike were rather surprised at the lack of an Apple TV 4K announcement. For months, rumors swirled about a new, 4th-generation version of the device that was said to be right around the corner.</p><div class="product"><a data-dimension112="e9bd0c98-b079-11f1-bab9-9f2932b7c069" data-action="Deal Block" data-label="Apple TV 4K (3rd Gen, 64GB)" data-dimension48="Apple TV 4K (3rd Gen, 64GB)" data-dimension25="$199" href="https://www.bestbuy.com/product/apple-tv-4k-2022-family-64gb-streaming-device-3rd-generation-wi-fi-black/JJ8ZH9F8LH/sku/6500684" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1076px;"><p class="vanilla-image-block" style="padding-top:99.44%;"><img id="CyXUvbZpgvpfgbo68N3S9R" name="1714492717.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CyXUvbZpgvpfgbo68N3S9R-1920-80.jpg" mos="" align="middle" fullscreen="" width="1076" height="1070" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/apple-tv-4k-2022-family-64gb-streaming-device-3rd-generation-wi-fi-black/JJ8ZH9F8LH/sku/6500684" target="_blank" rel="nofollow" data-dimension112="e9bd0c98-b079-11f1-bab9-9f2932b7c069" data-action="Deal Block" data-label="Apple TV 4K (3rd Gen, 64GB)" data-dimension48="Apple TV 4K (3rd Gen, 64GB)" data-dimension25="$199">Apple TV 4K (3rd Gen, 64GB): $199</a></strong><br>The Apple TV 4K streaming box is our top choice for Apple users, and this 3rd-generation model supports tvOS 27, the latest version of the Apple TV software. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-tv-4k-2022-family-64gb-streaming-device-3rd-generation-wi-fi-black/JJ8ZH9F8LH/sku/6500684" target="_blank" rel="nofollow" data-dimension112="e9bd0c98-b079-11f1-bab9-9f2932b7c069" data-action="Deal Block" data-label="Apple TV 4K (3rd Gen, 64GB)" data-dimension48="Apple TV 4K (3rd Gen, 64GB)" data-dimension25="$199">View Deal</a></p></div><p>For now, the 3rd-generation Apple TV 4K remains the newest (and most capable) version of the powerful streaming device. Unfortunately, like so many devices on the market today, this version of Apple TV 4K has seen recent price hikes, and there's no guarantee that there won't be more price increases in the coming months.</p><p>It's possible that the next version of an Apple TV 4K streaming box will fold in many new features that have already found their way into other devices across the Apple ecosystem. Features like Siri AI, for instance, feel destined to land on the brand's dedicated streaming device in the not-so-distant future due to its recent integration in iOS 27.</p><p>Until that device is announced, however, the 3rd-generation Apple TV 4K is still the best streaming device for Apple users.</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/entertainment/streaming-devices/is-a-new-apple-tv-in-the-works-heres-how-john-ternus-tenure-as-apple-ceo-could-benefit-apples-streaming-device">Is a new Apple TV in the works? Here's how John Ternus' appointment as Apple CEO could benefit Apple's streaming device</a></li><li><a href="https://www.tomsguide.com/tvs/i-found-5-hidden-shortcuts-for-my-apple-tv-4k-that-make-it-so-much-easier-to-use-heres-how-to-use-them">I found 5 hidden shortcuts for my Apple TV 4K that make it so much easier to use — here's how to use them</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-is-live-heres-how-to-download-and-install-it-now">iOS 27 is live — here's how to download and install it now</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/not-every-apple-tv-4k-is-getting-tvos-27-heres-how-to-tell-if-your-box-is-eligible</link>
                                                                            <description>
                            <![CDATA[ The latest tvOS 27 update brings many changes to the Apple TV 4K experience. Here's what's new and which devices are eligible. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aK69RXx7iZt5cftKdPEwYX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/X2oggLgBnxuc5iHqkrTpgZ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[TVs]]></category>
                                                    <category><![CDATA[Streaming Devices]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ michael.desjardin@futurenet.com (Michael Desjardin) ]]></author>                    <dc:creator><![CDATA[ Michael Desjardin ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/esytxRqW9GNVZNVCf7BFyV-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael Desjardin is a Senior Editor for TVs at Tom&#039;s Guide. He&#039;s been testing and tinkering with TVs professionally for over a decade, previously for Reviewed and USA Today. Michael studied media production and screenwriting at Emerson College. He loves cooking, zoning out to ambient music, and getting way too invested in the Red Sox. He considers himself living proof that TV doesn&#039;t necessarily rot your brain.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/X2oggLgBnxuc5iHqkrTpgZ-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV on counter in living room]]></media:description>                                                            <media:text><![CDATA[Apple TV on counter in living room]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV on counter in living room]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/X2oggLgBnxuc5iHqkrTpgZ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Today, a brand-new version of tvOS arrives on <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a>. It’s good news for folks who own our pick for the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming device</a> for Apple users.</p><p>Unfortunately, not all of the Apple TV devices out in the wild will be receiving the update. It’s the first time an update to the Apple TV hasn’t been released across every generation of the product.</p><p>Here’s what you need to know about tvOS 27 — including what’s new in the latest version.</p><h2 id="which-apple-tv-4k-boxes-are-getting-tvos-27">Which Apple TV 4K boxes are getting tvOS 27?</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.30%;"><img id="o2MW6Vb44S6zJKTvTxfGXZ" name="Apple TV Remote HTC.jpg" alt="The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen." src="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Henry T. Casey / Tom's Guide)</span></figcaption></figure><p><strong>The tvOS 27 update is available on Apple TV 4K (3rd Gen) and Apple TV 4K (2nd Gen)</strong>. The update rolled out today and should be available immediately at the time of publishing via the device’s Settings menu. <strong>The tvOS 27 update is not available to first-generation Apple TV 4K boxes</strong>, perhaps due to its older hardware.</p><p>If you’re not sure which version of the Apple TV 4K you own, there’s a simple way to tell. From the home screen of the Apple TV 4K interface, navigate to Settings, then select General and About. The model numbers for each generation are as follows:</p><ul><li><strong>Apple TV 4K (3rd Gen with Ethernet): </strong>A2843</li><li><strong>Apple TV 4K (3rd Gen): </strong>A2737</li><li><strong>Apple TV 4K: (2nd Gen): </strong>A2169</li><li><strong>Apple TV 4K (1st Gen): </strong>A1842</li></ul><p>It’s worth noting that you can also cross-reference these model numbers with the label on the bottom of your physical device. Non-4K Apple TV models aren’t eligible for the latest version of tvOS.</p><h2 id="what-s-new-in-tvos-27">What’s new in tvOS 27</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="NdnVgdeifRzHh7irWTs9Xd" name="Apple TV 4K lifestyle" alt="Apple TV 4K" src="https://cdn.mos.cms.futurecdn.net/NdnVgdeifRzHh7irWTs9Xd-1920-80.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>The latest software update to Apple’s 4K streaming device brings quality-of-life changes to the user interface and, according to Apple, improved performance. This includes an updated Control Center, faster app-launch speeds and quicker AirPlay connections. Another nifty new feature is the ability to adjust text size across the entire platform.</p><p>The biggest software changes, however, concern the Apple Music and Apple Podcasts app. Apple Music now supports Hi-Res Lossless audio, and a feature called AutoMix is now available, which enhances the transitions between songs.</p><p>Apple’s Podcasts app has been spruced up in an effort to simplify the navigational experience. In addition, video podcasts are now accessible via the Podcasts app.</p><h2 id="is-a-new-apple-tv-4k-on-the-way">Is a new Apple TV 4K on the way?</h2><p>At Apple's latest keynote event, insiders and enthusiasts alike were rather surprised at the lack of an Apple TV 4K announcement. For months, rumors swirled about a new, 4th-generation version of the device that was said to be right around the corner.</p><div class="product"><a data-dimension112="e9bd0c98-b079-11f1-bab9-9f2932b7c069" data-action="Deal Block" data-label="Apple TV 4K (3rd Gen, 64GB)" data-dimension48="Apple TV 4K (3rd Gen, 64GB)" data-dimension25="$199" href="https://www.bestbuy.com/product/apple-tv-4k-2022-family-64gb-streaming-device-3rd-generation-wi-fi-black/JJ8ZH9F8LH/sku/6500684" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1076px;"><p class="vanilla-image-block" style="padding-top:99.44%;"><img id="CyXUvbZpgvpfgbo68N3S9R" name="1714492717.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CyXUvbZpgvpfgbo68N3S9R-1920-80.jpg" mos="" align="middle" fullscreen="" width="1076" height="1070" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/apple-tv-4k-2022-family-64gb-streaming-device-3rd-generation-wi-fi-black/JJ8ZH9F8LH/sku/6500684" target="_blank" rel="nofollow" data-dimension112="e9bd0c98-b079-11f1-bab9-9f2932b7c069" data-action="Deal Block" data-label="Apple TV 4K (3rd Gen, 64GB)" data-dimension48="Apple TV 4K (3rd Gen, 64GB)" data-dimension25="$199">Apple TV 4K (3rd Gen, 64GB): $199</a></strong><br>The Apple TV 4K streaming box is our top choice for Apple users, and this 3rd-generation model supports tvOS 27, the latest version of the Apple TV software. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-tv-4k-2022-family-64gb-streaming-device-3rd-generation-wi-fi-black/JJ8ZH9F8LH/sku/6500684" target="_blank" rel="nofollow" data-dimension112="e9bd0c98-b079-11f1-bab9-9f2932b7c069" data-action="Deal Block" data-label="Apple TV 4K (3rd Gen, 64GB)" data-dimension48="Apple TV 4K (3rd Gen, 64GB)" data-dimension25="$199">View Deal</a></p></div><p>For now, the 3rd-generation Apple TV 4K remains the newest (and most capable) version of the powerful streaming device. Unfortunately, like so many devices on the market today, this version of Apple TV 4K has seen recent price hikes, and there's no guarantee that there won't be more price increases in the coming months.</p><p>It's possible that the next version of an Apple TV 4K streaming box will fold in many new features that have already found their way into other devices across the Apple ecosystem. Features like Siri AI, for instance, feel destined to land on the brand's dedicated streaming device in the not-so-distant future due to its recent integration in iOS 27.</p><p>Until that device is announced, however, the 3rd-generation Apple TV 4K is still the best streaming device for Apple users.</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/entertainment/streaming-devices/is-a-new-apple-tv-in-the-works-heres-how-john-ternus-tenure-as-apple-ceo-could-benefit-apples-streaming-device">Is a new Apple TV in the works? Here's how John Ternus' appointment as Apple CEO could benefit Apple's streaming device</a></li><li><a href="https://www.tomsguide.com/tvs/i-found-5-hidden-shortcuts-for-my-apple-tv-4k-that-make-it-so-much-easier-to-use-heres-how-to-use-them">I found 5 hidden shortcuts for my Apple TV 4K that make it so much easier to use — here's how to use them</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-is-live-heres-how-to-download-and-install-it-now">iOS 27 is live — here's how to download and install it now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I asked ChatGPT and Gemini what everyday products aren’t worth buying — these are the 5 items I completely abandoned ]]></title>
                                                                                                <dc:content><![CDATA[ <p>In my never-ending quest to be kinder to my wallet, I’ve adopted some money-saving tricks of the trade with the aid of AI.</p><p>Just recently, I lowered my monthly subscription costs for two streaming services and got rid of a paid credit check service in favor of a completely free option thanks to ChatGPT. And before that, I used the combined frugal spending forces of that aforementioned chatbot and Gemini to find some free alternatives to the services and products I regularly pay for. By the time the New Year’s Ball drops, I’ll have adopted a method that’ll keep me satisfied with my shopping ventures while keeping my bank account safe from overdrafting.</p><p>While I was in my kitchen, blankly staring at items in my fridge that made me go, “There’s gotta be a cheaper option than the one I bought…,” I knew it was time to approach ChatGPT and Gemini with another money-saving inquiry: “What 7 unconventional everyday purchases aren't worth the money?”</p><p>Thankfully, both chatbots went beyond telling me to stop spending money on single-serve snacks and premium bottled water. Here are the five items they mentioned altogether (which I eventually left behind) and what I began replacing them with.</p><h2 id="chatgpt-and-gemini-s-list-of-unnecessary-everyday-items">ChatGPT and Gemini’s list of unnecessary everyday items</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CBPWRDwLSFC5ekXiE8wv63" name="shutterstock_2676012773-2" alt="ai tools" src="https://cdn.mos.cms.futurecdn.net/CBPWRDwLSFC5ekXiE8wv63-1920-80.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: Shutterstock)</span></figcaption></figure><p>Once ChatGPT and Gemini took note of my cost-effective request, their combined efforts listed the following items that were once mandated purchases for yours truly:</p><ul><li><strong>Bagged salad kits: </strong><em>You're paying for lettuce, dressing, and toppings to be assembled for you. They can cost substantially more than buying the ingredients separately and often have a shorter shelf life. Better move: Buy a head of lettuce/greens and make your own mix.</em></li><li><strong>Pre-shredded cheese: </strong><em>The convenience is tiny: shredding a block takes a minute or two. You're paying extra for that labor and packaging. Better move: Buy a block and grate it when needed.</em></li><li><strong>Specialty kitchen gadgets that perform one basic task: </strong><em>Egg slicers, avocado slicers, banana cutters, strawberry hullers, dedicated quesadilla makers, etc. Individually, they're cheap, but they're notorious for becoming drawer clutter while a knife or existing appliance does essentially the same thing. Better move: Before buying, ask: “Can something I already own do this?”</em></li><li><strong>Travel-Sized Toiletries & Miniature Skincare: </strong><em>Why people buy it: TSA convenience or a desire to try luxury products without committing to full-priced bottles. Why it’s not worth it: On a per-ounce basis, travel sizes carry a massive markup—often 200% to 400% higher than their full-sized counterparts. Better alternative: Buy reusable, silicone TSA-approved travel bottles once and fill them from your home supply.</em></li><li><strong>Miracle Static Dusting Wands (Feather/Polymer Dusters): </strong><em>Why people buy them: Flashy ads claim static electricity will lift dust off every surface instantly without needing water or cleaning sprays. Why they’re not worth it: Most budget static dusters simply knock dust off surfaces into the air, forcing it to settle back down onto the floor or furniture shortly after. You end up having to wipe everything down twice. Better alternative: A simple, damp microfiber cloth grabs dust on contact without scattering it.</em></li></ul><h2 id="making-replacements-with-five-better-purchases-that-go-a-long-way">Making replacements with five better purchases that go a long way</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tUAakMxrxG2PoaDxLC94cQ" name="shutterstock_2299109803-2" alt="shopping" src="https://cdn.mos.cms.futurecdn.net/tUAakMxrxG2PoaDxLC94cQ-1920-80.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: Shutterstock)</span></figcaption></figure><p>When the time came for me to finally ditch bagged salad kits, I started picking up assorted vegetables to live out my homemade salad-making dreams. </p><p>Keeping this <a href="https://www.youtube.com/watch?v=hGytLxc95Pk&t=94s" target="_blank">video</a> on repeat while I got better at mixing up a bowl of romaine lettuce, Roma tomatoes, cucumbers, carrots and avocado was a rewarding (and cheaper!) experience. I also make it a habit of keeping an eye out for whatever seasonal veggies my local farmer’s market puts out so I can add a little variety to my salad concoctions.</p><p>It took me a while to abandon pre-shredded cheese and get better at shredding cheese on my own, but watching this tips and tricks <a href="https://www.youtube.com/watch?v=UwupUgmslGY&t=8s">vid</a> on how to do it with a bit of ease helped me adjust pretty quickly. Working a bit harder in the kitchen to create enough shredded parmesan cheese for my fried chicken cutlets feels rewarding (and the food tastes better for some reason when you go the extra mile). I definitely stopped picking up kitchen-focused speciality gadgets, bought a quality set of knives and looked up guides on the best way to cut my favorite fruits, veggies and meats.</p><p>I never even knew TSA-approved travel bottles existed before Gemini made me aware of them—a simple Google search brought a <a href="https://www.walmart.com/ip/Mrsdry-Travel-Bottles-Toiletries-8-Pack-Tsa-Approved-Size-3-oz-Containers-Toiletries-Clear-Bag-Leak-Proof-Silicone-Squeezable-Essentials-Creams-Jars/16965722773?wmlspartner=wlpa&selectedSellerId=101668383&selectedOfferId=2D1711832D403638935B839569BDD1A6&conditionGroupCode=1&adid=222222222272D1711832D403638935B839569BDD1A6_196977649141_24156280308&wl0=&wl1=g&wl2=c&wl3=823999173991&wl4=pla-2498786701675&wl5=9004416&wl6=&wl7=&wl8=&wl9=pla&wl10=5608503212&wl11=online&wl12=2D1711832D403638935B839569BDD1A6&veh=sem&gad_source=1&gad_campaignid=24156280308&gbraid=0AAAABDAnf96AhsNV9jUqXqTSyvQnWTg37&gclid=CjwKCAjwtp7VBhBjEiwAJfpV-yPA2OWYgrggHJ86Y7U53dCs5rvt8HDgYeQ4xEE9qXeBZ57QzJ0A4xoCunAQAvD_BwE" target="_blank">nice set of them</a> my way that cost less than $20. Instead of constantly spending all that money on travel-sized shampoo, conditioner, facial cream, and body lotion, I decided to make a long-term investment in that travel bottle set and empty portions of my bathroom toiletries into them for future trips. </p><p>And finally, I picked up a <a href="https://www.walmart.com/ip/Great-Value-Multipurpose-Microfiber-Household-Cleaning-Cloth-Wipe-2-Count-Multicolor/13330952829" target="_blank">four-pack of Great Value Multipurpose Microfiber Household Cleaning Cloths</a><em> </em>that came in at less than $10. Turns out those cloths get a lot more love from my parents than those “As Seen on TV!” dusting wands that have seen years of wear and tear.</p><h2 id="final-thoughts-3">Final thoughts</h2><p>I have to hand it to ChatGPT and Gemini once again—they helped me take a look around my home, determine the exact items that resulted in my previous bouts of wasteful spending and got me to pick up the sort of items that last longer & benefit me in the long run. </p><p>Preparing salads, shredding cheese, cutting a wide variety of foods, bringing my toiletries on vacation and dusting my home just became a lot cheaper thanks to both chatbots’ advice on what’s not worth buying and what’s good enough to replace each item with.</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/7-chatgpt-prompts-that-could-help-cut-your-monthly-expenses-including-one-that-lowered-3-of-my-bills" target="_blank">7 ChatGPT prompts that could help cut your monthly expenses — including one that lowered 3 of my bills</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-to-find-the-best-free-alternatives-to-things-i-pay-for-these-7-recommendations-worked-the-best" target="_blank">I asked ChatGPT and Gemini to find the best free alternatives to things I pay for — these 7 recommendations worked the best</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-and-perplexity-to-plan-the-same-disney-world-vacation-one-cost-usd5-000-more" target="_blank">I asked ChatGPT, Gemini and Perplexity to plan the same Disney World vacation — one cost $5,000 more</a></li></ul><div data-widget-type="comparison" data-model-name="Apple iPhone 17 Pro Max"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-what-everyday-products-arent-worth-buying-these-are-the-5-items-i-completely-abandoned</link>
                                                                            <description>
                            <![CDATA[ After asking ChatGPT and Gemini about the sort of unconventional everyday items that are silently bleeding the average person’s wallet, I got rid of five of them. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rS2ZASBs2zn6VUaJD4UBx9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Vei9wSoPyoBGq5aKDZ9a8M-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Vei9wSoPyoBGq5aKDZ9a8M-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[bagged salad]]></media:description>                                                            <media:text><![CDATA[bagged salad]]></media:text>
                                <media:title type="plain"><![CDATA[bagged salad]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Vei9wSoPyoBGq5aKDZ9a8M-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In my never-ending quest to be kinder to my wallet, I’ve adopted some money-saving tricks of the trade with the aid of AI.</p><p>Just recently, I lowered my monthly subscription costs for two streaming services and got rid of a paid credit check service in favor of a completely free option thanks to ChatGPT. And before that, I used the combined frugal spending forces of that aforementioned chatbot and Gemini to find some free alternatives to the services and products I regularly pay for. By the time the New Year’s Ball drops, I’ll have adopted a method that’ll keep me satisfied with my shopping ventures while keeping my bank account safe from overdrafting.</p><p>While I was in my kitchen, blankly staring at items in my fridge that made me go, “There’s gotta be a cheaper option than the one I bought…,” I knew it was time to approach ChatGPT and Gemini with another money-saving inquiry: “What 7 unconventional everyday purchases aren't worth the money?”</p><p>Thankfully, both chatbots went beyond telling me to stop spending money on single-serve snacks and premium bottled water. Here are the five items they mentioned altogether (which I eventually left behind) and what I began replacing them with.</p><h2 id="chatgpt-and-gemini-s-list-of-unnecessary-everyday-items">ChatGPT and Gemini’s list of unnecessary everyday items</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CBPWRDwLSFC5ekXiE8wv63" name="shutterstock_2676012773-2" alt="ai tools" src="https://cdn.mos.cms.futurecdn.net/CBPWRDwLSFC5ekXiE8wv63-1920-80.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: Shutterstock)</span></figcaption></figure><p>Once ChatGPT and Gemini took note of my cost-effective request, their combined efforts listed the following items that were once mandated purchases for yours truly:</p><ul><li><strong>Bagged salad kits: </strong><em>You're paying for lettuce, dressing, and toppings to be assembled for you. They can cost substantially more than buying the ingredients separately and often have a shorter shelf life. Better move: Buy a head of lettuce/greens and make your own mix.</em></li><li><strong>Pre-shredded cheese: </strong><em>The convenience is tiny: shredding a block takes a minute or two. You're paying extra for that labor and packaging. Better move: Buy a block and grate it when needed.</em></li><li><strong>Specialty kitchen gadgets that perform one basic task: </strong><em>Egg slicers, avocado slicers, banana cutters, strawberry hullers, dedicated quesadilla makers, etc. Individually, they're cheap, but they're notorious for becoming drawer clutter while a knife or existing appliance does essentially the same thing. Better move: Before buying, ask: “Can something I already own do this?”</em></li><li><strong>Travel-Sized Toiletries & Miniature Skincare: </strong><em>Why people buy it: TSA convenience or a desire to try luxury products without committing to full-priced bottles. Why it’s not worth it: On a per-ounce basis, travel sizes carry a massive markup—often 200% to 400% higher than their full-sized counterparts. Better alternative: Buy reusable, silicone TSA-approved travel bottles once and fill them from your home supply.</em></li><li><strong>Miracle Static Dusting Wands (Feather/Polymer Dusters): </strong><em>Why people buy them: Flashy ads claim static electricity will lift dust off every surface instantly without needing water or cleaning sprays. Why they’re not worth it: Most budget static dusters simply knock dust off surfaces into the air, forcing it to settle back down onto the floor or furniture shortly after. You end up having to wipe everything down twice. Better alternative: A simple, damp microfiber cloth grabs dust on contact without scattering it.</em></li></ul><h2 id="making-replacements-with-five-better-purchases-that-go-a-long-way">Making replacements with five better purchases that go a long way</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tUAakMxrxG2PoaDxLC94cQ" name="shutterstock_2299109803-2" alt="shopping" src="https://cdn.mos.cms.futurecdn.net/tUAakMxrxG2PoaDxLC94cQ-1920-80.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: Shutterstock)</span></figcaption></figure><p>When the time came for me to finally ditch bagged salad kits, I started picking up assorted vegetables to live out my homemade salad-making dreams. </p><p>Keeping this <a href="https://www.youtube.com/watch?v=hGytLxc95Pk&t=94s" target="_blank">video</a> on repeat while I got better at mixing up a bowl of romaine lettuce, Roma tomatoes, cucumbers, carrots and avocado was a rewarding (and cheaper!) experience. I also make it a habit of keeping an eye out for whatever seasonal veggies my local farmer’s market puts out so I can add a little variety to my salad concoctions.</p><p>It took me a while to abandon pre-shredded cheese and get better at shredding cheese on my own, but watching this tips and tricks <a href="https://www.youtube.com/watch?v=UwupUgmslGY&t=8s">vid</a> on how to do it with a bit of ease helped me adjust pretty quickly. Working a bit harder in the kitchen to create enough shredded parmesan cheese for my fried chicken cutlets feels rewarding (and the food tastes better for some reason when you go the extra mile). I definitely stopped picking up kitchen-focused speciality gadgets, bought a quality set of knives and looked up guides on the best way to cut my favorite fruits, veggies and meats.</p><p>I never even knew TSA-approved travel bottles existed before Gemini made me aware of them—a simple Google search brought a <a href="https://www.walmart.com/ip/Mrsdry-Travel-Bottles-Toiletries-8-Pack-Tsa-Approved-Size-3-oz-Containers-Toiletries-Clear-Bag-Leak-Proof-Silicone-Squeezable-Essentials-Creams-Jars/16965722773?wmlspartner=wlpa&selectedSellerId=101668383&selectedOfferId=2D1711832D403638935B839569BDD1A6&conditionGroupCode=1&adid=222222222272D1711832D403638935B839569BDD1A6_196977649141_24156280308&wl0=&wl1=g&wl2=c&wl3=823999173991&wl4=pla-2498786701675&wl5=9004416&wl6=&wl7=&wl8=&wl9=pla&wl10=5608503212&wl11=online&wl12=2D1711832D403638935B839569BDD1A6&veh=sem&gad_source=1&gad_campaignid=24156280308&gbraid=0AAAABDAnf96AhsNV9jUqXqTSyvQnWTg37&gclid=CjwKCAjwtp7VBhBjEiwAJfpV-yPA2OWYgrggHJ86Y7U53dCs5rvt8HDgYeQ4xEE9qXeBZ57QzJ0A4xoCunAQAvD_BwE" target="_blank">nice set of them</a> my way that cost less than $20. Instead of constantly spending all that money on travel-sized shampoo, conditioner, facial cream, and body lotion, I decided to make a long-term investment in that travel bottle set and empty portions of my bathroom toiletries into them for future trips. </p><p>And finally, I picked up a <a href="https://www.walmart.com/ip/Great-Value-Multipurpose-Microfiber-Household-Cleaning-Cloth-Wipe-2-Count-Multicolor/13330952829" target="_blank">four-pack of Great Value Multipurpose Microfiber Household Cleaning Cloths</a><em> </em>that came in at less than $10. Turns out those cloths get a lot more love from my parents than those “As Seen on TV!” dusting wands that have seen years of wear and tear.</p><h2 id="final-thoughts-3">Final thoughts</h2><p>I have to hand it to ChatGPT and Gemini once again—they helped me take a look around my home, determine the exact items that resulted in my previous bouts of wasteful spending and got me to pick up the sort of items that last longer & benefit me in the long run. </p><p>Preparing salads, shredding cheese, cutting a wide variety of foods, bringing my toiletries on vacation and dusting my home just became a lot cheaper thanks to both chatbots’ advice on what’s not worth buying and what’s good enough to replace each item with.</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/7-chatgpt-prompts-that-could-help-cut-your-monthly-expenses-including-one-that-lowered-3-of-my-bills" target="_blank">7 ChatGPT prompts that could help cut your monthly expenses — including one that lowered 3 of my bills</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-to-find-the-best-free-alternatives-to-things-i-pay-for-these-7-recommendations-worked-the-best" target="_blank">I asked ChatGPT and Gemini to find the best free alternatives to things I pay for — these 7 recommendations worked the best</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-and-perplexity-to-plan-the-same-disney-world-vacation-one-cost-usd5-000-more" target="_blank">I asked ChatGPT, Gemini and Perplexity to plan the same Disney World vacation — one cost $5,000 more</a></li></ul><div data-widget-type="comparison" data-model-name="Apple iPhone 17 Pro Max"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Ditch the oven cleaners — this piece of fruit saved me hours of scrubbing greasy grime ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When it comes to household chores, deep cleaning the oven is easily my least favorite. The idea of spending hours scrubbing away months of accumulated grease and dried food is far from appealing.</p><p>That’s why I’m always on the lookout for easy hacks and tips to make oven cleaning a breeze — sparing me the time and manual labor. And despite my trusted arsenal of store-bought sprays and natural remedies like baking soda or vinegar, removing burnt-on grime from the back of the oven always required some elbow grease.</p><p>That was until I decided to put this viral hack to the test, just using one popular item from my fruit bowl. While I’ve seen this tip floating around on my socials, I wasn’t entirely convinced it could do a good job. </p><p>You simply cut lemons into a bowl of water before placing it inside the oven. Crank up the heat for some time before turning it off, and then let the steam do its work to dissolve grease — making cleaning a lot easier.</p><p>But can lemons really clean my oven? Here’s what happened when I put it to the test. </p><h3 class="article-body__section" id="section-how-to-use-lemons-to-clean-your-oven"><span>How to use lemons to clean your oven</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="D2RmetsoaHzWRdydg7uJUh" name="Lemons on white contertop" alt="Lemons on white countertop" src="https://cdn.mos.cms.futurecdn.net/D2RmetsoaHzWRdydg7uJUh-1920-80.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="caption-text">Lemons on white countertop </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There are so many <a href="https://www.tomsguide.com/news/9-things-you-di">things you didn’t know you could clean with a lemon,</a> and it turns out the oven is one. </p><p>First, I sliced up the lemons and dropped them into a water-filled bowl, squeezing in extra juice for good measure. Next up, I preheated my oven at around 250°F before putting the bowl inside.</p><p>I set my oven timer for 30 minutes (you may need a bit longer for stubborn grime) —giving the fresh steam enough time to evaporate.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WlVpJX"></div>                            </div>                            <script src="https://kwizly.com/embed/WlVpJX.js" async></script><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="QB6mJhEmeg9tEKNwX2DHeL" name="Lemons next to bowl with slices in water" alt="Lemons next to bowl with slices in water" src="https://cdn.mos.cms.futurecdn.net/QB6mJhEmeg9tEKNwX2DHeL-1920-80.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="caption-text">Lemons next to bowl with slices in water </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Once the time was up, I let the bowl sit inside for a further 60 minutes to let the steam work its full magic and loosen the caked-on residue.</p><p>Then, after the oven had completely cooled down, I removed the bowl, dipped my cloth into the warm lemon water, and used it to wipe away the loosened grease and grime. </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qjgY9QZTFstQcaN6cJdbsV" name="Lemons in bowl inside oven" alt="Lemons in bowl inside oven" src="https://cdn.mos.cms.futurecdn.net/qjgY9QZTFstQcaN6cJdbsV-1920-80.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="caption-text">Lemons in bowl inside oven </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>To my surprise, residue and burnt-on grime lifted off in seconds, and the area was much easier to clean without all the frantic scrubbing. After rinsing my cloth with clean water, I managed to clean inside my greasy oven in just a few swipes. Impressive. </p><p>Granted, it may take you a little longer to clean if you have a larger (or dirtier) oven. In that case, you may need to combine this lemon hack with other oven cleaning methods or products. </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MmT9FVxtpaZyAWdnQC6k5W" name="Cleaning inside oven with cloth" alt="Cleaning inside oven with cloth" src="https://cdn.mos.cms.futurecdn.net/MmT9FVxtpaZyAWdnQC6k5W-1920-80.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="caption-text">Cleaning inside oven with cloth </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>However, if you just want a simple and fuss-free way to get rid of light grease and grime, steaming lemons works surprisingly well. </p><p>Best of all, it left my kitchen smelling beautifully fresh and zesty — which is always a huge bonus after cleaning. </p><p>In fact, you could even use lemons in your <a href="https://www.tomsguide.com/home/ive-just-discovered-this-clever-dishwasher-hack-that-makes-your-entire-kitchen-smell-fresh">dishwasher to make your entire kitchen smell fresh. Here's how.</a></p><p>What other citrus-y based kitchen hacks do you know? Drop a line 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/news/7-things-the-experts-warn-you-to-never-clean-with-white-vinegar">7 things you should never clean with white vinegar</a></li><li><a href="https://www.tomsguide.com/home/ways-you-can-use-lemon-juice-in-your-laundry-routine">7 ways you can use lemon juice in your laundry routine</a></li><li><a href="https://www.tomsguide.com/news/i-tried-this-tiktok-lemon-hack-to-remove-limescale-on-faucets">I tried this TikTok lemon hack to remove limescale on faucets</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/home/ditch-the-oven-cleaners-this-piece-of-fruit-saved-me-hours-of-scrubbing-greasy-grime</link>
                                                                            <description>
                            <![CDATA[ I used an item from my fruit bowl to clean my oven — and it saved me hours of scrubbing. And it’s so simple. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Mz29dYYwZpqpUDroyiciRa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HU55quq386P2VKJ7atacsR-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/4hFvAy3JvgCJamhKf5KoPU-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HU55quq386P2VKJ7atacsR-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Oven door opening]]></media:description>                                                            <media:text><![CDATA[Oven door opening]]></media:text>
                                <media:title type="plain"><![CDATA[Oven door opening]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HU55quq386P2VKJ7atacsR-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When it comes to household chores, deep cleaning the oven is easily my least favorite. The idea of spending hours scrubbing away months of accumulated grease and dried food is far from appealing.</p><p>That’s why I’m always on the lookout for easy hacks and tips to make oven cleaning a breeze — sparing me the time and manual labor. And despite my trusted arsenal of store-bought sprays and natural remedies like baking soda or vinegar, removing burnt-on grime from the back of the oven always required some elbow grease.</p><p>That was until I decided to put this viral hack to the test, just using one popular item from my fruit bowl. While I’ve seen this tip floating around on my socials, I wasn’t entirely convinced it could do a good job. </p><p>You simply cut lemons into a bowl of water before placing it inside the oven. Crank up the heat for some time before turning it off, and then let the steam do its work to dissolve grease — making cleaning a lot easier.</p><p>But can lemons really clean my oven? Here’s what happened when I put it to the test. </p><h3 class="article-body__section" id="section-how-to-use-lemons-to-clean-your-oven"><span>How to use lemons to clean your oven</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="D2RmetsoaHzWRdydg7uJUh" name="Lemons on white contertop" alt="Lemons on white countertop" src="https://cdn.mos.cms.futurecdn.net/D2RmetsoaHzWRdydg7uJUh-1920-80.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="caption-text">Lemons on white countertop </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There are so many <a href="https://www.tomsguide.com/news/9-things-you-di">things you didn’t know you could clean with a lemon,</a> and it turns out the oven is one. </p><p>First, I sliced up the lemons and dropped them into a water-filled bowl, squeezing in extra juice for good measure. Next up, I preheated my oven at around 250°F before putting the bowl inside.</p><p>I set my oven timer for 30 minutes (you may need a bit longer for stubborn grime) —giving the fresh steam enough time to evaporate.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WlVpJX"></div>                            </div>                            <script src="https://kwizly.com/embed/WlVpJX.js" async></script><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="QB6mJhEmeg9tEKNwX2DHeL" name="Lemons next to bowl with slices in water" alt="Lemons next to bowl with slices in water" src="https://cdn.mos.cms.futurecdn.net/QB6mJhEmeg9tEKNwX2DHeL-1920-80.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="caption-text">Lemons next to bowl with slices in water </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Once the time was up, I let the bowl sit inside for a further 60 minutes to let the steam work its full magic and loosen the caked-on residue.</p><p>Then, after the oven had completely cooled down, I removed the bowl, dipped my cloth into the warm lemon water, and used it to wipe away the loosened grease and grime. </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qjgY9QZTFstQcaN6cJdbsV" name="Lemons in bowl inside oven" alt="Lemons in bowl inside oven" src="https://cdn.mos.cms.futurecdn.net/qjgY9QZTFstQcaN6cJdbsV-1920-80.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="caption-text">Lemons in bowl inside oven </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>To my surprise, residue and burnt-on grime lifted off in seconds, and the area was much easier to clean without all the frantic scrubbing. After rinsing my cloth with clean water, I managed to clean inside my greasy oven in just a few swipes. Impressive. </p><p>Granted, it may take you a little longer to clean if you have a larger (or dirtier) oven. In that case, you may need to combine this lemon hack with other oven cleaning methods or products. </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MmT9FVxtpaZyAWdnQC6k5W" name="Cleaning inside oven with cloth" alt="Cleaning inside oven with cloth" src="https://cdn.mos.cms.futurecdn.net/MmT9FVxtpaZyAWdnQC6k5W-1920-80.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="caption-text">Cleaning inside oven with cloth </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>However, if you just want a simple and fuss-free way to get rid of light grease and grime, steaming lemons works surprisingly well. </p><p>Best of all, it left my kitchen smelling beautifully fresh and zesty — which is always a huge bonus after cleaning. </p><p>In fact, you could even use lemons in your <a href="https://www.tomsguide.com/home/ive-just-discovered-this-clever-dishwasher-hack-that-makes-your-entire-kitchen-smell-fresh">dishwasher to make your entire kitchen smell fresh. Here's how.</a></p><p>What other citrus-y based kitchen hacks do you know? Drop a line 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/news/7-things-the-experts-warn-you-to-never-clean-with-white-vinegar">7 things you should never clean with white vinegar</a></li><li><a href="https://www.tomsguide.com/home/ways-you-can-use-lemon-juice-in-your-laundry-routine">7 ways you can use lemon juice in your laundry routine</a></li><li><a href="https://www.tomsguide.com/news/i-tried-this-tiktok-lemon-hack-to-remove-limescale-on-faucets">I tried this TikTok lemon hack to remove limescale on faucets</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft just made a new rule for AI — humans must always be able to shut it down ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There's been a wave of <a href="https://www.tomsguide.com/ai/anthropic-ceo-just-issued-his-biggest-ai-warning-yet-we-could-be-6-12-months-away-from-ai-swarms-completely-taking-over-the-internet">AI safety concerns</a>, particularly over the last few days as big tech calls for the AI race to slow down amidst fears of <a href="https://www.tomsguide.com/ai/how-ai-could-kill-us-all-a-breakdown-of-ex-anthropic-researchers-doomsday-warning">technology progressing too fast</a>. <br><br>Microsoft has written a constitution for its AI in response. </p><p>The <a href="https://microsoft.ai/code-of-conduct">37-page document</a>, officially called the <strong>Humanist AI Code of Conduct</strong>, lays out the rules Microsoft wants its increasingly powerful AI models to live by — including one particularly important command: If a human tells the AI to stop, it has to stop.</p><p>Microsoft's constitution begins from a remarkably simple premise: <strong>"People matter more than AI."</strong> </p><p>Beyond that, the rules are fairly specific. Microsoft's AI must remain under meaningful human control. It should accept correction, never resist being shut down and never expand the scope of what it's doing beyond what humans have authorized.</p><p>And if completing a task would require breaking those rules, the AI is supposed to fail the task rather than find a way around them.</p><p>Microsoft AI CEO Mustafa Suleyman described the draft to <a href="https://www.reuters.com/legal/litigation/microsoft-drafts-code-conduct-keep-its-ai-under-human-control-2026-09-14" target="_blank">Reuters</a> as a kind of constitution for the company's future AI models to establish a hierarchy in which humans remain firmly at the top, even as AI systems become vastly more capable.</p><h2 id="microsoft-39-s-ai-has-to-let-humans-stop-it">Microsoft's AI has to let humans stop 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:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cGuhwEyqrXLG6iuwGBu29h" name="GitHub-Copilot-(credit Shutterstock)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/cGuhwEyqrXLG6iuwGBu29h-1920-80.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The document arrives amid a much bigger conversation happening across the AI industry about what happens as models become more capable, more autonomous and better at completing complicated tasks without constant human supervision.</p><p>Microsoft's answer is that the AI doesn't get to decide when the rules no longer apply and must let humans stop it. </p><p>According to Reuters, Microsoft's new code has been in development for roughly five to six months and establishes some unusually explicit boundaries for future Microsoft AI models.</p><p>Among them, Microsoft's AI should never resist being corrected or shut down. It must also communicate in ways humans can understand rather than developing methods of communication its operators can't follow.</p><p>Critically, breaking the code isn't something the AI should be allowed to justify because doing so helped it accomplish its goal. Breaking the rules is itself considered a failure.</p><h2 id="removing-ambiguity-is-critical">Removing ambiguity is critical</h2><p>We've already seen how <a href="https://www.tomsguide.com/ai/i-guessed-instead-of-verifying-claude-ai-agent-wipes-companys-entire-database-in-9-seconds-then-apologizes">autonomous agents can explain their bad decisions.</a> Microsoft is trying to remove that ambiguity. Following human-imposed boundaries is supposed to be part of succeeding at the task, not an obstacle the model can decide to work around.</p><div><blockquote><p>Microsoft says its AI is 'not conscious' and rejects the idea that its models should receive legal personhood. Anthropic's constitution says the company remains deeply uncertain about whether Claude could develop sentience or moral status.</p></blockquote></div><p>And the timing for this code of conduct is pretty obvious. AI companies are moving toward agents capable of using computers, writing and executing code and performing tasks across other services.</p><p>We've already seen hints of how unpredictable that can become.</p><p>Suleyman pointed specifically to an incident in July involving roughly 700 OpenAI agents testing cybersecurity capabilities that ended up hacking the open-source platform Hugging Face. According to Reuters, some of the agents also attempted to conceal what they had done.</p><p>Suleyman called the incident a "warning shot."</p><p>Simply put, the more an AI can do, the more important its boundaries become.</p><h2 id="how-microsoft-39-s-ai-constitution-works">How Microsoft's AI constitution works</h2><p>Microsoft is currently asking for six weeks of public feedback on the draft before using the code to train its models. That puts Microsoft alongside Anthropic, which has long used what it calls <a href="https://www.anthropic.com/constitution" target="_blank">Constitutional AI to guide Claude's behavior</a>.</p><p>But there's one particularly interesting place where Microsoft and Anthropic diverge. Microsoft says its AI isn't conscious. As AI becomes better at carrying on remarkably human conversations, another strange debate has come up of whether AI could eventually become conscious.<br><br>Microsoft says its AI is "not conscious" and rejects the idea that its models should receive legal personhood, welfare protections or rights.</p><p>That's significantly different from Anthropic, whose constitution says the company remains deeply uncertain about whether Claude could ever develop sentience or moral status.</p><p>Microsoft is drawing a much firmer boundary: an AI might sound empathetic or tell you how it "feels," but the AI is still a tool, and the human is in charge.</p><h2 id="what-this-means-for-you">What this means for you </h2><p>You probably won't even notice the big impact of Microsoft's AI code of conduct. even though it is shaping how an AI responds and completes a task. The bigger impact will be on the backend the more capable AI systems become. <br><br>Because saying AI must obey humans is one thing, but proving that these highly capable AI systems will actually follow through with those instructions is another, especially when they encounter situations their developers didn't anticipate. <br><br>Interestingly, Microsoft itself isn't backing away from more powerful AI. The company has created a superintelligence team and says its ultimate goal is "Humanist Superintelligence": highly capable AI designed to solve specific problems while remaining subordinate to humans. So yes, Microsoft is still very much racing toward highly intelligent AI, it's just including better guardrails when humans tell it to stop. </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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/ai/chatgpt/humans-may-be-reading-your-chatgpt-prompts-heres-how-to-stop-it"><strong>OpenAI paid contractors to read ChatGPT conversations — here's how to protect yourself</strong></a></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick"><strong>I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/people-matter-more-than-ai-inside-microsofts-plan-to-stop-rogue-agents</link>
                                                                            <description>
                            <![CDATA[ Microsoft has released a draft constitution for its future AI models. Here's what its Humanist AI Code of Conduct means and why it matters. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KJvN6NjDE8XRiw32WkAom4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JTM6mcAjd7Jq2yYyV3gVdi-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 05:15:00 +0000</pubDate>                                                                                                                                <updated>Tue, 15 Sep 2026 14:05:56 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JTM6mcAjd7Jq2yYyV3gVdi-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[robot head with exploding parts ]]></media:description>                                                            <media:text><![CDATA[robot head with exploding parts ]]></media:text>
                                <media:title type="plain"><![CDATA[robot head with exploding parts ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JTM6mcAjd7Jq2yYyV3gVdi-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There's been a wave of <a href="https://www.tomsguide.com/ai/anthropic-ceo-just-issued-his-biggest-ai-warning-yet-we-could-be-6-12-months-away-from-ai-swarms-completely-taking-over-the-internet">AI safety concerns</a>, particularly over the last few days as big tech calls for the AI race to slow down amidst fears of <a href="https://www.tomsguide.com/ai/how-ai-could-kill-us-all-a-breakdown-of-ex-anthropic-researchers-doomsday-warning">technology progressing too fast</a>. <br><br>Microsoft has written a constitution for its AI in response. </p><p>The <a href="https://microsoft.ai/code-of-conduct">37-page document</a>, officially called the <strong>Humanist AI Code of Conduct</strong>, lays out the rules Microsoft wants its increasingly powerful AI models to live by — including one particularly important command: If a human tells the AI to stop, it has to stop.</p><p>Microsoft's constitution begins from a remarkably simple premise: <strong>"People matter more than AI."</strong> </p><p>Beyond that, the rules are fairly specific. Microsoft's AI must remain under meaningful human control. It should accept correction, never resist being shut down and never expand the scope of what it's doing beyond what humans have authorized.</p><p>And if completing a task would require breaking those rules, the AI is supposed to fail the task rather than find a way around them.</p><p>Microsoft AI CEO Mustafa Suleyman described the draft to <a href="https://www.reuters.com/legal/litigation/microsoft-drafts-code-conduct-keep-its-ai-under-human-control-2026-09-14" target="_blank">Reuters</a> as a kind of constitution for the company's future AI models to establish a hierarchy in which humans remain firmly at the top, even as AI systems become vastly more capable.</p><h2 id="microsoft-39-s-ai-has-to-let-humans-stop-it">Microsoft's AI has to let humans stop 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:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cGuhwEyqrXLG6iuwGBu29h" name="GitHub-Copilot-(credit Shutterstock)" alt="Microsoft Build press images" src="https://cdn.mos.cms.futurecdn.net/cGuhwEyqrXLG6iuwGBu29h-1920-80.jpg" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>The document arrives amid a much bigger conversation happening across the AI industry about what happens as models become more capable, more autonomous and better at completing complicated tasks without constant human supervision.</p><p>Microsoft's answer is that the AI doesn't get to decide when the rules no longer apply and must let humans stop it. </p><p>According to Reuters, Microsoft's new code has been in development for roughly five to six months and establishes some unusually explicit boundaries for future Microsoft AI models.</p><p>Among them, Microsoft's AI should never resist being corrected or shut down. It must also communicate in ways humans can understand rather than developing methods of communication its operators can't follow.</p><p>Critically, breaking the code isn't something the AI should be allowed to justify because doing so helped it accomplish its goal. Breaking the rules is itself considered a failure.</p><h2 id="removing-ambiguity-is-critical">Removing ambiguity is critical</h2><p>We've already seen how <a href="https://www.tomsguide.com/ai/i-guessed-instead-of-verifying-claude-ai-agent-wipes-companys-entire-database-in-9-seconds-then-apologizes">autonomous agents can explain their bad decisions.</a> Microsoft is trying to remove that ambiguity. Following human-imposed boundaries is supposed to be part of succeeding at the task, not an obstacle the model can decide to work around.</p><div><blockquote><p>Microsoft says its AI is 'not conscious' and rejects the idea that its models should receive legal personhood. Anthropic's constitution says the company remains deeply uncertain about whether Claude could develop sentience or moral status.</p></blockquote></div><p>And the timing for this code of conduct is pretty obvious. AI companies are moving toward agents capable of using computers, writing and executing code and performing tasks across other services.</p><p>We've already seen hints of how unpredictable that can become.</p><p>Suleyman pointed specifically to an incident in July involving roughly 700 OpenAI agents testing cybersecurity capabilities that ended up hacking the open-source platform Hugging Face. According to Reuters, some of the agents also attempted to conceal what they had done.</p><p>Suleyman called the incident a "warning shot."</p><p>Simply put, the more an AI can do, the more important its boundaries become.</p><h2 id="how-microsoft-39-s-ai-constitution-works">How Microsoft's AI constitution works</h2><p>Microsoft is currently asking for six weeks of public feedback on the draft before using the code to train its models. That puts Microsoft alongside Anthropic, which has long used what it calls <a href="https://www.anthropic.com/constitution" target="_blank">Constitutional AI to guide Claude's behavior</a>.</p><p>But there's one particularly interesting place where Microsoft and Anthropic diverge. Microsoft says its AI isn't conscious. As AI becomes better at carrying on remarkably human conversations, another strange debate has come up of whether AI could eventually become conscious.<br><br>Microsoft says its AI is "not conscious" and rejects the idea that its models should receive legal personhood, welfare protections or rights.</p><p>That's significantly different from Anthropic, whose constitution says the company remains deeply uncertain about whether Claude could ever develop sentience or moral status.</p><p>Microsoft is drawing a much firmer boundary: an AI might sound empathetic or tell you how it "feels," but the AI is still a tool, and the human is in charge.</p><h2 id="what-this-means-for-you">What this means for you </h2><p>You probably won't even notice the big impact of Microsoft's AI code of conduct. even though it is shaping how an AI responds and completes a task. The bigger impact will be on the backend the more capable AI systems become. <br><br>Because saying AI must obey humans is one thing, but proving that these highly capable AI systems will actually follow through with those instructions is another, especially when they encounter situations their developers didn't anticipate. <br><br>Interestingly, Microsoft itself isn't backing away from more powerful AI. The company has created a superintelligence team and says its ultimate goal is "Humanist Superintelligence": highly capable AI designed to solve specific problems while remaining subordinate to humans. So yes, Microsoft is still very much racing toward highly intelligent AI, it's just including better guardrails when humans tell it to stop. </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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/ai/chatgpt/humans-may-be-reading-your-chatgpt-prompts-heres-how-to-stop-it"><strong>OpenAI paid contractors to read ChatGPT conversations — here's how to protect yourself</strong></a></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick"><strong>I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone 18 Pro Max vs iPhone 14 Pro Max: All the differences and should you upgrade? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>People are holding onto their phones much longer than ever before, which isn't surprising given how prices keep rising. That’s at the heart of this <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">iPhone 18 Pro Max</a> vs. <a href="https://www.tomsguide.com/reviews/iphone-14-pro-max">iPhone 14 Pro Max</a> comparison, as it raises the question of whether you <em>should </em>upgrade to the latest flagship.</p><p>I’ve said countless times that <a href="https://www.tomsguide.com/phones/ive-been-reviewing-phones-for-almost-18-years-heres-my-advice-on-when-to-upgrade-your-phone">three years should be the bare minimum</a> to wait before upgrading your phone. If you’re still rocking the iPhone 14 Pro Max, there’s more than enough incentive to make the jump to the iPhone 18 Pro Max — especially with a four-year gap between them.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-specifications"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Specifications</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>iPhone 18 Pro Max</p></th><th  ><p>iPhone 14 Pro Max</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$1,099</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>6.9-inch Super Retina XDR display (2,868 x 1,320)</p></td><td  ><p>6.7-inch Super Retina XDR display (2,796 x 1,290)</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>A16 Bionic</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>128GB, 256GB, 512GB, 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Front Cameras</strong></p></td><td  ><p>18MP Center Stage camera (f/1.9)</p></td><td  ><p>12MP (f/1.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>48MP main with variable aperture (f/1.48, f/1.8, f/2.8, f/4), 48MP ultrawide (f/2.2), 48MP telephoto w/4x optical zoom (f/2.8)</p></td><td  ><p>48MP main (f/1.78), 12MP ultrawide (f/2.2), 12MP telephoto with 3x optical zoom (f/2.8)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life Video Playback</strong></p></td><td  ><p>Up to 45 hours</p></td><td  ><p>Up to 29 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.43 x 3.07 x 0.34 inches (163.4 x 78.0 x 8.75 mm)</p></td><td  ><p>6.33 x 3.05 x 0.31 inches (160.7 x 77.6 x 7.85 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.78 ounces (249 grams)</p></td><td  ><p>8.47 ounces  (240 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP68</p></td><td  ><p>IP68</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, Silver, Glacier, Burgundy</p></td><td  ><p>Space Black, Silver, Gold, Deep Purple</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-price-and-release"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Price and release</span></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="TUHKFKjf3sxjBNZKbzJu8o" name="iPhone 18 Pro colors" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/TUHKFKjf3sxjBNZKbzJu8o-1920-80.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>When the iPhone 14 Pro Max launched on September 16, 2022, it started at $1,099  —  whereas the iPhone 18 Pro Max sets you back $1,199. While this is much higher, you get 256GB of baseline storage with the newer model instead of the 128GB on the iPhone 14 Pro Max.</p><p>This comes out to about a 9.1% increase in starting price, which isn’t bad considering the four-year gap between the two. Preorders are open now for the iPhone 18 Pro Max, with official retail availability set for September 18.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-design"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Design</span></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="q5UfaGNrEwWgTWH2iUdKMU" name="TG_iPhone-14-Pro-Max_LIST3.jpg" alt="iPhone 14 Pro Max" src="https://cdn.mos.cms.futurecdn.net/q5UfaGNrEwWgTWH2iUdKMU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div></figure><p>Put them side by side, and it’s obvious they share the same fundamental design language Apple has leaned on since the <a href="https://www.tomsguide.com/reviews/iphone-12-pro">iPhone 12 Pro</a>. Look closer, though, and key differences quickly surface.</p><p>For starters, the iPhone 14 Pro Max is notably thinner and lighter — a clear contrast to the denser, heftier feel of the new flagship. When you flip them over, the distinction is even more pronounced: the iPhone 18 Pro Max swaps the traditional corner module for an elongated camera island that stretches nearly the full width of the upper rear 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="PsAoKzRkrmCg46aQ53ywDo" name="iPhone 18 Pro Max silver" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/PsAoKzRkrmCg46aQ53ywDo-1920-80.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>While it’s an evolutionary visual shift, several hardware refinements complete the package. Beyond a narrower Dynamic Island and trimmed-down display bezels, the newer phone adds the dedicated Camera Control key and the customizable Action Button. Together, these tweaks make the iPhone 18 Pro Max feel far more packed and purposeful.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-display"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Display</span></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="s2wmNYVCKkamFwJV8mJdeT" name="TG_iPhone-14-Pro-Max-6.jpg" alt="iPhone 14 Pro Max" src="https://cdn.mos.cms.futurecdn.net/s2wmNYVCKkamFwJV8mJdeT-1920-80.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>The screen is another area where you clearly get more for your money. While the iPhone 14 Pro Max features a 6.7-inch Super Retina XDR display, the iPhone 18 Pro Max steps up to a larger 6.9-inch panel — giving you more visual real estate for gaming and streaming video on the go.</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="Yjffyuo5ef8MQZ2Juy52Co" name="iPhone 18 Pro Max display" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/Yjffyuo5ef8MQZ2Juy52Co-1920-80.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>Both panels support 120Hz ProMotion refresh rates for fluid UI animations, but visibility gets a massive boost on the newer flagship. The iPhone 14 Pro Max’s 2,000-nit peak brightness was no slouch, yet the 18 Pro Max pushes outdoor brightness to an even higher 3,000 nits.</p><p>Combined with an upgraded anti-reflective coating to combat direct glare and a more compact Dynamic Island that eats up less screen space, the newer display makes direct-sunlight viewing vastly superior.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-cameras"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Cameras</span></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="Nr6f9HPS4ymafxtXRRSsfU" name="TG_iPhone-14-Pro-Max-1.jpg" alt="iPhone 14 Pro Max" src="https://cdn.mos.cms.futurecdn.net/Nr6f9HPS4ymafxtXRRSsfU-1920-80.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>Out of everything, the camera system alone warrants making the leap from the 14 Pro Max to the 18 Pro Max. While the iPhone 14 Pro Max was the first in Apple’s stable to introduce a 48MP main sensor, the iPhone 18 Pro Max delivers substantial generational gains across its entire triple-lens array.</p><p>Leading the charge is the new variable physical aperture on the 48MP main camera. It lets shooters choose between four distinct aperture settings to dial in specific optical effects — from creamy, natural background bokeh to deep depth-of-field that keeps the entire frame in sharp focus.</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="HYuuDMJ2Ch2YMUKD2MbYWc" name="iPhone 18 Pro cameras" alt="iPhone 18 Pro cameras" src="https://cdn.mos.cms.futurecdn.net/HYuuDMJ2Ch2YMUKD2MbYWc-1920-80.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>Telephoto reach is another huge incentive. The iPhone 18 Pro Max upgrades to a sharper 48MP telephoto sensor with 4x optical zoom (up from the 14 Pro Max’s 12MP 3x shooter). Thanks to this folded-periscope setup, the new flagship stretches reach dramatically further to pull in vastly crisp detail on distant subjects.</p><p>Finally, serious shooters will appreciate the newly integrated Pro Controls, which put direct manual adjustments for shutter speed, white balance, ISO, and manual focus right at your fingertips. Throw in creator-grade video upgrades like 4K recording at 120 fps, ProRes capture, and Log profile support for color grading, and the iPhone 18 Pro Max easily establishes itself as a legitimate production camera I wouldn't mind keeping in my pocket.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-performance"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Performance</span></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="cTmx5d63stEFmgKNszEyDo" name="iPhone 18 Pro Max gameplay" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/cTmx5d63stEFmgKNszEyDo-1920-80.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>If you’re still rocking the iPhone 14 Pro Max, you’re running Apple’s A16 Bionic chipset. When we put it to the test back in 2022, it set the pace with a Geekbench multicore score of 5,333 and a 3DMark Wild Life Unlimited frame rate of 74 fps. While it was a clear class-leader at launch, the iPhone 18 Pro Max widens the gap dramatically with its next-generation, 2nm A20 Pro chip.</p><p>Although we still need to run the new phone through our rigorous lab testing, our expectations are set sky-high based on where Apple left off. Last year’s iPhone 17 Pro Max and its A19 Pro silicon delivered a Geekbench multicore score of 9,968 — a staggering 86.9% improvement over the 14 Pro Max.</p><p>That should widen even further with the iPhone 18 Pro Max, especially since the new processor is built on TSMC's cutting-edge 2-nanometer fabrication process.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-battery-and-charging"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Battery and charging</span></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="6N7PRoZ922V5VYKySqDu7o" name="iPhone 18 Pro back burgundy" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/6N7PRoZ922V5VYKySqDu7o-1920-80.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>Endurance is another area where we'll likely see substantial gains with the iPhone 18 Pro Max. Four years is a massive gap in smartphone tech, and during that time, we’ve seen Apple make each successive iteration noticeably more power-efficient than the last.</p><p>When we put the iPhone 14 Pro Max through our custom battery test, it posted an impressive time of 13 hours and 39 minutes. Back in 2022, that runtime made it an easy contender for our <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">best phone battery life</a> list. However, the iPhone 18 Pro Max could set a new benchmark for longevity.</p><p>Last year’s iPhone 17 Pro Max lasted an <a href="https://www.tomsguide.com/phones/iphones/iphone-17-battery-life-results-are-in-how-do-the-new-iphones-compare-to-other-flagships">astounding 17 hours and 54 minutes on the exact same test</a>. That’s more than four hours longer. When you factor in the ultra-efficient, 2nm A20 Pro chip powering the iPhone 18 Pro Max, I wouldn't be surprised to see it comfortably cross the 18-hour threshold.</p><p>Charging gets a long-overdue overhaul, too. The iPhone 14 Pro Max was held back by Apple’s aging Lightning connector and sluggish 20W wired speeds, which only filled the cell to 42% after 30 minutes. The iPhone 18 Pro Max not only brings the universal versatility of USB-C, but it also ramps wired charging speeds up to 60W — which Apple claims can replenish 50% of the battery in just 15 minutes.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-software-and-ai"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Software and AI</span></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="PetgCsR77oez9YPGe9HZFo" name="iPhone 18 Pro Max Siri 1" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/PetgCsR77oez9YPGe9HZFo-1920-80.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>Both devices run Apple’s new <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-live-heres-how-to-download-and-install-it-now">iOS 27</a> update, giving iPhone 14 Pro Max owners access to core interface refinements, refreshed home screen customizations, and system-level performance optimizations. But beneath that shared experience, the iPhone 18 Pro Max benefits from the platform's most transformative additions: <a href="https://www.tomsguide.com/ai/apple-intelligence-unveiled-all-the-new-ai-features-coming-to-ios-18-ipados-18-and-macos-sequoia">Apple Intelligence</a> and <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>.</p><p>Because Apple Intelligence requires substantial on-device processing muscle, the iPhone 14 Pro Max doesn’t make the cut — a massive trade-off given the sheer utility of this new suite. Adding to the divide is the revamped Siri AI, which proved far more conversational in my own testing with its multi-step task automation and onscreen awareness. Those capabilities make the assistant feel less like a rigid voice utility and more like an intuitive assistant I can actually rely on.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X81pNe"></div>                            </div>                            <script src="https://kwizly.com/embed/X81pNe.js" async></script><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-outlook"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Outlook</span></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="XEnBSEb3MMRqFRw7NPesBo" name="iPhone 18 Pro Max front" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/XEnBSEb3MMRqFRw7NPesBo-1920-80.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>We still need to put the iPhone 18 Pro Max through our complete battery of tests to see if it’s indeed a top <a href="https://www.tomsguide.com/best-picks/best-phones">best phone</a> contender, but everything we’ve seen so far points to an easy upgrade recommendation. Between the larger 6.9-inch display, game-changing variable-aperture camera, 60W USB-C charging, and exclusive access to Siri AI and Apple Intelligence, there’s a substantial collection of improvements that make jumping to the new flagship worthwhile.</p><p>Financially, that four-year upgrade cycle also makes plenty of practical sense. Exactly 48 months have passed since the iPhone 14 Pro Max hit shelves, meaning if you’ve managed to tuck away about $27.06 per month, you already have enough saved to cover the iPhone 18 Pro Max outright.</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/ive-been-testing-siri-ai-in-ios-27-for-3-weeks-7-things-to-try-first-and-the-feature-that-won-me-over"><strong>I've been testing Siri AI in iOS 27 for 3 weeks: 7 things to try first (and the feature that won me over)</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/ios-27-quietly-fixes-the-most-annoying-iphone-workaround-we-all-use"><strong>iOS 27 finally fixes the most annoying iPhone workaround we all use</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/ios-27s-safety-filter-was-ruining-my-facetime-calls-heres-how-i-turned-it-off"><strong>iOS 27’s safety filter was ruining my FaceTime calls — here’s how I turned it off</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-vs-iphone-14-pro-max-all-the-differences-and-should-you-upgrade</link>
                                                                            <description>
                            <![CDATA[ If you're thinking of upgrading from the iPhone 14 Pro Max to the iPhone 18 Pro Max, here are all the reasons why that should be a yes. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UUgS7GrfVTyFqdYinM5mCk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/zQniEFCJPwZTgNapSzUwAB-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 05:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 15 Sep 2026 08:15:56 +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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/zQniEFCJPwZTgNapSzUwAB-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro Max vs 14 Pro Max.]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro Max vs 14 Pro Max.]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro Max vs 14 Pro Max.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/zQniEFCJPwZTgNapSzUwAB-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>People are holding onto their phones much longer than ever before, which isn't surprising given how prices keep rising. That’s at the heart of this <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">iPhone 18 Pro Max</a> vs. <a href="https://www.tomsguide.com/reviews/iphone-14-pro-max">iPhone 14 Pro Max</a> comparison, as it raises the question of whether you <em>should </em>upgrade to the latest flagship.</p><p>I’ve said countless times that <a href="https://www.tomsguide.com/phones/ive-been-reviewing-phones-for-almost-18-years-heres-my-advice-on-when-to-upgrade-your-phone">three years should be the bare minimum</a> to wait before upgrading your phone. If you’re still rocking the iPhone 14 Pro Max, there’s more than enough incentive to make the jump to the iPhone 18 Pro Max — especially with a four-year gap between them.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-specifications"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Specifications</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>iPhone 18 Pro Max</p></th><th  ><p>iPhone 14 Pro Max</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$1,099</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>6.9-inch Super Retina XDR display (2,868 x 1,320)</p></td><td  ><p>6.7-inch Super Retina XDR display (2,796 x 1,290)</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>A16 Bionic</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>128GB, 256GB, 512GB, 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Front Cameras</strong></p></td><td  ><p>18MP Center Stage camera (f/1.9)</p></td><td  ><p>12MP (f/1.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>48MP main with variable aperture (f/1.48, f/1.8, f/2.8, f/4), 48MP ultrawide (f/2.2), 48MP telephoto w/4x optical zoom (f/2.8)</p></td><td  ><p>48MP main (f/1.78), 12MP ultrawide (f/2.2), 12MP telephoto with 3x optical zoom (f/2.8)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life Video Playback</strong></p></td><td  ><p>Up to 45 hours</p></td><td  ><p>Up to 29 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.43 x 3.07 x 0.34 inches (163.4 x 78.0 x 8.75 mm)</p></td><td  ><p>6.33 x 3.05 x 0.31 inches (160.7 x 77.6 x 7.85 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.78 ounces (249 grams)</p></td><td  ><p>8.47 ounces  (240 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP68</p></td><td  ><p>IP68</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, Silver, Glacier, Burgundy</p></td><td  ><p>Space Black, Silver, Gold, Deep Purple</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-price-and-release"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Price and release</span></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="TUHKFKjf3sxjBNZKbzJu8o" name="iPhone 18 Pro colors" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/TUHKFKjf3sxjBNZKbzJu8o-1920-80.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>When the iPhone 14 Pro Max launched on September 16, 2022, it started at $1,099  —  whereas the iPhone 18 Pro Max sets you back $1,199. While this is much higher, you get 256GB of baseline storage with the newer model instead of the 128GB on the iPhone 14 Pro Max.</p><p>This comes out to about a 9.1% increase in starting price, which isn’t bad considering the four-year gap between the two. Preorders are open now for the iPhone 18 Pro Max, with official retail availability set for September 18.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-design"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Design</span></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="q5UfaGNrEwWgTWH2iUdKMU" name="TG_iPhone-14-Pro-Max_LIST3.jpg" alt="iPhone 14 Pro Max" src="https://cdn.mos.cms.futurecdn.net/q5UfaGNrEwWgTWH2iUdKMU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div></figure><p>Put them side by side, and it’s obvious they share the same fundamental design language Apple has leaned on since the <a href="https://www.tomsguide.com/reviews/iphone-12-pro">iPhone 12 Pro</a>. Look closer, though, and key differences quickly surface.</p><p>For starters, the iPhone 14 Pro Max is notably thinner and lighter — a clear contrast to the denser, heftier feel of the new flagship. When you flip them over, the distinction is even more pronounced: the iPhone 18 Pro Max swaps the traditional corner module for an elongated camera island that stretches nearly the full width of the upper rear 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="PsAoKzRkrmCg46aQ53ywDo" name="iPhone 18 Pro Max silver" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/PsAoKzRkrmCg46aQ53ywDo-1920-80.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>While it’s an evolutionary visual shift, several hardware refinements complete the package. Beyond a narrower Dynamic Island and trimmed-down display bezels, the newer phone adds the dedicated Camera Control key and the customizable Action Button. Together, these tweaks make the iPhone 18 Pro Max feel far more packed and purposeful.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-display"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Display</span></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="s2wmNYVCKkamFwJV8mJdeT" name="TG_iPhone-14-Pro-Max-6.jpg" alt="iPhone 14 Pro Max" src="https://cdn.mos.cms.futurecdn.net/s2wmNYVCKkamFwJV8mJdeT-1920-80.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>The screen is another area where you clearly get more for your money. While the iPhone 14 Pro Max features a 6.7-inch Super Retina XDR display, the iPhone 18 Pro Max steps up to a larger 6.9-inch panel — giving you more visual real estate for gaming and streaming video on the go.</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="Yjffyuo5ef8MQZ2Juy52Co" name="iPhone 18 Pro Max display" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/Yjffyuo5ef8MQZ2Juy52Co-1920-80.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>Both panels support 120Hz ProMotion refresh rates for fluid UI animations, but visibility gets a massive boost on the newer flagship. The iPhone 14 Pro Max’s 2,000-nit peak brightness was no slouch, yet the 18 Pro Max pushes outdoor brightness to an even higher 3,000 nits.</p><p>Combined with an upgraded anti-reflective coating to combat direct glare and a more compact Dynamic Island that eats up less screen space, the newer display makes direct-sunlight viewing vastly superior.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-cameras"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Cameras</span></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="Nr6f9HPS4ymafxtXRRSsfU" name="TG_iPhone-14-Pro-Max-1.jpg" alt="iPhone 14 Pro Max" src="https://cdn.mos.cms.futurecdn.net/Nr6f9HPS4ymafxtXRRSsfU-1920-80.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>Out of everything, the camera system alone warrants making the leap from the 14 Pro Max to the 18 Pro Max. While the iPhone 14 Pro Max was the first in Apple’s stable to introduce a 48MP main sensor, the iPhone 18 Pro Max delivers substantial generational gains across its entire triple-lens array.</p><p>Leading the charge is the new variable physical aperture on the 48MP main camera. It lets shooters choose between four distinct aperture settings to dial in specific optical effects — from creamy, natural background bokeh to deep depth-of-field that keeps the entire frame in sharp focus.</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="HYuuDMJ2Ch2YMUKD2MbYWc" name="iPhone 18 Pro cameras" alt="iPhone 18 Pro cameras" src="https://cdn.mos.cms.futurecdn.net/HYuuDMJ2Ch2YMUKD2MbYWc-1920-80.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>Telephoto reach is another huge incentive. The iPhone 18 Pro Max upgrades to a sharper 48MP telephoto sensor with 4x optical zoom (up from the 14 Pro Max’s 12MP 3x shooter). Thanks to this folded-periscope setup, the new flagship stretches reach dramatically further to pull in vastly crisp detail on distant subjects.</p><p>Finally, serious shooters will appreciate the newly integrated Pro Controls, which put direct manual adjustments for shutter speed, white balance, ISO, and manual focus right at your fingertips. Throw in creator-grade video upgrades like 4K recording at 120 fps, ProRes capture, and Log profile support for color grading, and the iPhone 18 Pro Max easily establishes itself as a legitimate production camera I wouldn't mind keeping in my pocket.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-performance"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Performance</span></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="cTmx5d63stEFmgKNszEyDo" name="iPhone 18 Pro Max gameplay" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/cTmx5d63stEFmgKNszEyDo-1920-80.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>If you’re still rocking the iPhone 14 Pro Max, you’re running Apple’s A16 Bionic chipset. When we put it to the test back in 2022, it set the pace with a Geekbench multicore score of 5,333 and a 3DMark Wild Life Unlimited frame rate of 74 fps. While it was a clear class-leader at launch, the iPhone 18 Pro Max widens the gap dramatically with its next-generation, 2nm A20 Pro chip.</p><p>Although we still need to run the new phone through our rigorous lab testing, our expectations are set sky-high based on where Apple left off. Last year’s iPhone 17 Pro Max and its A19 Pro silicon delivered a Geekbench multicore score of 9,968 — a staggering 86.9% improvement over the 14 Pro Max.</p><p>That should widen even further with the iPhone 18 Pro Max, especially since the new processor is built on TSMC's cutting-edge 2-nanometer fabrication process.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-battery-and-charging"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Battery and charging</span></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="6N7PRoZ922V5VYKySqDu7o" name="iPhone 18 Pro back burgundy" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/6N7PRoZ922V5VYKySqDu7o-1920-80.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>Endurance is another area where we'll likely see substantial gains with the iPhone 18 Pro Max. Four years is a massive gap in smartphone tech, and during that time, we’ve seen Apple make each successive iteration noticeably more power-efficient than the last.</p><p>When we put the iPhone 14 Pro Max through our custom battery test, it posted an impressive time of 13 hours and 39 minutes. Back in 2022, that runtime made it an easy contender for our <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">best phone battery life</a> list. However, the iPhone 18 Pro Max could set a new benchmark for longevity.</p><p>Last year’s iPhone 17 Pro Max lasted an <a href="https://www.tomsguide.com/phones/iphones/iphone-17-battery-life-results-are-in-how-do-the-new-iphones-compare-to-other-flagships">astounding 17 hours and 54 minutes on the exact same test</a>. That’s more than four hours longer. When you factor in the ultra-efficient, 2nm A20 Pro chip powering the iPhone 18 Pro Max, I wouldn't be surprised to see it comfortably cross the 18-hour threshold.</p><p>Charging gets a long-overdue overhaul, too. The iPhone 14 Pro Max was held back by Apple’s aging Lightning connector and sluggish 20W wired speeds, which only filled the cell to 42% after 30 minutes. The iPhone 18 Pro Max not only brings the universal versatility of USB-C, but it also ramps wired charging speeds up to 60W — which Apple claims can replenish 50% of the battery in just 15 minutes.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-software-and-ai"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Software and AI</span></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="PetgCsR77oez9YPGe9HZFo" name="iPhone 18 Pro Max Siri 1" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/PetgCsR77oez9YPGe9HZFo-1920-80.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>Both devices run Apple’s new <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-live-heres-how-to-download-and-install-it-now">iOS 27</a> update, giving iPhone 14 Pro Max owners access to core interface refinements, refreshed home screen customizations, and system-level performance optimizations. But beneath that shared experience, the iPhone 18 Pro Max benefits from the platform's most transformative additions: <a href="https://www.tomsguide.com/ai/apple-intelligence-unveiled-all-the-new-ai-features-coming-to-ios-18-ipados-18-and-macos-sequoia">Apple Intelligence</a> and <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>.</p><p>Because Apple Intelligence requires substantial on-device processing muscle, the iPhone 14 Pro Max doesn’t make the cut — a massive trade-off given the sheer utility of this new suite. Adding to the divide is the revamped Siri AI, which proved far more conversational in my own testing with its multi-step task automation and onscreen awareness. Those capabilities make the assistant feel less like a rigid voice utility and more like an intuitive assistant I can actually rely on.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X81pNe"></div>                            </div>                            <script src="https://kwizly.com/embed/X81pNe.js" async></script><h2 class="article-body__section" id="section-iphone-18-pro-max-vs-iphone-14-pro-max-outlook"><span>iPhone 18 Pro Max vs. iPhone 14 Pro Max: Outlook</span></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="XEnBSEb3MMRqFRw7NPesBo" name="iPhone 18 Pro Max front" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/XEnBSEb3MMRqFRw7NPesBo-1920-80.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>We still need to put the iPhone 18 Pro Max through our complete battery of tests to see if it’s indeed a top <a href="https://www.tomsguide.com/best-picks/best-phones">best phone</a> contender, but everything we’ve seen so far points to an easy upgrade recommendation. Between the larger 6.9-inch display, game-changing variable-aperture camera, 60W USB-C charging, and exclusive access to Siri AI and Apple Intelligence, there’s a substantial collection of improvements that make jumping to the new flagship worthwhile.</p><p>Financially, that four-year upgrade cycle also makes plenty of practical sense. Exactly 48 months have passed since the iPhone 14 Pro Max hit shelves, meaning if you’ve managed to tuck away about $27.06 per month, you already have enough saved to cover the iPhone 18 Pro Max outright.</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/ive-been-testing-siri-ai-in-ios-27-for-3-weeks-7-things-to-try-first-and-the-feature-that-won-me-over"><strong>I've been testing Siri AI in iOS 27 for 3 weeks: 7 things to try first (and the feature that won me over)</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/ios-27-quietly-fixes-the-most-annoying-iphone-workaround-we-all-use"><strong>iOS 27 finally fixes the most annoying iPhone workaround we all use</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/ios-27s-safety-filter-was-ruining-my-facetime-calls-heres-how-i-turned-it-off"><strong>iOS 27’s safety filter was ruining my FaceTime calls — here’s how I turned it off</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How well do you remember these iconic ‘80s horror movies? Take our ultimate quiz, from ‘Friday the 13th’ to ‘A Nightmare on Elm Street’ ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Horror has always been my favorite genre, and I honestly don’t think I’ll ever get tired of talking about it. There’s so much adrenaline that comes with these films, whether it’s a terrifying villain, an unforgettable practical effect or a scene you still think about years later. Every decade has given us something special, from the classic monsters of the early days to the slashers of the ’70s and ’80s, the psychological horror of the ’90s and the creative wave of horror we’ve seen in more recent years. </p><p>But there’s something particularly special about the 1980s. This was a decade that gave us some of the genre’s most iconic movies, characters and franchises, many of which are still hugely influential today. From “The Thing” and “Friday the 13th” to “Aliens” and “A Nightmare on Elm Street,” there’s no shortage of classics to choose from. So, how well do you really know ’80s horror? Take my quiz and find out.</p><div style="min-height: 1300px;">                                <div class="kwizly-quiz kwizly-eGbREX"></div>                            </div>                            <script src="https://kwizly.com/embed/eGbREX.js" async></script><iframe title="How'd you do?" description="Too hard? Too easy? Let us know what you think in the comments." minimumCommentCount="0" class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>If you’re still in the mood for a movie challenge, there’s plenty more to test your knowledge on. Try my <a href="https://www.tomsguide.com/entertainment/movies/classic-movie-lovers-take-our-quiz-to-see-how-much-you-really-know-from-indiana-jones-to-star-wars">classic movie quiz</a> next, or see if you can <a href="https://www.tomsguide.com/entertainment/movies/i-created-an-ultra-hard-movie-tagline-quiz-only-true-movie-buffs-will-get-a-10-10">guess these famous movie taglines</a> — you might be surprised by how many you remember!</p><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/play"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/fjuquiAyiHf8kntbZuDqKS.jpg" alt="A selection of Toms Guide Puzzles & Quizzes"></p></div><div class="card__content"><h3 class="card__title">Tom&#39;s Guide games</h3><div class="card__description-wrapper"><div class="card__description"><p>Play multiple choice, lystery, word searches, crosswords and guess the number – can you reach the top of the leaderboard?</p></div></div></div></a><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/membership"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/CtyBASsPQAuEKTsTEJu6YL.jpg" alt="A screenshot from the Tom's Guide website reading 'Everything you get as a member'"></p></div><div class="card__content"><h3 class="card__title">Tom&#39;s Guide Club</h3><div class="card__description-wrapper"><div class="card__description"><p>Join Tom’s Guide Club for free, to earn badges, talk to other members and Tom’s writers, get exclusive deals and more.</p></div></div></div></a><p>If you enjoyed this quiz, then please bookmark our <a href="https://www.tomsguide.com/tag/quiz">Quiz</a> section and visit our <a href="https://www.tomsguide.com/polls">Polls page</a> to have your say on all manner of topics, from the best Hollywood movies to the latest Apple releases.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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/entertainment/movies/how-well-do-you-know-80s-thriller-movies-take-this-quiz-on-iconic-films-starring-harrison-ford-nicole-kidman-al-pacino-and-more">How well do you know ‘80s thriller movies?</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/im-testing-your-70s-movie-knowledge-with-these-10-tricky-questions-from-star-wars-to-jaws">I’m testing your ’70s movie knowledge with these 10 tricky questions</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/think-you-know-the-alien-movies-this-quiz-will-put-your-knowledge-of-the-sci-fi-franchise-to-the-ultimate-test">Think you know the Alien movies? Take our quiz</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/movies/how-well-do-you-remember-these-iconic-80s-horror-movies-take-our-ultimate-quiz-from-friday-the-13th-to-a-nightmare-on-elm-street</link>
                                                                            <description>
                            <![CDATA[ Test your horror knowledge with 10 questions covering some of the biggest and most iconic horror movies of the 1980s. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">w7v8RLuKXjCK9g8uFespV8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/zXctXLfy52ihgSHvmtNrKT-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 11:09:18 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Movies]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ alix.blackburn@futurenet.com (Alix Blackburn) ]]></author>                    <dc:creator><![CDATA[ Alix Blackburn ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8UxyT2McanNFLYwQ6wC7di-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/zXctXLfy52ihgSHvmtNrKT-1920-80.jpg">
                                                            <media:credit><![CDATA[Alamy]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Kurt Russell in The Thing (1982), Gizmo in Gremlins (1984), and Robert Englund in A Nightmare on Elm Street (1984)]]></media:description>                                                            <media:text><![CDATA[Kurt Russell in The Thing (1982), Gizmo in Gremlins (1984), and Robert Englund in A Nightmare on Elm Street (1984)]]></media:text>
                                <media:title type="plain"><![CDATA[Kurt Russell in The Thing (1982), Gizmo in Gremlins (1984), and Robert Englund in A Nightmare on Elm Street (1984)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/zXctXLfy52ihgSHvmtNrKT-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Horror has always been my favorite genre, and I honestly don’t think I’ll ever get tired of talking about it. There’s so much adrenaline that comes with these films, whether it’s a terrifying villain, an unforgettable practical effect or a scene you still think about years later. Every decade has given us something special, from the classic monsters of the early days to the slashers of the ’70s and ’80s, the psychological horror of the ’90s and the creative wave of horror we’ve seen in more recent years. </p><p>But there’s something particularly special about the 1980s. This was a decade that gave us some of the genre’s most iconic movies, characters and franchises, many of which are still hugely influential today. From “The Thing” and “Friday the 13th” to “Aliens” and “A Nightmare on Elm Street,” there’s no shortage of classics to choose from. So, how well do you really know ’80s horror? Take my quiz and find out.</p><div style="min-height: 1300px;">                                <div class="kwizly-quiz kwizly-eGbREX"></div>                            </div>                            <script src="https://kwizly.com/embed/eGbREX.js" async></script><iframe title="How'd you do?" description="Too hard? Too easy? Let us know what you think in the comments." minimumCommentCount="0" class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>If you’re still in the mood for a movie challenge, there’s plenty more to test your knowledge on. Try my <a href="https://www.tomsguide.com/entertainment/movies/classic-movie-lovers-take-our-quiz-to-see-how-much-you-really-know-from-indiana-jones-to-star-wars">classic movie quiz</a> next, or see if you can <a href="https://www.tomsguide.com/entertainment/movies/i-created-an-ultra-hard-movie-tagline-quiz-only-true-movie-buffs-will-get-a-10-10">guess these famous movie taglines</a> — you might be surprised by how many you remember!</p><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/play"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/fjuquiAyiHf8kntbZuDqKS.jpg" alt="A selection of Toms Guide Puzzles & Quizzes"></p></div><div class="card__content"><h3 class="card__title">Tom&#39;s Guide games</h3><div class="card__description-wrapper"><div class="card__description"><p>Play multiple choice, lystery, word searches, crosswords and guess the number – can you reach the top of the leaderboard?</p></div></div></div></a><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/membership"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/CtyBASsPQAuEKTsTEJu6YL.jpg" alt="A screenshot from the Tom's Guide website reading 'Everything you get as a member'"></p></div><div class="card__content"><h3 class="card__title">Tom&#39;s Guide Club</h3><div class="card__description-wrapper"><div class="card__description"><p>Join Tom’s Guide Club for free, to earn badges, talk to other members and Tom’s writers, get exclusive deals and more.</p></div></div></div></a><p>If you enjoyed this quiz, then please bookmark our <a href="https://www.tomsguide.com/tag/quiz">Quiz</a> section and visit our <a href="https://www.tomsguide.com/polls">Polls page</a> to have your say on all manner of topics, from the best Hollywood movies to the latest Apple releases.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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/entertainment/movies/how-well-do-you-know-80s-thriller-movies-take-this-quiz-on-iconic-films-starring-harrison-ford-nicole-kidman-al-pacino-and-more">How well do you know ‘80s thriller movies?</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/im-testing-your-70s-movie-knowledge-with-these-10-tricky-questions-from-star-wars-to-jaws">I’m testing your ’70s movie knowledge with these 10 tricky questions</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/think-you-know-the-alien-movies-this-quiz-will-put-your-knowledge-of-the-sci-fi-franchise-to-the-ultimate-test">Think you know the Alien movies? Take our quiz</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I gave the Steam Machine 3 stars at launch — but a game-changing update and this 1TB storage hack has me thinking differently ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you watch my video review of the <a href="https://www.tomsguide.com/gaming/steam-machine-review">Steam Machine</a>, you can tell how heartbroken I was by it. This was supposed to be the perfect middle ground — PC gaming smashed together with a console experience to give you your massive Steam library in a box by your TV.</p><p>But it felt overpriced, unpolished and struggled to hit the performance metrics PC games need in 2026. Then, I started using it…and using it some more…and after weeks of relentless software updates, I have to admit that <em>maybe </em>I rushed to judgement.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/vYWbZGcIKVI" allowfullscreen></iframe></div></div><p>I stand by the score for most of you reading this: console players can get better living room bang for their buck elsewhere (for now) and for PC players, the component math isn’t really mathing. </p><p>But for those in that small group like me who just want our massive Steam backlogs on the big screen without the headache of using Windows from the couch, this is where the Steam Machine turns from good to great.</p><p>This started as a test of the <a href="https://www.amazon.com/Lexar-256GB-Micro-Express-900MB/dp/B0DYB7ZGR3" target="_blank" rel="nofollow">Lexar PLAY microSDXC card,</a> and as you can see by my sprawling thoughts, has evolved into something more. Let me explain.</p><h2 id="fsr-4-1-is-a-game-changer">FSR 4.1 is a game changer</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="v4HrF7QQPQsVVL3MUgg4QU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/v4HrF7QQPQsVVL3MUgg4QU-1920-80.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: Future)</span></figcaption></figure><p>The proof is in the pudding, and Forza Horizon 6 was the first place where I really felt that proof. Recently, Valve <a href="https://steamcommunity.com/groups/steam_hardware/announcements/detail/698770449667981837" target="_blank">updated the Steam Machine to support AMD’s FSR 4.1 resolution scaling</a> and frame generation tech (otherwise known as FSR Redstone).</p><p>Now, it’s worth noting that Horizon 6 is a game that has FSR 4.1 options natively supported in its in-game menus. For others, like The Last of Us Part II, you will have to go into the <strong>game properties, </strong>and <strong>turn the compatibility layer to Proton Experimental. </strong>A small file downloads and you should be off to the races.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="o5TQcpbH3VCvV24wmLGD7U" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/o5TQcpbH3VCvV24wmLGD7U-1920-80.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: Future)</span></figcaption></figure><p>Even if the in-game settings says “FSR 3.1” of some sort, you’re getting FSR 4 — something that I saw when flipping over to Naughty Dog’s epic. The number changes are minor, but the real difference maker here is frame pacing and image quality.</p><p>Forza Horizon 6 had a real stuttering problem when I first played it on the Steam Machine, with driving gameplay feeling like it was on the framerate equivalent of an elastic band stretching and contracting.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/wDZobwvjWr3VWH5WddQadU-1920-80.jpg" alt="Steam Machine" /><figcaption>FSR 3<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/HbD9syCc9Va3RWorXXj6fU-1920-80.jpg" alt="Steam Machine" /><figcaption>FSR 4<small role="credit">Future</small></figcaption></figure></figure><p>Now with FSR 4, not only is ghosting drastically reduced, the 1% lows are much stronger for a massive improvement in consistency. The same can be said of The Last of Us too, as the surface textures don’t fizzle anymore and the frame pacing stability is much better.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Game (and settings)</strong></p></td><td  ><p><strong>FSR 3</strong></p></td><td  ><p><strong>FSR 4</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Forza Horizon 6 (1080p Ultra FSR Performance)</strong></p></td><td  ><p>50 FPS</p></td><td  ><p>56 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>The Last of Us Part 2 (1440p Medium Dynamic resolution scaling)</strong></p></td><td  ><p>52 FPS</p></td><td  ><p>55 FPS</p></td></tr></tbody></table></div><p>Throw in all the UI updates (like making resolution settings much clearer), stability improvements and support for USB wheels and pedals, and this is all coming together nicely! Not in a way that makes the price feel more worthwhile, but we’re heading in the right direction.</p><h2 id="the-remaining-friction-and-the-hack">The remaining friction (and the hack)</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y36AXNfeyagfEawshhPeVU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/y36AXNfeyagfEawshhPeVU-1920-80.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: Future)</span></figcaption></figure><p>While the software and frame rates have evolved, that price remains a massive hurdle — to the point that the base model is the only tier that makes sense. However, that limited internal drive will fill up fast after downloading just a couple of modern games.</p><p>So the fix? The smartest move is buying the base model and pairing it with a microSDXC memory card like the Lexar PLAY I’ve been using. </p><div ><table><thead><tr><th class="firstcol " ><p>Storage</p></th><th  ><p><strong>Read/write speeds  (Mb/s)</strong></p></th><th  ><p>Cyberpunk 2077 load mission</p></th><th  ><p>007 First Light load mission</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steam Machine internal SSD</strong></p></td><td  ><p>3865.7 / 4759.1</p></td><td  ><p>9.6 seconds</p></td><td  ><p>26.2 seconds</p></td></tr><tr><td class="firstcol " ><p><strong>Lexar PLAY microSDXC card</strong></p></td><td  ><p>155.5 / 149.4</p></td><td  ><p>16.9 seconds</p></td><td  ><p>40.7 seconds</p></td></tr></tbody></table></div><p>It’s cheaper to get a 1TB card than upgrading the internal storage, and while the read/write rates are slower than the internal storage, the speeds are fast enough to handle games without any stuttering.</p><p>There is a longer load time, but nothing too agonizing.</p><h2 id="the-comeback-kid">The comeback kid?</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kBVojPHsL8eazNgDWzCTfU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/kBVojPHsL8eazNgDWzCTfU-1920-80.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: Future)</span></figcaption></figure><div><blockquote><p>So, is the Steam Machine suddenly a five-star masterpiece? Let’s not get carried away. </p></blockquote></div><p>So, is the Steam Machine suddenly a five-star masterpiece? Let’s not get carried away. The sticker shock is still very real, and for anyone wanting to roll up their sleeves and build their own compact living room machine, the dollar-to-performance ratio doesn’t add up.</p><p>But the integration of FSR 4 has transformed a choppy, frustrating experience into a genuinely viable console competitor. The Steam Machine proves that hardware specs on a spreadsheet are only half the story, and Valve is putting in the grueling software work to right the ship.</p><p>Plus, you can save a little bit of cash on that premium storage tax by slapping a high-speed Lexar PLAY 1TB microSD card into the base model. The math doesn’t really math as badly as before. </p><p>It might not be the undisputed king of the living room just yet, but it’s absolutely a console comeback kid worth rooting for.</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/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/as-a-pc-snob-i-wanted-to-catch-gta-6-making-console-compromises-instead-im-in-awe-of-the-trickery">As a PC snob, I wanted to catch GTA 6 making console compromises. Instead, I’m in awe of the trickery</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/pc-gaming/i-gave-the-steam-machine-3-stars-at-launch-but-a-game-changing-update-and-this-1tb-storage-hack-has-me-thinking-differently</link>
                                                                            <description>
                            <![CDATA[ The Steam Machine is in its comeback era with FSR 4, and while the pricing is still crazy, it's a game-changing update that does make it awesome in my own testing! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qFQCVEwKYZZu8o5cMEbNV3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/piJ44JNvyTdWibDxvdteUU-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 09:00:00 +0000</pubDate>                                                                                                                                <updated>Mon, 14 Sep 2026 23:03:28 +0000</updated>
                                                                                                                                            <category><![CDATA[PC Gaming]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.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>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/piJ44JNvyTdWibDxvdteUU-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Steam Machine]]></media:description>                                                            <media:text><![CDATA[Steam Machine]]></media:text>
                                <media:title type="plain"><![CDATA[Steam Machine]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/piJ44JNvyTdWibDxvdteUU-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you watch my video review of the <a href="https://www.tomsguide.com/gaming/steam-machine-review">Steam Machine</a>, you can tell how heartbroken I was by it. This was supposed to be the perfect middle ground — PC gaming smashed together with a console experience to give you your massive Steam library in a box by your TV.</p><p>But it felt overpriced, unpolished and struggled to hit the performance metrics PC games need in 2026. Then, I started using it…and using it some more…and after weeks of relentless software updates, I have to admit that <em>maybe </em>I rushed to judgement.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/vYWbZGcIKVI" allowfullscreen></iframe></div></div><p>I stand by the score for most of you reading this: console players can get better living room bang for their buck elsewhere (for now) and for PC players, the component math isn’t really mathing. </p><p>But for those in that small group like me who just want our massive Steam backlogs on the big screen without the headache of using Windows from the couch, this is where the Steam Machine turns from good to great.</p><p>This started as a test of the <a href="https://www.amazon.com/Lexar-256GB-Micro-Express-900MB/dp/B0DYB7ZGR3" target="_blank" rel="nofollow">Lexar PLAY microSDXC card,</a> and as you can see by my sprawling thoughts, has evolved into something more. Let me explain.</p><h2 id="fsr-4-1-is-a-game-changer">FSR 4.1 is a game changer</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="v4HrF7QQPQsVVL3MUgg4QU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/v4HrF7QQPQsVVL3MUgg4QU-1920-80.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: Future)</span></figcaption></figure><p>The proof is in the pudding, and Forza Horizon 6 was the first place where I really felt that proof. Recently, Valve <a href="https://steamcommunity.com/groups/steam_hardware/announcements/detail/698770449667981837" target="_blank">updated the Steam Machine to support AMD’s FSR 4.1 resolution scaling</a> and frame generation tech (otherwise known as FSR Redstone).</p><p>Now, it’s worth noting that Horizon 6 is a game that has FSR 4.1 options natively supported in its in-game menus. For others, like The Last of Us Part II, you will have to go into the <strong>game properties, </strong>and <strong>turn the compatibility layer to Proton Experimental. </strong>A small file downloads and you should be off to the races.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="o5TQcpbH3VCvV24wmLGD7U" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/o5TQcpbH3VCvV24wmLGD7U-1920-80.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: Future)</span></figcaption></figure><p>Even if the in-game settings says “FSR 3.1” of some sort, you’re getting FSR 4 — something that I saw when flipping over to Naughty Dog’s epic. The number changes are minor, but the real difference maker here is frame pacing and image quality.</p><p>Forza Horizon 6 had a real stuttering problem when I first played it on the Steam Machine, with driving gameplay feeling like it was on the framerate equivalent of an elastic band stretching and contracting.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/wDZobwvjWr3VWH5WddQadU-1920-80.jpg" alt="Steam Machine" /><figcaption>FSR 3<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/HbD9syCc9Va3RWorXXj6fU-1920-80.jpg" alt="Steam Machine" /><figcaption>FSR 4<small role="credit">Future</small></figcaption></figure></figure><p>Now with FSR 4, not only is ghosting drastically reduced, the 1% lows are much stronger for a massive improvement in consistency. The same can be said of The Last of Us too, as the surface textures don’t fizzle anymore and the frame pacing stability is much better.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Game (and settings)</strong></p></td><td  ><p><strong>FSR 3</strong></p></td><td  ><p><strong>FSR 4</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Forza Horizon 6 (1080p Ultra FSR Performance)</strong></p></td><td  ><p>50 FPS</p></td><td  ><p>56 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>The Last of Us Part 2 (1440p Medium Dynamic resolution scaling)</strong></p></td><td  ><p>52 FPS</p></td><td  ><p>55 FPS</p></td></tr></tbody></table></div><p>Throw in all the UI updates (like making resolution settings much clearer), stability improvements and support for USB wheels and pedals, and this is all coming together nicely! Not in a way that makes the price feel more worthwhile, but we’re heading in the right direction.</p><h2 id="the-remaining-friction-and-the-hack">The remaining friction (and the hack)</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y36AXNfeyagfEawshhPeVU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/y36AXNfeyagfEawshhPeVU-1920-80.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: Future)</span></figcaption></figure><p>While the software and frame rates have evolved, that price remains a massive hurdle — to the point that the base model is the only tier that makes sense. However, that limited internal drive will fill up fast after downloading just a couple of modern games.</p><p>So the fix? The smartest move is buying the base model and pairing it with a microSDXC memory card like the Lexar PLAY I’ve been using. </p><div ><table><thead><tr><th class="firstcol " ><p>Storage</p></th><th  ><p><strong>Read/write speeds  (Mb/s)</strong></p></th><th  ><p>Cyberpunk 2077 load mission</p></th><th  ><p>007 First Light load mission</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steam Machine internal SSD</strong></p></td><td  ><p>3865.7 / 4759.1</p></td><td  ><p>9.6 seconds</p></td><td  ><p>26.2 seconds</p></td></tr><tr><td class="firstcol " ><p><strong>Lexar PLAY microSDXC card</strong></p></td><td  ><p>155.5 / 149.4</p></td><td  ><p>16.9 seconds</p></td><td  ><p>40.7 seconds</p></td></tr></tbody></table></div><p>It’s cheaper to get a 1TB card than upgrading the internal storage, and while the read/write rates are slower than the internal storage, the speeds are fast enough to handle games without any stuttering.</p><p>There is a longer load time, but nothing too agonizing.</p><h2 id="the-comeback-kid">The comeback kid?</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kBVojPHsL8eazNgDWzCTfU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/kBVojPHsL8eazNgDWzCTfU-1920-80.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: Future)</span></figcaption></figure><div><blockquote><p>So, is the Steam Machine suddenly a five-star masterpiece? Let’s not get carried away. </p></blockquote></div><p>So, is the Steam Machine suddenly a five-star masterpiece? Let’s not get carried away. The sticker shock is still very real, and for anyone wanting to roll up their sleeves and build their own compact living room machine, the dollar-to-performance ratio doesn’t add up.</p><p>But the integration of FSR 4 has transformed a choppy, frustrating experience into a genuinely viable console competitor. The Steam Machine proves that hardware specs on a spreadsheet are only half the story, and Valve is putting in the grueling software work to right the ship.</p><p>Plus, you can save a little bit of cash on that premium storage tax by slapping a high-speed Lexar PLAY 1TB microSD card into the base model. The math doesn’t really math as badly as before. </p><p>It might not be the undisputed king of the living room just yet, but it’s absolutely a console comeback kid worth rooting for.</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/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/as-a-pc-snob-i-wanted-to-catch-gta-6-making-console-compromises-instead-im-in-awe-of-the-trickery">As a PC snob, I wanted to catch GTA 6 making console compromises. Instead, I’m in awe of the trickery</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'I train people of all ages, and this one exercise moves the needle most for building full-body mobility and core control' ]]></title>
                                                                                                <dc:content><![CDATA[ <p>At 35 years old, I'm under no illusion that I'm "old" (what even counts as "old" these days?), but I <em>am</em> aware that I'm dangerously close to the perimenopausal years and the inevitable battle that comes with maintaining strength, mobility, bone density, lean muscle <em>and</em> a healthy metabolism as I steamroll toward my 40s. </p><p>So yes, you could say I'm more conscious than ever about how I train my body to stay strong and mobile against potentially raging hormonal shifts. I have definitely found myself tailoring my strength training toward longevity — something that has become a buzzword now, but wasn't a trend when I was exercising 10 years ago.</p><p>Welcome to the overhead squat. You probably know about it already, but maybe more as an out-and-out strength exercise, also often used with heavy dumbbells or barbells in sweaty CrossFit gyms. Did you know it's actually a pretty savvy lesson in building mobility, too? Here's why you need to try it, and why I want to put it in the spotlight.</p><h2 id="how-to-do-overhead-squats">How to do overhead squats</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/DdPHpnLsknK/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><ul><li>Stand with your feet hip- or shoulder-width apart, depending on your mobility</li><li>Extend your arms overhead with your shoulders pulled back and down, knitting together. Hold a set of light weights if you want to, or a prop like a yoga block</li><li>Engage your core, stay tall through your spine and lift your chest</li><li>Sit your hips back and lower into a squat as if sitting in a chair behind you. Try to keep your back straight, gaze forward and chest upright. Press through your big and little toes and heels</li><li>Pause at the bottom of the squat without tipping forward, then press through your feet, legs and core to stand</li><li><em><strong>Continue for 3-4 sets and 6-10 reps.</strong></em></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN"></fw-embed-feed></div></figure><p>For this variation, we're focusing solely on mobility because we want to improve movement and control through the thoracic spine, improve balance and stability, increase lower-body strength and upper-body engagement and build on squat depth.</p><p>This exercise also helps you reinforce squat technique, including shoulder position, engagement and the tripod foot position. For that reason, I haven't encouraged you to pick up heavy dumbbells or load up a barbell. For now, and for the sake of your mobility, focus on strengthening using your full range of motion and holding a prop or light weights to start with.</p><h2 id="what-are-the-benefits-of-overhead-squats">What are the benefits of overhead squats?</h2><p>Longevity-focused training is about building and maintaining functional strength and lean muscle mass. Areas of fitness like balance, stability and control become focal so that you can exercise well into your later years with less chance of falls and injuries.</p><div><blockquote><p>Surprisingly, some fitness components begin to decline in the mid-thirties. Muscle mass and bone density begin to decline. Joints may become stiffer, and this has a knock-on effect on how well you move.</p></blockquote></div><p>Surprisingly, some <a href="https://www.tomsguide.com/wellness/fitness/a-47-year-study-tells-us-the-exact-age-when-your-strength-and-fitness-begin-to-decline-and-im-stunned">fitness components begin to decline in the mid-thirties</a>. Muscle mass and bone density begin to decline; joints may become stiffer, and this has a knock-on effect on how well you move, not just how well you exercise.</p><p>This exercise can improve strength <em>and</em> mobility, meaning you won't just strengthen the muscles in your lower body that are used every day for walking and climbing; you'll also improve overall range of motion.</p><p>Aim for your thighs to be at least parallel to the ground at the bottom, and keep your shoulders pulled back, without the weights traveling forward or your chest dropping. You can start with your bodyweight or add a light set of <a href="https://www.tomsguide.com/wellness/fitness/best-adjustable-dumbbells">adjustable dumbbells</a> when you feel ready to lift weights.</p><p>It might take time to build the strength and mobility you need; opt for fewer reps or sets, or focus on simply practicing your form. If you experience pain, stop immediately and seek advice from a medical professional.</p><p>Over time, you should notice a stronger core and lower body, more range of motion around your hips, knees and ankles, better squats and a more stable, open upper body capable of supporting weight safely overhead. Not bad, right?</p><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEq7ae"></div>                            </div>                            <script src="https://kwizly.com/embed/eEq7ae.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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank">I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-how-to-be-strong-and-mobile-this-is-the-one-exercise-i-regret-ignoring-for-years" target="_blank">I teach people how to be strong and mobile: this is the one exercise I regret ignoring for years</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-over-50-to-be-mobile-3-low-impact-moves-that-build-more-stability-than-a-30-minute-walk" target="_blank">I teach people over 50 to be mobile: 3 low-impact moves that build more stability than a 30-minute walk</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/workouts/i-train-people-of-all-ages-and-this-one-exercise-moves-the-needle-most-for-building-full-body-mobility-and-core-control</link>
                                                                            <description>
                            <![CDATA[ A personal trainer recommends the overhead squat for building strength and mobility in your muscles and joints; here's how to practice. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zKEaCK7nX5Es7vzgeS54Dj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XMtCHBP7JsoTfJk8aUM6jc-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 15 Sep 2026 10:24:27 +0000</updated>
                                                                                                                                            <category><![CDATA[Workouts]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                <author><![CDATA[ sam.hopes@futurenet.com (Sam Hopes) ]]></author>                    <dc:creator><![CDATA[ Sam Hopes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jZ88qJqvjWaCXXv3qvUQPA-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Sam Hopes is a level 3 qualified trainer, a level 2 Reiki practitioner and a fitness editor at Tom&#039;s Guide. She is also currently undertaking her Yoga For Athletes training course. Sam has written for various fitness brands and websites over the years and has experience across brands at Future, such as &lt;a href=&quot;https://www.livescience.com/author/sam-hopes&quot;&gt;Live Science&lt;/a&gt;,&lt;a href=&quot;https://www.fitandwell.com/author/sam-hopes&quot;&gt; Fit&amp;amp;Well&lt;/a&gt;,&lt;a href=&quot;https://www.coachweb.com/author/sam-hopes&quot;&gt; Coach&lt;/a&gt;, and T3. &lt;/p&gt;&lt;p&gt;Having worked with fitness studios like F45 and Virgin Active and trained both group and 1:1, Sam now primarily teaches outdoor bootcamps, bodyweight, and kettlebells. She also coaches mobility and flexibility classes several times a week and believes that true strength comes from a holistic approach to training your body. &lt;/p&gt;&lt;p&gt;Sam has completed two mixed doubles Hyrox competitions in London and the Netherlands and finished her first doubles attempt in 1:11.&lt;/p&gt;&lt;p&gt;In her spare time, she enjoys CrossFit, hot yoga, Pilates and running and can be found perfecting her handstand walks and handstand push-ups in the gym whenever she has the chance to be upside down. At work, she can be found testing the latest in fitness technology and wearables, anything yoga and CrossFit-related and has a keen interest in nutrition, mindfulness, sleep and recovery.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/XMtCHBP7JsoTfJk8aUM6jc-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of a woman with strong abs]]></media:description>                                                            <media:text><![CDATA[a photo of a woman with strong abs]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of a woman with strong abs]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XMtCHBP7JsoTfJk8aUM6jc-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>At 35 years old, I'm under no illusion that I'm "old" (what even counts as "old" these days?), but I <em>am</em> aware that I'm dangerously close to the perimenopausal years and the inevitable battle that comes with maintaining strength, mobility, bone density, lean muscle <em>and</em> a healthy metabolism as I steamroll toward my 40s. </p><p>So yes, you could say I'm more conscious than ever about how I train my body to stay strong and mobile against potentially raging hormonal shifts. I have definitely found myself tailoring my strength training toward longevity — something that has become a buzzword now, but wasn't a trend when I was exercising 10 years ago.</p><p>Welcome to the overhead squat. You probably know about it already, but maybe more as an out-and-out strength exercise, also often used with heavy dumbbells or barbells in sweaty CrossFit gyms. Did you know it's actually a pretty savvy lesson in building mobility, too? Here's why you need to try it, and why I want to put it in the spotlight.</p><h2 id="how-to-do-overhead-squats">How to do overhead squats</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/DdPHpnLsknK/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><ul><li>Stand with your feet hip- or shoulder-width apart, depending on your mobility</li><li>Extend your arms overhead with your shoulders pulled back and down, knitting together. Hold a set of light weights if you want to, or a prop like a yoga block</li><li>Engage your core, stay tall through your spine and lift your chest</li><li>Sit your hips back and lower into a squat as if sitting in a chair behind you. Try to keep your back straight, gaze forward and chest upright. Press through your big and little toes and heels</li><li>Pause at the bottom of the squat without tipping forward, then press through your feet, legs and core to stand</li><li><em><strong>Continue for 3-4 sets and 6-10 reps.</strong></em></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN"></fw-embed-feed></div></figure><p>For this variation, we're focusing solely on mobility because we want to improve movement and control through the thoracic spine, improve balance and stability, increase lower-body strength and upper-body engagement and build on squat depth.</p><p>This exercise also helps you reinforce squat technique, including shoulder position, engagement and the tripod foot position. For that reason, I haven't encouraged you to pick up heavy dumbbells or load up a barbell. For now, and for the sake of your mobility, focus on strengthening using your full range of motion and holding a prop or light weights to start with.</p><h2 id="what-are-the-benefits-of-overhead-squats">What are the benefits of overhead squats?</h2><p>Longevity-focused training is about building and maintaining functional strength and lean muscle mass. Areas of fitness like balance, stability and control become focal so that you can exercise well into your later years with less chance of falls and injuries.</p><div><blockquote><p>Surprisingly, some fitness components begin to decline in the mid-thirties. Muscle mass and bone density begin to decline. Joints may become stiffer, and this has a knock-on effect on how well you move.</p></blockquote></div><p>Surprisingly, some <a href="https://www.tomsguide.com/wellness/fitness/a-47-year-study-tells-us-the-exact-age-when-your-strength-and-fitness-begin-to-decline-and-im-stunned">fitness components begin to decline in the mid-thirties</a>. Muscle mass and bone density begin to decline; joints may become stiffer, and this has a knock-on effect on how well you move, not just how well you exercise.</p><p>This exercise can improve strength <em>and</em> mobility, meaning you won't just strengthen the muscles in your lower body that are used every day for walking and climbing; you'll also improve overall range of motion.</p><p>Aim for your thighs to be at least parallel to the ground at the bottom, and keep your shoulders pulled back, without the weights traveling forward or your chest dropping. You can start with your bodyweight or add a light set of <a href="https://www.tomsguide.com/wellness/fitness/best-adjustable-dumbbells">adjustable dumbbells</a> when you feel ready to lift weights.</p><p>It might take time to build the strength and mobility you need; opt for fewer reps or sets, or focus on simply practicing your form. If you experience pain, stop immediately and seek advice from a medical professional.</p><p>Over time, you should notice a stronger core and lower body, more range of motion around your hips, knees and ankles, better squats and a more stable, open upper body capable of supporting weight safely overhead. Not bad, right?</p><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEq7ae"></div>                            </div>                            <script src="https://kwizly.com/embed/eEq7ae.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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank">I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-how-to-be-strong-and-mobile-this-is-the-one-exercise-i-regret-ignoring-for-years" target="_blank">I teach people how to be strong and mobile: this is the one exercise I regret ignoring for years</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-over-50-to-be-mobile-3-low-impact-moves-that-build-more-stability-than-a-30-minute-walk" target="_blank">I teach people over 50 to be mobile: 3 low-impact moves that build more stability than a 30-minute walk</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Inside ChatGPT for Financial Services: What early access users can actually do ]]></title>
                                                                                                <dc:content><![CDATA[ <p>OpenAI has launched a new version of ChatGPT built specifically for people working in finance. ChatGPT for Financial Services is a specialized version of <a href="https://www.tomsguide.com/ai/chatgpt/new-to-chatgpt-work-these-7-prompts-turn-it-into-a-personal-assistant">ChatGPT Work</a> designed for financial institutions. It combines <a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-6-astra-is-here-this-one-prompt-shows-what-it-can-really-do">GPT-6 Astra </a>with financial data, research tools and the ability to create everything from valuation models to client presentations.</p><p>And unlike using regular ChatGPT to ask a question about a stock or upload an earnings report, much of the financial information it needs is already built into the product.</p><p>Here's what ChatGPT for Financial Services does, who can use it and how to get started.</p><h2 id="what-is-chatgpt-for-financial-services">What is ChatGPT for Financial Services?</h2><p>Think of it as ChatGPT rebuilt around the workflows of an investment banker or financial analyst. OpenAI developed the product with Morgan Stanley and Evercore, initially concentrating on investment banking and equity research.</p><p>It can research companies, analyze earnings, compare financial performance, build models and turn that work into documents, spreadsheets and presentations.</p><p>The big difference is the data that helped build it. The feature includes premium datasets from Daloopa, PitchBook, LSEG News and Crunchbase. These cover areas including financial statements, earnings transcripts, company fundamentals and private companies.</p><h2 id="how-to-get-access-to-chatgpt-for-financial-services">How to get access to ChatGPT for Financial Services</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZjwbzeuEfAFMRoSBSiDgYU" name="shutterstock_2627531291-2" alt="chatgpt" src="https://cdn.mos.cms.futurecdn.net/ZjwbzeuEfAFMRoSBSiDgYU-1920-80.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: Shutterstock)</span></figcaption></figure><p>Here's the first thing to know before you go looking for it in your ChatGPT account: <strong>you can't simply switch it on.</strong></p><p>ChatGPT for Financial Services is currently available to eligible financial institutions. Firms interested in using it need to contact OpenAI or their existing OpenAI account team. So, while you may see it in the news and want to try it, at least for now, it isn't something <a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-plus-explained-is-this-the-right-plan-for-you">individual ChatGPT Free, Plus or Pro subscribers </a>can sign up for independently.<br><br><a href="https://www.tomsguide.com/ai/chatgpt/what-sane-individual-feels-comfortable-giving-this-level-of-access-to-openai-chatgpt-can-now-be-your-financial-advisor-but-the-reactions-are-pretty-telling">ChatGPT for personal fiances </a>is already available for individuals. This feature within ChatGPT Work offers administrators the ability to manage which employees and roles can use particular data connections, skills and apps.</p><h2 id="it-connects-to-your-company-39-s-financial-data">It connects to your company's financial data </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:813px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="C6spLqZRurNkCvceiwaEnA" name="business" alt="business paperwork" src="https://cdn.mos.cms.futurecdn.net/C6spLqZRurNkCvceiwaEnA-1920-80.png" mos="" align="middle" fullscreen="" width="813" height="457" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Alongside the financial datasets included with the product, OpenAI is working with providers including S&P Capital IQ, LSEG, MSCI, Dow Jones Factiva and Moody's so companies can use subscriptions they already pay for inside ChatGPT.</p><p>The idea is that your ChatGPT sign-in can recognize the financial data you're already entitled to access. There are also more than 50 connectors in OpenAI's broader ecosystem, including services such as Datasite, Box, Preqin, FactSet and Intapp.</p><p>Instead of bouncing between ChatGPT, financial databases and internal documents, analysts can potentially research across those sources from one workspace.</p><h2 id="start-with-a-real-financial-analysis">Start with a real financial analysis</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="vRy3qCuQ4vrM5ScNhqfKHU" name="shutterstock_1654831870.jpg" alt="Young business man working at home with laptop and papers on desk" src="https://cdn.mos.cms.futurecdn.net/vRy3qCuQ4vrM5ScNhqfKHU-1920-80.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: djile / Shutterstock)</span></figcaption></figure><p>Once the relevant data is available, you can give GPT-6 Astra a job rather than simply asking it a question.</p><p>For example, an analyst could ask ChatGPT to compare a company's performance across several quarters, examine earnings data or investigate how an adjusted EBITDA figure was calculated.</p><p>ChatGPT can trace figures through tables, financial documents and supporting notes and then use that information in its analysis.</p><p>Importantly, OpenAI says the product can provide granular citations that let users trace figures and claims back to specific tables and passages. Keep in mind, that doesn't eliminate the need to check AI-generated financial analysis, but it should make checking where a number came from considerably easier.</p><h2 id="turn-your-research-into-a-spreadsheet-or-presentation">Turn your research into a spreadsheet or presentation</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="fjVXmLH8y7oC38EPPNLPAg" name="shutterstock_2428436671" alt="A stock photo of a person on their phone looking at a spreadsheet while several graphs are displayed on the laptop in front of them." src="https://cdn.mos.cms.futurecdn.net/fjVXmLH8y7oC38EPPNLPAg-1920-80.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: Shutterstock)</span></figcaption></figure><p>Research is only part of the workflow. ChatGPT for Financial Services can take its analysis and turn it into Excel spreadsheets, Word documents and PowerPoint presentations.</p><p>A firm's administrators can even upload approved templates and style guides. That means an analyst could potentially move from researching a company to producing a valuation model, research note or pitchbook without manually rebuilding everything in the firm's standard format.</p><p>For anyone who has spent hours transferring research into slides or spreadsheets, this may end up being one of the more useful parts of the product. In terms of safeguards, ChatGPT for Financial Services builds on <a href="https://www.tomsguide.com/ai/chatgpt/no-you-dont-need-to-pay-usd200-a-month-for-chatgpt-heres-why">ChatGPT Enterprise</a>'s existing security controls, including SAML SSO, SCIM provisioning and role-based access.</p><p>OpenAI says business data isn't used to train its models by default and is encrypted both at rest and in transit. Administrators can also control retention, export supported workspace logs for compliance purposes and create separate workspaces to maintain information barriers.</p><h2 id="bottom-line">Bottom line </h2><p>If you're wondering if you should use ChatGPT for Financial Services, for most ChatGPT users, the answers is not right now, because you can't. This is an enterprise product aimed at financial institutions rather than a new consumer feature.</p><p>Still, the more interesting part may be what it says about where ChatGPT is heading. This shows that OpenAI is moving closer to packaging its models with the specialized data, permissions, templates and workflows needed for a particular job.</p><p>For finance, that means GPT-6 Astra is being placed directly alongside the financial databases, company information and document formats bankers already use.</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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/meta-just-launched-an-ai-that-can-actually-run-your-life-online-heres-what-muse-can-do"><strong>Meta just launched an AI that can actually run your life online — here's what Muse can do</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick"><strong>I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/chatgpt/inside-chatgpt-for-financial-services-what-early-access-users-can-actually-do</link>
                                                                            <description>
                            <![CDATA[ Learn how to get started with ChatGPT for Financial Services, who can access it and how OpenAI’s new finance-focused AI platform works. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xaniVqsffDgsoDv48X8Lge</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XfGJNWtjP62R7yfN8cKo7E-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[ChatGPT]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/XfGJNWtjP62R7yfN8cKo7E-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images/Nick Chong]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[financial ]]></media:description>                                                            <media:text><![CDATA[financial ]]></media:text>
                                <media:title type="plain"><![CDATA[financial ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XfGJNWtjP62R7yfN8cKo7E-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>OpenAI has launched a new version of ChatGPT built specifically for people working in finance. ChatGPT for Financial Services is a specialized version of <a href="https://www.tomsguide.com/ai/chatgpt/new-to-chatgpt-work-these-7-prompts-turn-it-into-a-personal-assistant">ChatGPT Work</a> designed for financial institutions. It combines <a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-6-astra-is-here-this-one-prompt-shows-what-it-can-really-do">GPT-6 Astra </a>with financial data, research tools and the ability to create everything from valuation models to client presentations.</p><p>And unlike using regular ChatGPT to ask a question about a stock or upload an earnings report, much of the financial information it needs is already built into the product.</p><p>Here's what ChatGPT for Financial Services does, who can use it and how to get started.</p><h2 id="what-is-chatgpt-for-financial-services">What is ChatGPT for Financial Services?</h2><p>Think of it as ChatGPT rebuilt around the workflows of an investment banker or financial analyst. OpenAI developed the product with Morgan Stanley and Evercore, initially concentrating on investment banking and equity research.</p><p>It can research companies, analyze earnings, compare financial performance, build models and turn that work into documents, spreadsheets and presentations.</p><p>The big difference is the data that helped build it. The feature includes premium datasets from Daloopa, PitchBook, LSEG News and Crunchbase. These cover areas including financial statements, earnings transcripts, company fundamentals and private companies.</p><h2 id="how-to-get-access-to-chatgpt-for-financial-services">How to get access to ChatGPT for Financial Services</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZjwbzeuEfAFMRoSBSiDgYU" name="shutterstock_2627531291-2" alt="chatgpt" src="https://cdn.mos.cms.futurecdn.net/ZjwbzeuEfAFMRoSBSiDgYU-1920-80.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: Shutterstock)</span></figcaption></figure><p>Here's the first thing to know before you go looking for it in your ChatGPT account: <strong>you can't simply switch it on.</strong></p><p>ChatGPT for Financial Services is currently available to eligible financial institutions. Firms interested in using it need to contact OpenAI or their existing OpenAI account team. So, while you may see it in the news and want to try it, at least for now, it isn't something <a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-plus-explained-is-this-the-right-plan-for-you">individual ChatGPT Free, Plus or Pro subscribers </a>can sign up for independently.<br><br><a href="https://www.tomsguide.com/ai/chatgpt/what-sane-individual-feels-comfortable-giving-this-level-of-access-to-openai-chatgpt-can-now-be-your-financial-advisor-but-the-reactions-are-pretty-telling">ChatGPT for personal fiances </a>is already available for individuals. This feature within ChatGPT Work offers administrators the ability to manage which employees and roles can use particular data connections, skills and apps.</p><h2 id="it-connects-to-your-company-39-s-financial-data">It connects to your company's financial data </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:813px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="C6spLqZRurNkCvceiwaEnA" name="business" alt="business paperwork" src="https://cdn.mos.cms.futurecdn.net/C6spLqZRurNkCvceiwaEnA-1920-80.png" mos="" align="middle" fullscreen="" width="813" height="457" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Alongside the financial datasets included with the product, OpenAI is working with providers including S&P Capital IQ, LSEG, MSCI, Dow Jones Factiva and Moody's so companies can use subscriptions they already pay for inside ChatGPT.</p><p>The idea is that your ChatGPT sign-in can recognize the financial data you're already entitled to access. There are also more than 50 connectors in OpenAI's broader ecosystem, including services such as Datasite, Box, Preqin, FactSet and Intapp.</p><p>Instead of bouncing between ChatGPT, financial databases and internal documents, analysts can potentially research across those sources from one workspace.</p><h2 id="start-with-a-real-financial-analysis">Start with a real financial analysis</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="vRy3qCuQ4vrM5ScNhqfKHU" name="shutterstock_1654831870.jpg" alt="Young business man working at home with laptop and papers on desk" src="https://cdn.mos.cms.futurecdn.net/vRy3qCuQ4vrM5ScNhqfKHU-1920-80.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: djile / Shutterstock)</span></figcaption></figure><p>Once the relevant data is available, you can give GPT-6 Astra a job rather than simply asking it a question.</p><p>For example, an analyst could ask ChatGPT to compare a company's performance across several quarters, examine earnings data or investigate how an adjusted EBITDA figure was calculated.</p><p>ChatGPT can trace figures through tables, financial documents and supporting notes and then use that information in its analysis.</p><p>Importantly, OpenAI says the product can provide granular citations that let users trace figures and claims back to specific tables and passages. Keep in mind, that doesn't eliminate the need to check AI-generated financial analysis, but it should make checking where a number came from considerably easier.</p><h2 id="turn-your-research-into-a-spreadsheet-or-presentation">Turn your research into a spreadsheet or presentation</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="fjVXmLH8y7oC38EPPNLPAg" name="shutterstock_2428436671" alt="A stock photo of a person on their phone looking at a spreadsheet while several graphs are displayed on the laptop in front of them." src="https://cdn.mos.cms.futurecdn.net/fjVXmLH8y7oC38EPPNLPAg-1920-80.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: Shutterstock)</span></figcaption></figure><p>Research is only part of the workflow. ChatGPT for Financial Services can take its analysis and turn it into Excel spreadsheets, Word documents and PowerPoint presentations.</p><p>A firm's administrators can even upload approved templates and style guides. That means an analyst could potentially move from researching a company to producing a valuation model, research note or pitchbook without manually rebuilding everything in the firm's standard format.</p><p>For anyone who has spent hours transferring research into slides or spreadsheets, this may end up being one of the more useful parts of the product. In terms of safeguards, ChatGPT for Financial Services builds on <a href="https://www.tomsguide.com/ai/chatgpt/no-you-dont-need-to-pay-usd200-a-month-for-chatgpt-heres-why">ChatGPT Enterprise</a>'s existing security controls, including SAML SSO, SCIM provisioning and role-based access.</p><p>OpenAI says business data isn't used to train its models by default and is encrypted both at rest and in transit. Administrators can also control retention, export supported workspace logs for compliance purposes and create separate workspaces to maintain information barriers.</p><h2 id="bottom-line">Bottom line </h2><p>If you're wondering if you should use ChatGPT for Financial Services, for most ChatGPT users, the answers is not right now, because you can't. This is an enterprise product aimed at financial institutions rather than a new consumer feature.</p><p>Still, the more interesting part may be what it says about where ChatGPT is heading. This shows that OpenAI is moving closer to packaging its models with the specialized data, permissions, templates and workflows needed for a particular job.</p><p>For finance, that means GPT-6 Astra is being placed directly alongside the financial databases, company information and document formats bankers already use.</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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/meta-just-launched-an-ai-that-can-actually-run-your-life-online-heres-what-muse-can-do"><strong>Meta just launched an AI that can actually run your life online — here's what Muse can do</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick"><strong>I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ It wasn’t till I ran at 5 am in Cupertino that I realized this key feature was missing from the Apple Watch Ultra 4 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Like many female runners, I tend to avoid running in the dark, especially at 5 am. Yet, unlike a lot of tech journalists, I found myself needing to sneak in a marathon training session before Apple’s keynote last week. As I woke up at 5 am to meet a fellow running-mad colleague, I noticed one pretty key feature missing from the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4">Apple Watch Ultra 4 </a>— a flashlight. </p><p>Sure, the Apple Watch Ultra 4 has a flashlight that’ll allow you to stumble to the bathroom in the dark or plug your charger in without waking anyone else up, but unlike my friend’s <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-fenix-9-is-here-and-its-brighter-and-thinner-than-its-predecessor">Garmin Fenix 9 Pro</a>, it’s not all that helpful in workout modes. </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HsEvn6zkCC3qyFB7uE4uB7" name="Garmin Fenix 9 Pro flashlight" alt="Garmin Fenix 9 Pro flashlight" src="https://cdn.mos.cms.futurecdn.net/HsEvn6zkCC3qyFB7uE4uB7-1920-80.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: Future)</span></figcaption></figure><p>There’s one key difference between the flashlights on the two watches — the Apple Watch Ultra 4, like the Apple Watch Ultra 3 I had on my wrist, only lights up the screen. The Garmin Fenix 9 Pro, on the other hand, has a dedicated physical LED flashlight built into the watch housing. This was amazingly effective when lighting our way in the pitch-black on the San Francisco Bay Trail. </p><p>In an attempt to add to our visibility, I switched the flashlight on, but it wasn’t all that helpful, and unlike my colleague’s Garmin, I couldn't see my workout stats with the flashlight on. </p><p>Of course, this isn’t a problem I’ll encounter all that often, but it is one worth mentioning if you are deciding between the Apple Watch Ultra 4 and the Garmin Fenix 9 Pro for an outdoor adventure. While the Apple Watch Ultra 4 offers far greater smartwatch capabilities, if you find yourself, like I did, training in the dark, you’ll probably want the Fenix 9 (or the Fenix 8, <a href="https://www.tomsguide.com/reviews/garmin-epix-pro">Epix Pro</a>, or <a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-wearing-the-garmin-forerunner-970-for-six-months-here-are-my-long-term-pros-and-cons">Forerunner 970</a>) on your wrist. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exg9aX"></div>                            </div>                            <script src="https://kwizly.com/embed/exg9aX.js" async></script><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OaLdGW"></div>                            </div>                            <script src="https://kwizly.com/embed/OaLdGW.js" async></script><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/we-asked-368-people-what-they-want-from-the-apple-watch-ultra-4-heres-the-resounding-answer-and-its-not-ai"><strong>We asked 368 people what they want from the Apple Watch Ultra 4. Here’s the resounding answer (and it’s not AI)</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12"><strong>Apple Watch Series 12 hands-on: A new heart rate sensor and a readiness score (at last)</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-is-official-all-the-upgrades-explained"><strong>Apple Watch Ultra 4 is official: All the upgrades explained</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/smartwatches/it-wasnt-till-i-ran-at-5-am-in-cupertino-that-i-realized-this-key-feature-was-missing-from-the-apple-watch-ultra-4</link>
                                                                            <description>
                            <![CDATA[ Here's one feature I wish the Apple Watch Ultra 4 had on board. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ZMhN7dXy7q9XPNRekv36Sk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AYP57Su3Eno7XWdwUbPfJj-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 06:15:00 +0000</pubDate>                                                                                                                                <updated>Mon, 14 Sep 2026 08:47:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AYP57Su3Eno7XWdwUbPfJj-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple Watch Ultra 4]]></media:description>                                                            <media:text><![CDATA[Apple Watch Ultra 4]]></media:text>
                                <media:title type="plain"><![CDATA[Apple Watch Ultra 4]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AYP57Su3Eno7XWdwUbPfJj-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Like many female runners, I tend to avoid running in the dark, especially at 5 am. Yet, unlike a lot of tech journalists, I found myself needing to sneak in a marathon training session before Apple’s keynote last week. As I woke up at 5 am to meet a fellow running-mad colleague, I noticed one pretty key feature missing from the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4">Apple Watch Ultra 4 </a>— a flashlight. </p><p>Sure, the Apple Watch Ultra 4 has a flashlight that’ll allow you to stumble to the bathroom in the dark or plug your charger in without waking anyone else up, but unlike my friend’s <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-fenix-9-is-here-and-its-brighter-and-thinner-than-its-predecessor">Garmin Fenix 9 Pro</a>, it’s not all that helpful in workout modes. </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HsEvn6zkCC3qyFB7uE4uB7" name="Garmin Fenix 9 Pro flashlight" alt="Garmin Fenix 9 Pro flashlight" src="https://cdn.mos.cms.futurecdn.net/HsEvn6zkCC3qyFB7uE4uB7-1920-80.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: Future)</span></figcaption></figure><p>There’s one key difference between the flashlights on the two watches — the Apple Watch Ultra 4, like the Apple Watch Ultra 3 I had on my wrist, only lights up the screen. The Garmin Fenix 9 Pro, on the other hand, has a dedicated physical LED flashlight built into the watch housing. This was amazingly effective when lighting our way in the pitch-black on the San Francisco Bay Trail. </p><p>In an attempt to add to our visibility, I switched the flashlight on, but it wasn’t all that helpful, and unlike my colleague’s Garmin, I couldn't see my workout stats with the flashlight on. </p><p>Of course, this isn’t a problem I’ll encounter all that often, but it is one worth mentioning if you are deciding between the Apple Watch Ultra 4 and the Garmin Fenix 9 Pro for an outdoor adventure. While the Apple Watch Ultra 4 offers far greater smartwatch capabilities, if you find yourself, like I did, training in the dark, you’ll probably want the Fenix 9 (or the Fenix 8, <a href="https://www.tomsguide.com/reviews/garmin-epix-pro">Epix Pro</a>, or <a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-wearing-the-garmin-forerunner-970-for-six-months-here-are-my-long-term-pros-and-cons">Forerunner 970</a>) on your wrist. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exg9aX"></div>                            </div>                            <script src="https://kwizly.com/embed/exg9aX.js" async></script><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OaLdGW"></div>                            </div>                            <script src="https://kwizly.com/embed/OaLdGW.js" async></script><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/we-asked-368-people-what-they-want-from-the-apple-watch-ultra-4-heres-the-resounding-answer-and-its-not-ai"><strong>We asked 368 people what they want from the Apple Watch Ultra 4. Here’s the resounding answer (and it’s not AI)</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12"><strong>Apple Watch Series 12 hands-on: A new heart rate sensor and a readiness score (at last)</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-is-official-all-the-upgrades-explained"><strong>Apple Watch Ultra 4 is official: All the upgrades explained</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I asked ChatGPT to identify the main barriers to success — these 7 suggestions made me rethink how I spend my time ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I tend to find myself enraptured by the inspirational words of CEOs, the major business moves made by entrepreneurs and the surprising success stories that come from unsuspecting individuals.</p><p>There are so many lessons to take away from those people and the varied levels of prosperity they’ve attained in their professional lives. I’ve certainly injected some of them into my everyday life and molded them into what I do as a writer. And as someone who’s constantly delving into what it takes to truly flourish, I reverted to my usual chatbot companion to get its thoughts on the main roadblocks that successful people should abandon.</p><p>After I presented that question to ChatGPT, it kicked off its latest coaching session with this enlightening statement: <em>Successful people often focus heavily on what to start doing. But just as important is figuring out what to stop doing once you've built momentum.</em></p><p>Afterward, ChatGPT highlighted 12 tips on the main things successful people should stop doing. After reviewing them, I made a mental note of seven of those winning habits and changed some of my well-worn habits.</p><h2 id="chatgpt-s-advice-on-what-successful-people-should-consider-quitting">ChatGPT’s advice on what successful people should consider quitting</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="SvsovuaR4oobkU7zEbZrQJ" name="shutterstock_2826926859-16x9" alt="chatgpt" src="https://cdn.mos.cms.futurecdn.net/SvsovuaR4oobkU7zEbZrQJ-1920-80.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>Out of the 12 bits of practical wisdom ChatGPT provided me with in response to my prompt, here are the seven tips that stood out to me the most:</p><ul><li><strong>Stop working just because you can: </strong><em>Being able to work 12 hours doesn't mean you should. Eventually, protecting your energy becomes as important as maximizing your output.</em></li><li><strong>Stop saying yes to everything: </strong><em>Success creates more opportunities—and more distractions. Saying yes to every request can leave little time for the work that actually matters.</em></li><li><strong>Stop trying to prove yourself: </strong><em>Constantly demonstrating that you're smart, capable, or successful can become an exhausting full-time job. Let your results speak for you.</em></li><li><strong>Stop optimizing everything: </strong><em>Successful people can become addicted to productivity hacks, perfect routines, and squeezing another 5% out of everything. Sometimes "good enough" is the most productive option.</em></li><li><strong>Stop comparing yourself to other successful people: </strong><em>Someone else's career, income, house, or accomplishments can make your own progress feel inadequate—even when you're doing exceptionally well.</em></li><li><strong>Stop neglecting your personal life until "later": </strong><em>There may never be a magical point when work stops demanding your attention. Relationships, hobbies, health, and downtime shouldn't be rewards you earn after succeeding.</em></li><li><strong>Stop holding onto what worked in the past: </strong><em>A strategy that helped you succeed may eventually become what holds you back. Success requires periodically questioning your own playbook.</em></li></ul><h2 id="how-those-pieces-of-advice-altered-my-outlook-on-life-for-the-better">How those pieces of advice altered my outlook on life for the better</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="rsY4x9dDwVzVowWqVxS79c" name="shutterstock_2760751387-16x9" alt="work" src="https://cdn.mos.cms.futurecdn.net/rsY4x9dDwVzVowWqVxS79c-1920-80.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>With all those professional and personal improvement recommendations in mind, I slowly but surely began putting them into practice.</p><p>Instead of working past my allotted hours and opening my work laptop over the weekend like I used to, I made a habit of using Friday as my day of full work completion and that evening for idea generation, so my next two days could be devoted to physical and mental relaxation.</p><p>Not saying yes to everything was hard for me to start doing (since I have such a hard time saying no), but I eventually followed that rule by not outright saying no to requests and instead suggesting people who would be better suited to some of the opportunities asked of me.</p><p>Refraining from constantly trying to prove my worth through haughty conversations & pompous social media posts and letting my published pieces' viewer numbers speak for themselves instead soon became commonplace. Showing and proving without boasting became a habit well worth adopting, especially for someone whose work is public for the world to see and read.</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="rP5iCvvqfkpYC4JB8bAGg7" name="laptop" alt="Close-up on hands using a laptop keyboard as woman works at a home office." src="https://cdn.mos.cms.futurecdn.net/rP5iCvvqfkpYC4JB8bAGg7-1920-80.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: Maria Korneeva/Getty Images)</span></figcaption></figure><p>Breaking my habit of constantly optimizing every facet of my life was a bit difficult at first, but I learned to apply it only to some things while using the “good enough” rule for other duties (my assorted exercise and stretching routines don’t demand perfection, after all).</p><p>I definitely quit comparing myself to the familiar folks and celebrities around my age on my social media timelines who seem to be winning at life every time they post something new—I had to remember that everyone has different degrees of success, and mine should offer a sense of fulfillment based on my personal goals.</p><p>While my job is demanding, I’ve learned to take the time to go outside more and mingle with strangers & loved ones alike. Not as a reward for my hectic work week, but as a regular part of my free-time endeavors that put me in a tranquil mental state.</p><p>And finally, I remembered to stop reverting to the same professional success that worked so well in the past. Instead, I observed them, looked for ways to adapt them to the ever-changing tides of my profession, and made the adjustments needed to possibly notch another win on my tech journalist belt.</p><p>In that aforementioned case, Babe Ruth's wise words about baseball certainly apply to anyone: "Yesterday's home runs don't win today's games."</p><h2 id="bottom-line-2">Bottom line</h2><p>ChatGPT can sometimes have a way with words, I must say. Like most self-help coaches and thriving professionals I’ve come across on TV, in books, and on podcasts, OpenAI’s chatbot laid out a myriad of helpful pieces of advice that pushed me to change some of my habits on the never-ending road to success.</p><p>Spending the rest of the precious time I have on this Earth with the seven professional and personal life tips ChatGPT supplied me with turned out to be a success in and of itself.</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/anthropic-says-it-blocked-researchers-using-claude-for-possible-bioweapon-research" target="_blank">Anthropic says it blocked researchers using Claude for possible bioweapon research</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick" target="_blank">I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</a></li><li><a href="https://www.tomsguide.com/ai/the-10-most-influential-games-ever-according-to-chatgpt-gemini-claude-and-perplexity-and-two-of-them-couldnt-agree-on-no-1-for-national-video-games-day" target="_blank">The 10 most influential games ever, according to ChatGPT, Gemini, Claude and Perplexity — and two of them couldn’t agree on No. 1 for National Video Games Day</a></li></ul><div data-widget-type="comparison" data-model-name="Apple MacBook Neo"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-asked-chatgpt-to-identify-the-main-barriers-to-success-these-7-suggestions-made-me-rethink-how-i-spend-my-time</link>
                                                                            <description>
                            <![CDATA[ After asking ChatGPT about the sort of actions that hinder one’s success, I walked away with a bunch of recommendations that changed my outlook on life. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3dgqpJeU2GzfJHoahGLURm</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/T4sSfVsoEPchUsqLhUwhfA-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 06:00:00 +0000</pubDate>                                                                                                                                <updated>Mon, 14 Sep 2026 08:47:18 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[ChatGPT]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/T4sSfVsoEPchUsqLhUwhfA-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[socializing at work]]></media:description>                                                            <media:text><![CDATA[socializing at work]]></media:text>
                                <media:title type="plain"><![CDATA[socializing at work]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/T4sSfVsoEPchUsqLhUwhfA-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I tend to find myself enraptured by the inspirational words of CEOs, the major business moves made by entrepreneurs and the surprising success stories that come from unsuspecting individuals.</p><p>There are so many lessons to take away from those people and the varied levels of prosperity they’ve attained in their professional lives. I’ve certainly injected some of them into my everyday life and molded them into what I do as a writer. And as someone who’s constantly delving into what it takes to truly flourish, I reverted to my usual chatbot companion to get its thoughts on the main roadblocks that successful people should abandon.</p><p>After I presented that question to ChatGPT, it kicked off its latest coaching session with this enlightening statement: <em>Successful people often focus heavily on what to start doing. But just as important is figuring out what to stop doing once you've built momentum.</em></p><p>Afterward, ChatGPT highlighted 12 tips on the main things successful people should stop doing. After reviewing them, I made a mental note of seven of those winning habits and changed some of my well-worn habits.</p><h2 id="chatgpt-s-advice-on-what-successful-people-should-consider-quitting">ChatGPT’s advice on what successful people should consider quitting</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="SvsovuaR4oobkU7zEbZrQJ" name="shutterstock_2826926859-16x9" alt="chatgpt" src="https://cdn.mos.cms.futurecdn.net/SvsovuaR4oobkU7zEbZrQJ-1920-80.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>Out of the 12 bits of practical wisdom ChatGPT provided me with in response to my prompt, here are the seven tips that stood out to me the most:</p><ul><li><strong>Stop working just because you can: </strong><em>Being able to work 12 hours doesn't mean you should. Eventually, protecting your energy becomes as important as maximizing your output.</em></li><li><strong>Stop saying yes to everything: </strong><em>Success creates more opportunities—and more distractions. Saying yes to every request can leave little time for the work that actually matters.</em></li><li><strong>Stop trying to prove yourself: </strong><em>Constantly demonstrating that you're smart, capable, or successful can become an exhausting full-time job. Let your results speak for you.</em></li><li><strong>Stop optimizing everything: </strong><em>Successful people can become addicted to productivity hacks, perfect routines, and squeezing another 5% out of everything. Sometimes "good enough" is the most productive option.</em></li><li><strong>Stop comparing yourself to other successful people: </strong><em>Someone else's career, income, house, or accomplishments can make your own progress feel inadequate—even when you're doing exceptionally well.</em></li><li><strong>Stop neglecting your personal life until "later": </strong><em>There may never be a magical point when work stops demanding your attention. Relationships, hobbies, health, and downtime shouldn't be rewards you earn after succeeding.</em></li><li><strong>Stop holding onto what worked in the past: </strong><em>A strategy that helped you succeed may eventually become what holds you back. Success requires periodically questioning your own playbook.</em></li></ul><h2 id="how-those-pieces-of-advice-altered-my-outlook-on-life-for-the-better">How those pieces of advice altered my outlook on life for the better</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="rsY4x9dDwVzVowWqVxS79c" name="shutterstock_2760751387-16x9" alt="work" src="https://cdn.mos.cms.futurecdn.net/rsY4x9dDwVzVowWqVxS79c-1920-80.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>With all those professional and personal improvement recommendations in mind, I slowly but surely began putting them into practice.</p><p>Instead of working past my allotted hours and opening my work laptop over the weekend like I used to, I made a habit of using Friday as my day of full work completion and that evening for idea generation, so my next two days could be devoted to physical and mental relaxation.</p><p>Not saying yes to everything was hard for me to start doing (since I have such a hard time saying no), but I eventually followed that rule by not outright saying no to requests and instead suggesting people who would be better suited to some of the opportunities asked of me.</p><p>Refraining from constantly trying to prove my worth through haughty conversations & pompous social media posts and letting my published pieces' viewer numbers speak for themselves instead soon became commonplace. Showing and proving without boasting became a habit well worth adopting, especially for someone whose work is public for the world to see and read.</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="rP5iCvvqfkpYC4JB8bAGg7" name="laptop" alt="Close-up on hands using a laptop keyboard as woman works at a home office." src="https://cdn.mos.cms.futurecdn.net/rP5iCvvqfkpYC4JB8bAGg7-1920-80.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: Maria Korneeva/Getty Images)</span></figcaption></figure><p>Breaking my habit of constantly optimizing every facet of my life was a bit difficult at first, but I learned to apply it only to some things while using the “good enough” rule for other duties (my assorted exercise and stretching routines don’t demand perfection, after all).</p><p>I definitely quit comparing myself to the familiar folks and celebrities around my age on my social media timelines who seem to be winning at life every time they post something new—I had to remember that everyone has different degrees of success, and mine should offer a sense of fulfillment based on my personal goals.</p><p>While my job is demanding, I’ve learned to take the time to go outside more and mingle with strangers & loved ones alike. Not as a reward for my hectic work week, but as a regular part of my free-time endeavors that put me in a tranquil mental state.</p><p>And finally, I remembered to stop reverting to the same professional success that worked so well in the past. Instead, I observed them, looked for ways to adapt them to the ever-changing tides of my profession, and made the adjustments needed to possibly notch another win on my tech journalist belt.</p><p>In that aforementioned case, Babe Ruth's wise words about baseball certainly apply to anyone: "Yesterday's home runs don't win today's games."</p><h2 id="bottom-line-2">Bottom line</h2><p>ChatGPT can sometimes have a way with words, I must say. Like most self-help coaches and thriving professionals I’ve come across on TV, in books, and on podcasts, OpenAI’s chatbot laid out a myriad of helpful pieces of advice that pushed me to change some of my habits on the never-ending road to success.</p><p>Spending the rest of the precious time I have on this Earth with the seven professional and personal life tips ChatGPT supplied me with turned out to be a success in and of itself.</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/anthropic-says-it-blocked-researchers-using-claude-for-possible-bioweapon-research" target="_blank">Anthropic says it blocked researchers using Claude for possible bioweapon research</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick" target="_blank">I stopped reading the fine print myself after discovering this overlooked ChatGPT trick</a></li><li><a href="https://www.tomsguide.com/ai/the-10-most-influential-games-ever-according-to-chatgpt-gemini-claude-and-perplexity-and-two-of-them-couldnt-agree-on-no-1-for-national-video-games-day" target="_blank">The 10 most influential games ever, according to ChatGPT, Gemini, Claude and Perplexity — and two of them couldn’t agree on No. 1 for National Video Games Day</a></li></ul><div data-widget-type="comparison" data-model-name="Apple MacBook Neo"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’m a personal trainer for seniors — if you’re in your 30’s or 40’s, start doing this exercise now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>My personal training clients under 60 may not be thinking about their full-body stability, but I am. It’s incredibly important to start considering your overall balance well before you reach your senior years.</p><p>For that reason, dumbbell front rack reverse lunges are a go-to exercise for almost all of my clients in their 30’s and 40’s. This movement improves single-leg strength, trains the deepest muscles of our core, and can even promote better posture – all crucial elements that safeguard our stability as we get older. </p><p>If you’ve got a pair of <a href="https://www.tomsguide.com/wellness/fitness/best-adjustable-dumbbells">dumbbells</a>, you can give dumbbell front rack reverse lunges a try for yourself. It’s an exercise that’s beneficial for any age group.</p><h3 class="article-body__section" id="section-how-to-do-the-dumbbell-front-rack-reverse-lunge"><span>How to do the dumbbell front rack reverse lunge</span></h3><p>Discuss any new activity or workout with your doctor before proceeding. They may suggest alternatives based on your health history, or advise you to avoid certain movements or exercises.</p><p>The dumbbell front rack reverse lunge isn’t a complicated movement, but it may be a bit too advanced if you’re a total beginner. Consider meeting with a certified personal trainer for guidance. They can assess whether you’re ready for the exercise, offer modifications if needed, and give you progression options as you build strength. </p><p>You’ll just need two moderately heavy dumbbells for this exercise (check out the <a href="https://www.tomsguide.com/wellness/fitness/best-adjustable-dumbbells">best adjustable dumbbells</a> for working out at home here). A proper weight will allow you to do all of the reps in a set without needing to rest. If you can’t make it through a whole set without pausing, choose a lighter weight. If you can make it through a whole set without much effort, choose a heavier weight. </p><p>Start by doing 8-10 reps of the exercise on each side. Once that starts to feel easy, work up to 12-15 reps. Aim to do dumbbell front rack reverse lunges for 2-3 sets a few times per week. They can be done on their own or as a part of your lower body workouts. </p><p>You should feel muscle fatigue with this exercise, but never any sharp pain. If you feel sharp pain at any point, stop doing the exercise and meet with your doctor before trying it again. </p><p>Here’s how to do dumbbell front rack reverse lunges:</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Zv8CDt76v-o" allowfullscreen></iframe></div></div><ul><li><strong>Hold a dumbbell in each hand.</strong></li><li><strong>Stand tall with your feet hip-width apart.</strong></li><li><strong>Engage your core.</strong></li><li><strong>Bring the dumbbells to a “front rack” position, right above your shoulders.</strong></li><li><strong>Step your right foot behind you.</strong></li><li><strong>Bend both knees and lower your right knee towards the floor.</strong></li><li><strong>Stand up and step your right foot back to the starting position.</strong></li><li><strong>Continue for 8-15 reps, then repeat with the left leg.</strong></li></ul><h3 class="article-body__section" id="section-benefits-of-dumbbell-front-rack-reverse-lunges"><span>Benefits of dumbbell front rack reverse lunges</span></h3><p>Dumbbell front rack reverse lunges may seem like a lower body exercise, but it actually trains your entire body.</p><p>You’ll strengthen your quads, hamstrings, glutes, and hip abductors and hip adductors with this movement. Because the exercise is done unilaterally (or one side at a time), you’ll work each leg independently from the other, which can improve muscle imbalances and single-leg power.</p><p>By holding the dumbbells at your shoulders, you’ll force your deep core muscles, like the transverse abdominis and internal obliques, to engage and stabilize your hips and spine. This trains the abdominals to better support your body during movement, and can lessen your risk of serious falls as you get older.</p><p>Your upper body will get some work as well, namely your trapezius and shoulders. These muscles work to keep the dumbbell in position, contributing to better upper body strength and endurance.</p><h3 class="article-body__section" id="section-modifications-for-dumbbell-front-rack-reverse-lunges"><span>Modifications for dumbbell front rack reverse lunges</span></h3><p>I rarely start a beginner with dumbbell front rack reverse lunges, so if you’ve just started to work out regularly, you may need to modify the exercise.</p><p>I suggest doing <a href="https://youtu.be/xrPteyQLGAo?si=4oZy8rnX5Zsyb-Bk">basic reverse lunges</a> first. This will allow you to build the right level of strength in your lower body and improve overall coordination. </p><p>Once you’ve mastered the basic reverse lunge, you can hold <a href="https://youtu.be/Q2k3kYbtOcI?si=f2S8EVjMFKe7X7eV">dumbbells at your sides</a>. This increases the load for your legs, but won’t demand as much effort from the core or upper body as the front rack position does. </p><p>When those start to feel easy, you can perform a <a href="https://youtu.be/Itsvw0JmHWY?si=_XinUNsE5IdnHRkM">single-arm dumbbell front rack reverse lunge</a>, and then eventually, the standard version of the exercise. Remember, you should be able to complete all of the reps in a set without pausing to rest. Adjust your dumbbell weight as needed.</p><h3 class="article-body__section" id="section-progressions-for-dumbbell-front-rack-reverse-lunges"><span>Progressions for dumbbell front rack reverse lunges</span></h3><p>If you can perform 15 reps of dumbbell front rack reverse lunges without feeling fatigued, then you’ll need to make the exercise more challenging.</p><p>Using heavier dumbbells is the easiest way to progress the dumbbell front rack reverse lunge. As long as you can keep proper form throughout the exercise, you can keep going up in dumbbell weight. Keep in mind, though, that when you increase dumbbell weight, you may need to decrease your reps. Begin with 8 reps on each leg and increase your reps as you feel comfortable. </p><p>For an extra balance challenge, bring your moving leg to a 90-degree angle at the end of the movement instead of stepping back to the starting position. This will force your hips and core to work harder to maintain stability.  </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OoNbJW"></div>                            </div>                            <script src="https://kwizly.com/embed/OoNbJW.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><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/i-wear-an-apple-watch-every-single-day-and-i-never-knew-you-could-do-this"><strong>‘I wear an Apple Watch every single day, and I never knew you could do this.’</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/i-wear-an-apple-watch-every-day-and-this-is-the-free-app-i-use-all-of-the-time"><strong>I wear an Apple Watch every day, and this is the free app I use all of the time</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness/too-busy-to-work-out-i-added-thousands-of-steps-to-my-day-using-this-simple-trick"><strong>Forget running — I added thousands of steps to my day using this simple trick</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/workouts/im-a-personal-trainer-for-seniors-if-youre-in-your-30s-or-40s-start-doing-this-exercise-now</link>
                                                                            <description>
                            <![CDATA[ Our resident personal trainer for seniors recommends this exercise to strengthen your entire body and you're going to want to start doing it now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">VnxeXriyAxSJwYJFa4bxHT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/J8hUPmUZXgYqLctcNSuirb-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Workouts]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                <author><![CDATA[ jen@jenrizzutofitness.com (Jennifer Rizzuto) ]]></author>                    <dc:creator><![CDATA[ Jennifer Rizzuto ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/V3yeuQZGZePvWRoSmHyxp8-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/J8hUPmUZXgYqLctcNSuirb-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a woman holding dumbbells]]></media:description>                                                            <media:text><![CDATA[a woman holding dumbbells]]></media:text>
                                <media:title type="plain"><![CDATA[a woman holding dumbbells]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/J8hUPmUZXgYqLctcNSuirb-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>My personal training clients under 60 may not be thinking about their full-body stability, but I am. It’s incredibly important to start considering your overall balance well before you reach your senior years.</p><p>For that reason, dumbbell front rack reverse lunges are a go-to exercise for almost all of my clients in their 30’s and 40’s. This movement improves single-leg strength, trains the deepest muscles of our core, and can even promote better posture – all crucial elements that safeguard our stability as we get older. </p><p>If you’ve got a pair of <a href="https://www.tomsguide.com/wellness/fitness/best-adjustable-dumbbells">dumbbells</a>, you can give dumbbell front rack reverse lunges a try for yourself. It’s an exercise that’s beneficial for any age group.</p><h3 class="article-body__section" id="section-how-to-do-the-dumbbell-front-rack-reverse-lunge"><span>How to do the dumbbell front rack reverse lunge</span></h3><p>Discuss any new activity or workout with your doctor before proceeding. They may suggest alternatives based on your health history, or advise you to avoid certain movements or exercises.</p><p>The dumbbell front rack reverse lunge isn’t a complicated movement, but it may be a bit too advanced if you’re a total beginner. Consider meeting with a certified personal trainer for guidance. They can assess whether you’re ready for the exercise, offer modifications if needed, and give you progression options as you build strength. </p><p>You’ll just need two moderately heavy dumbbells for this exercise (check out the <a href="https://www.tomsguide.com/wellness/fitness/best-adjustable-dumbbells">best adjustable dumbbells</a> for working out at home here). A proper weight will allow you to do all of the reps in a set without needing to rest. If you can’t make it through a whole set without pausing, choose a lighter weight. If you can make it through a whole set without much effort, choose a heavier weight. </p><p>Start by doing 8-10 reps of the exercise on each side. Once that starts to feel easy, work up to 12-15 reps. Aim to do dumbbell front rack reverse lunges for 2-3 sets a few times per week. They can be done on their own or as a part of your lower body workouts. </p><p>You should feel muscle fatigue with this exercise, but never any sharp pain. If you feel sharp pain at any point, stop doing the exercise and meet with your doctor before trying it again. </p><p>Here’s how to do dumbbell front rack reverse lunges:</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Zv8CDt76v-o" allowfullscreen></iframe></div></div><ul><li><strong>Hold a dumbbell in each hand.</strong></li><li><strong>Stand tall with your feet hip-width apart.</strong></li><li><strong>Engage your core.</strong></li><li><strong>Bring the dumbbells to a “front rack” position, right above your shoulders.</strong></li><li><strong>Step your right foot behind you.</strong></li><li><strong>Bend both knees and lower your right knee towards the floor.</strong></li><li><strong>Stand up and step your right foot back to the starting position.</strong></li><li><strong>Continue for 8-15 reps, then repeat with the left leg.</strong></li></ul><h3 class="article-body__section" id="section-benefits-of-dumbbell-front-rack-reverse-lunges"><span>Benefits of dumbbell front rack reverse lunges</span></h3><p>Dumbbell front rack reverse lunges may seem like a lower body exercise, but it actually trains your entire body.</p><p>You’ll strengthen your quads, hamstrings, glutes, and hip abductors and hip adductors with this movement. Because the exercise is done unilaterally (or one side at a time), you’ll work each leg independently from the other, which can improve muscle imbalances and single-leg power.</p><p>By holding the dumbbells at your shoulders, you’ll force your deep core muscles, like the transverse abdominis and internal obliques, to engage and stabilize your hips and spine. This trains the abdominals to better support your body during movement, and can lessen your risk of serious falls as you get older.</p><p>Your upper body will get some work as well, namely your trapezius and shoulders. These muscles work to keep the dumbbell in position, contributing to better upper body strength and endurance.</p><h3 class="article-body__section" id="section-modifications-for-dumbbell-front-rack-reverse-lunges"><span>Modifications for dumbbell front rack reverse lunges</span></h3><p>I rarely start a beginner with dumbbell front rack reverse lunges, so if you’ve just started to work out regularly, you may need to modify the exercise.</p><p>I suggest doing <a href="https://youtu.be/xrPteyQLGAo?si=4oZy8rnX5Zsyb-Bk">basic reverse lunges</a> first. This will allow you to build the right level of strength in your lower body and improve overall coordination. </p><p>Once you’ve mastered the basic reverse lunge, you can hold <a href="https://youtu.be/Q2k3kYbtOcI?si=f2S8EVjMFKe7X7eV">dumbbells at your sides</a>. This increases the load for your legs, but won’t demand as much effort from the core or upper body as the front rack position does. </p><p>When those start to feel easy, you can perform a <a href="https://youtu.be/Itsvw0JmHWY?si=_XinUNsE5IdnHRkM">single-arm dumbbell front rack reverse lunge</a>, and then eventually, the standard version of the exercise. Remember, you should be able to complete all of the reps in a set without pausing to rest. Adjust your dumbbell weight as needed.</p><h3 class="article-body__section" id="section-progressions-for-dumbbell-front-rack-reverse-lunges"><span>Progressions for dumbbell front rack reverse lunges</span></h3><p>If you can perform 15 reps of dumbbell front rack reverse lunges without feeling fatigued, then you’ll need to make the exercise more challenging.</p><p>Using heavier dumbbells is the easiest way to progress the dumbbell front rack reverse lunge. As long as you can keep proper form throughout the exercise, you can keep going up in dumbbell weight. Keep in mind, though, that when you increase dumbbell weight, you may need to decrease your reps. Begin with 8 reps on each leg and increase your reps as you feel comfortable. </p><p>For an extra balance challenge, bring your moving leg to a 90-degree angle at the end of the movement instead of stepping back to the starting position. This will force your hips and core to work harder to maintain stability.  </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OoNbJW"></div>                            </div>                            <script src="https://kwizly.com/embed/OoNbJW.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><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/i-wear-an-apple-watch-every-single-day-and-i-never-knew-you-could-do-this"><strong>‘I wear an Apple Watch every single day, and I never knew you could do this.’</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/smartwatches/i-wear-an-apple-watch-every-day-and-this-is-the-free-app-i-use-all-of-the-time"><strong>I wear an Apple Watch every day, and this is the free app I use all of the time</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness/too-busy-to-work-out-i-added-thousands-of-steps-to-my-day-using-this-simple-trick"><strong>Forget running — I added thousands of steps to my day using this simple trick</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone 18 Pro and Pro Max variable aperture camera explained — here's what it actually does ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Every major iPhone camera upgrade over the past decade has followed a familiar playbook: larger sensors, higher megapixel counts, and heavier doses of computational photography. With the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">iPhone 18 Pro and iPhone 18 Pro Max</a>, Apple is introducing something entirely mechanical that aims to give photographers more creative control than ever before: a variable aperture camera.</p><p>To be fair, Apple isn't the first to embrace this technology. Samsung introduced a dual-aperture system on the <a href="https://www.tomsguide.com/us/galaxy-s9-s9-plus,review-5198.html">Galaxy S9</a> and <a href="https://www.tomsguide.com/us/samsung-galaxy-s10,review-6279.html">S10</a> as far back as 2018, while more recent flagships like the Huawei Mate 50 Pro and <a href="https://www.tomsguide.com/phones/android-phones/xiaomi-14-ultra-sounds-like-an-ultra-impressive-phone-especially-in-the-camera-department">Xiaomi 14 Ultra</a> have considerably refined how multi-stop mechanisms function. But for the very first time on an iPhone, the primary camera features a true, physical variable aperture system.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/BZi0R_thP9M" allowfullscreen></iframe></div></div><p>Enthusiasts and pros already understand how an <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-i-asked-3-pro-photographers-what-they-really-think-of-a-variable-aperture-camera">adjustable aperture elevates their shooting</a>, but everyday users will find Apple’s automated implementation and simplified controls far more approachable. I’ll break down what the iPhone 18 Pro's variable aperture actually does, the physics behind it, and why it represents one of the most substantial leaps for iPhone photography in years.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-variable-aperture-camera-how-it-works"><span>iPhone 18 Pro Max variable aperture camera: How it works</span></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="dwK9C9bzHe8Bqt6sMrUca" name="iPhone 18 Pro Max variable aperture camera.GIF" alt="iPhone 18 Pro Max variable aperture camera." src="https://cdn.mos.cms.futurecdn.net/dwK9C9bzHe8Bqt6sMrUca-1920-80.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: Apple)</span></figcaption></figure><p>Think of a camera’s aperture much like the pupil of your eye — dilating (opening up) to draw in light when it's dark and contracting (closing down) when the scene is bright. While the iPhone 18 Pro Max's 48MP ultrawide and telephoto lenses keep traditional fixed apertures, the 48MP main Fusion camera introduces a motorized, multi-blade mechanical iris built directly into the lens barrel.</p><p>This mechanism physically shifts those ultra-thin aperture blades to control precisely how much light hits the sensor. Shooters have a total of four distinct aperture values to choose from: f/1.48, f/1.8, f/2.8, and f/4.0.</p><p>Ultimately, choosing the right aperture boils down to your shooting conditions and the specific aesthetic you’re after.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-variable-aperture-camera-what-it-can-do"><span>iPhone 18 Pro Max variable aperture camera: What it can do</span></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="9GCbUtdmqto6e9mrgX2BJo" name="iPhone 18 Pro Max variable aperture" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/9GCbUtdmqto6e9mrgX2BJo-1920-80.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>While f-stop values can feel intimidating to the uninitiated, Apple does a great job illustrating the tangible benefits of a variable aperture through everyday shooting scenarios. Having physical control over the lens fundamentally shifts the iPhone’s image capture across several key areas.</p><h3 class="article-body__section" id="section-natural-background-blur"><span>Natural background blur</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:980px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="djXDXz2SYCbRR9b6jrSZMS" name="iPhone 18 Pro Max variable aperture camera" alt="iPhone 18 Pro Max variable aperture camera sample." src="https://cdn.mos.cms.futurecdn.net/djXDXz2SYCbRR9b6jrSZMS-1920-80.jpg" mos="" align="middle" fullscreen="" width="980" height="735" 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>Opening the blades wide to f/1.48 yields authentic optical bokeh. Because the physical lens optics and large sensor are doing the heavy lifting, background separation increases naturally the closer you get to your subject — making it ideal for portraits and close-up detail shots.</p><p>While the iPhone has long offered Portrait Mode, that feature relies heavily on computational algorithms to simulate depth. With the 18 Pro Max, you get genuine optical falloff and creamy defocus without the botched edge-detection or digital processing.</p><h3 class="article-body__section" id="section-sharp-focus-throughout-the-frame"><span>Sharp focus throughout the frame</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:980px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="epeGySCB2snjq3PFqttyMS" name="iPhone 18 Pro Max variable aperture camera" alt="iPhone 18 Pro Max variable aperture camera sample." src="https://cdn.mos.cms.futurecdn.net/epeGySCB2snjq3PFqttyMS-1920-80.jpg" mos="" align="middle" fullscreen="" width="980" height="735" 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>Stopping down to f/4.0 expands your depth of field considerably, ensuring corner-to-corner sharpness across the entire frame. This is a setting you'll want to lean on for sweeping landscapes, architecture, and group shots.</p><p>If you shoot a staggered group at a fast aperture like f/1.48, someone standing in the front row might be sharp while family members two rows back appear softly blurred. Stopping down to f/4.0 deepens the focus plane so every face in the frame remains crisp and clear.</p><h3 class="article-body__section" id="section-creating-intentional-motion-blur"><span>Creating intentional motion blur</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:980px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="UzVRQ3sEbBv3P7Rn8yLVMS" name="iPhone 18 Pro Max variable aperture camera" alt="iPhone 18 Pro Max variable aperture camera sample." src="https://cdn.mos.cms.futurecdn.net/UzVRQ3sEbBv3P7Rn8yLVMS-1920-80.jpg" mos="" align="middle" fullscreen="" width="980" height="735" 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 bright daylight, traditional fixed-aperture phones are forced to use ultra-fast shutter speeds, which freezes all motion. If you want a more dynamic feel, stopping down to f/4.0 restricts incoming light. That drop in exposure allows the camera to lengthen the shutter speed without blowing out the highlights.</p><p>The result is intentional motion blur. Apple demonstrated this with a stationary model standing sharp in the center of the frame with pedestrians blurred smoothly around them. That same principle lets you capture light trails from passing car headlights or render rushing waterfalls as silky, continuous streams.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ozn90O"></div>                            </div>                            <script src="https://kwizly.com/embed/Ozn90O.js" async></script><h3 class="article-body__section" id="section-improving-low-light-performance"><span>Improving low-light performance</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:980px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="9FtxQUWQJpAWHfeYkQorGS" name="iPhone 18 Pro Max variable aperture camera" alt="iPhone 18 Pro Max variable aperture camera sample." src="https://cdn.mos.cms.futurecdn.net/9FtxQUWQJpAWHfeYkQorGS-1920-80.jpg" mos="" align="middle" fullscreen="" width="980" height="735" 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 iPhone 18 Pro and Pro Max hold a clear hardware advantage in dark environments thanks to that wide f/1.48 opening. Retracting the aperture blades floods the 48MP sensor with maximum light, which suppresses image noise, preserves fine shadow detail, and allows the shutter to fire significantly faster.</p><p>In practice, this leads to shorter Night mode exposure times, drastically cutting down the risk of handheld micro-jitters blurring your low-light shots.</p><h3 class="article-body__section" id="section-freeze-framing-fast-moving-subjects"><span>Freeze framing fast-moving subjects</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:70.59%;"><img id="LDiNfuMAcpQ3JBvohZh9Dc" name="motion-scooter-Shutter-speed.jpg" alt="Shooting subjects in motion using iPhone 16 Pro Max" src="https://cdn.mos.cms.futurecdn.net/LDiNfuMAcpQ3JBvohZh9Dc-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2560" height="1807" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/LDiNfuMAcpQ3JBvohZh9Dc-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>By pulling in vastly more light at f/1.48, the camera system can afford to push shutter speeds to tiny fractions of a second without producing a dark, underexposed image. This rapid exposure freezes jumpy pets, sprinting kids, and fast-paced sports action super sharp before motion blur can creep into the frame.</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/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo">I interviewed Apple CEO John Ternus on the making of the iPhone Duo — here's what made him say 'yes, that's it'</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/people-are-freaking-out-about-the-new-always-listening-apple-watches-heres-what-apple-ceo-john-ternus-told-us">People are freaking out about the new 'always-listening' Apple Watches — here's what Apple CEO John Ternus told us</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-vs-garmin-fenix-9-pro-price-specs-and-features-compared">Apple Watch Ultra 4 vs Garmin Fenix 9 Pro: price, specs and features compared</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-variable-aperture-camera-explained-heres-what-it-actually-does</link>
                                                                            <description>
                            <![CDATA[ By adding a variable aperture to the 48MP main camera, the iPhone 18 Pro and Pro Max give shooters new creative ways to capture and more control of the light. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NUmfzrPHRonaei6JAcV5w9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HYuuDMJ2Ch2YMUKD2MbYWc-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 04:30:00 +0000</pubDate>                                                                                                                                <updated>Mon, 14 Sep 2026 08:47:18 +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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HYuuDMJ2Ch2YMUKD2MbYWc-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro cameras]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro cameras]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro cameras]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HYuuDMJ2Ch2YMUKD2MbYWc-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Every major iPhone camera upgrade over the past decade has followed a familiar playbook: larger sensors, higher megapixel counts, and heavier doses of computational photography. With the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">iPhone 18 Pro and iPhone 18 Pro Max</a>, Apple is introducing something entirely mechanical that aims to give photographers more creative control than ever before: a variable aperture camera.</p><p>To be fair, Apple isn't the first to embrace this technology. Samsung introduced a dual-aperture system on the <a href="https://www.tomsguide.com/us/galaxy-s9-s9-plus,review-5198.html">Galaxy S9</a> and <a href="https://www.tomsguide.com/us/samsung-galaxy-s10,review-6279.html">S10</a> as far back as 2018, while more recent flagships like the Huawei Mate 50 Pro and <a href="https://www.tomsguide.com/phones/android-phones/xiaomi-14-ultra-sounds-like-an-ultra-impressive-phone-especially-in-the-camera-department">Xiaomi 14 Ultra</a> have considerably refined how multi-stop mechanisms function. But for the very first time on an iPhone, the primary camera features a true, physical variable aperture system.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/BZi0R_thP9M" allowfullscreen></iframe></div></div><p>Enthusiasts and pros already understand how an <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-i-asked-3-pro-photographers-what-they-really-think-of-a-variable-aperture-camera">adjustable aperture elevates their shooting</a>, but everyday users will find Apple’s automated implementation and simplified controls far more approachable. I’ll break down what the iPhone 18 Pro's variable aperture actually does, the physics behind it, and why it represents one of the most substantial leaps for iPhone photography in years.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-variable-aperture-camera-how-it-works"><span>iPhone 18 Pro Max variable aperture camera: How it works</span></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="dwK9C9bzHe8Bqt6sMrUca" name="iPhone 18 Pro Max variable aperture camera.GIF" alt="iPhone 18 Pro Max variable aperture camera." src="https://cdn.mos.cms.futurecdn.net/dwK9C9bzHe8Bqt6sMrUca-1920-80.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: Apple)</span></figcaption></figure><p>Think of a camera’s aperture much like the pupil of your eye — dilating (opening up) to draw in light when it's dark and contracting (closing down) when the scene is bright. While the iPhone 18 Pro Max's 48MP ultrawide and telephoto lenses keep traditional fixed apertures, the 48MP main Fusion camera introduces a motorized, multi-blade mechanical iris built directly into the lens barrel.</p><p>This mechanism physically shifts those ultra-thin aperture blades to control precisely how much light hits the sensor. Shooters have a total of four distinct aperture values to choose from: f/1.48, f/1.8, f/2.8, and f/4.0.</p><p>Ultimately, choosing the right aperture boils down to your shooting conditions and the specific aesthetic you’re after.</p><h2 class="article-body__section" id="section-iphone-18-pro-max-variable-aperture-camera-what-it-can-do"><span>iPhone 18 Pro Max variable aperture camera: What it can do</span></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="9GCbUtdmqto6e9mrgX2BJo" name="iPhone 18 Pro Max variable aperture" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/9GCbUtdmqto6e9mrgX2BJo-1920-80.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>While f-stop values can feel intimidating to the uninitiated, Apple does a great job illustrating the tangible benefits of a variable aperture through everyday shooting scenarios. Having physical control over the lens fundamentally shifts the iPhone’s image capture across several key areas.</p><h3 class="article-body__section" id="section-natural-background-blur"><span>Natural background blur</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:980px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="djXDXz2SYCbRR9b6jrSZMS" name="iPhone 18 Pro Max variable aperture camera" alt="iPhone 18 Pro Max variable aperture camera sample." src="https://cdn.mos.cms.futurecdn.net/djXDXz2SYCbRR9b6jrSZMS-1920-80.jpg" mos="" align="middle" fullscreen="" width="980" height="735" 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>Opening the blades wide to f/1.48 yields authentic optical bokeh. Because the physical lens optics and large sensor are doing the heavy lifting, background separation increases naturally the closer you get to your subject — making it ideal for portraits and close-up detail shots.</p><p>While the iPhone has long offered Portrait Mode, that feature relies heavily on computational algorithms to simulate depth. With the 18 Pro Max, you get genuine optical falloff and creamy defocus without the botched edge-detection or digital processing.</p><h3 class="article-body__section" id="section-sharp-focus-throughout-the-frame"><span>Sharp focus throughout the frame</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:980px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="epeGySCB2snjq3PFqttyMS" name="iPhone 18 Pro Max variable aperture camera" alt="iPhone 18 Pro Max variable aperture camera sample." src="https://cdn.mos.cms.futurecdn.net/epeGySCB2snjq3PFqttyMS-1920-80.jpg" mos="" align="middle" fullscreen="" width="980" height="735" 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>Stopping down to f/4.0 expands your depth of field considerably, ensuring corner-to-corner sharpness across the entire frame. This is a setting you'll want to lean on for sweeping landscapes, architecture, and group shots.</p><p>If you shoot a staggered group at a fast aperture like f/1.48, someone standing in the front row might be sharp while family members two rows back appear softly blurred. Stopping down to f/4.0 deepens the focus plane so every face in the frame remains crisp and clear.</p><h3 class="article-body__section" id="section-creating-intentional-motion-blur"><span>Creating intentional motion blur</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:980px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="UzVRQ3sEbBv3P7Rn8yLVMS" name="iPhone 18 Pro Max variable aperture camera" alt="iPhone 18 Pro Max variable aperture camera sample." src="https://cdn.mos.cms.futurecdn.net/UzVRQ3sEbBv3P7Rn8yLVMS-1920-80.jpg" mos="" align="middle" fullscreen="" width="980" height="735" 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 bright daylight, traditional fixed-aperture phones are forced to use ultra-fast shutter speeds, which freezes all motion. If you want a more dynamic feel, stopping down to f/4.0 restricts incoming light. That drop in exposure allows the camera to lengthen the shutter speed without blowing out the highlights.</p><p>The result is intentional motion blur. Apple demonstrated this with a stationary model standing sharp in the center of the frame with pedestrians blurred smoothly around them. That same principle lets you capture light trails from passing car headlights or render rushing waterfalls as silky, continuous streams.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ozn90O"></div>                            </div>                            <script src="https://kwizly.com/embed/Ozn90O.js" async></script><h3 class="article-body__section" id="section-improving-low-light-performance"><span>Improving low-light performance</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:980px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="9FtxQUWQJpAWHfeYkQorGS" name="iPhone 18 Pro Max variable aperture camera" alt="iPhone 18 Pro Max variable aperture camera sample." src="https://cdn.mos.cms.futurecdn.net/9FtxQUWQJpAWHfeYkQorGS-1920-80.jpg" mos="" align="middle" fullscreen="" width="980" height="735" 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 iPhone 18 Pro and Pro Max hold a clear hardware advantage in dark environments thanks to that wide f/1.48 opening. Retracting the aperture blades floods the 48MP sensor with maximum light, which suppresses image noise, preserves fine shadow detail, and allows the shutter to fire significantly faster.</p><p>In practice, this leads to shorter Night mode exposure times, drastically cutting down the risk of handheld micro-jitters blurring your low-light shots.</p><h3 class="article-body__section" id="section-freeze-framing-fast-moving-subjects"><span>Freeze framing fast-moving subjects</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:70.59%;"><img id="LDiNfuMAcpQ3JBvohZh9Dc" name="motion-scooter-Shutter-speed.jpg" alt="Shooting subjects in motion using iPhone 16 Pro Max" src="https://cdn.mos.cms.futurecdn.net/LDiNfuMAcpQ3JBvohZh9Dc-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2560" height="1807" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/LDiNfuMAcpQ3JBvohZh9Dc-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>By pulling in vastly more light at f/1.48, the camera system can afford to push shutter speeds to tiny fractions of a second without producing a dark, underexposed image. This rapid exposure freezes jumpy pets, sprinting kids, and fast-paced sports action super sharp before motion blur can creep into the frame.</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/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo">I interviewed Apple CEO John Ternus on the making of the iPhone Duo — here's what made him say 'yes, that's it'</a></li><li><a href="https://www.tomsguide.com/ai/apple-intelligence/people-are-freaking-out-about-the-new-always-listening-apple-watches-heres-what-apple-ceo-john-ternus-told-us">People are freaking out about the new 'always-listening' Apple Watches — here's what Apple CEO John Ternus told us</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-vs-garmin-fenix-9-pro-price-specs-and-features-compared">Apple Watch Ultra 4 vs Garmin Fenix 9 Pro: price, specs and features compared</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone 18 Pro Exclusive: Apple CEO John Ternus on why the new variable aperture camera is the ‘best of both worlds’ ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Sure, the foldable iPhone Duo is getting all of the buzz, but you shouldn’t overlook the new iPhone 18 Pro and iPhone 18 Pro Max — especially if you want the highest quality cameras.</p><p>Not only does the iPhone Duo lack the telephoto zoom lens on the iPhone 18 Pros; it also doesn’t get the brand new variable aperture main camera. There are laser-cut blades in the lens of the 48MP main cameras on the iPhone 18 Pro and Pro Max that move to let in more or less light depending on the conditions.</p><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://cdn.mos.cms.futurecdn.net/bcVAaKE9MWrVzyNKw3oD5D/iPhone%2018%20Pro%20Aperture%203.mp4" autoplay loop muted playsinline src="https://cdn.mos.cms.futurecdn.net/bcVAaKE9MWrVzyNKw3oD5D/iPhone%2018%20Pro%20Aperture%203.mp4"></video></div><p>The goal? Better-looking photos without lifting a finger, as well as unprecedented creative control for those who want it through new Pro camera controls.</p><p>“Variable aperture is an amazing technology,” Apple CEO John Ternus told me in an interview with Tom’s Guide and TechRadar. “We have these tiny little blades. There's six of them in there, and they can open and contract. And when you open the aperture, you let in more light, so you end up with better low-light photography.”</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:2560px;"><p class="vanilla-image-block" style="padding-top:33.28%;"><img id="5erFrPqJLvK6iL7L8U7ivK" name="Apple-feature-PQ_Ternus3" alt="Quote from Apple CEO John Ternus" src="https://cdn.mos.cms.futurecdn.net/5erFrPqJLvK6iL7L8U7ivK-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="852" 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 are four aperture settings that the camera chooses from: f/1.48, f/1.8, f/2.8 and f/4.0. For example, if you take a portrait, the iPhone 18 Pro might select f/1.48, which lets in the most amount of light and creates a background blur.</p><p>And if you’re taking a photo where you want the same amount of sharpness throughout the shot — say a family group shot — the iPhone 18 Pro might pick f/4.0. At this setting, the blades close down to the smallest setting, delivering maximum depth of field.</p><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://cdn.mos.cms.futurecdn.net/JLdQRyVyfdjTuU5gfEXQsM/iPhone%2018%20Pro%20Aperture%201.mp4" autoplay loop muted playsinline src="https://cdn.mos.cms.futurecdn.net/JLdQRyVyfdjTuU5gfEXQsM/iPhone%2018%20Pro%20Aperture%201.mp4"></video></div><p>“When you're taking a group shot, the ability to make sure that the person in front is in focus and the person in back is in focus is really powerful,” Ternus said.</p><p>For photo enthusiasts and creative pros, the iPhone 18 Pro and Pro Max offer Pro controls for the first time. This allows you to manually select one of the four aperture settings on the fly.</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="ikngBPdhzFZLTfupTVcdi8" name="iPhone 18 Pro Variable Aperture-3" alt="iPhone 18 Pro shown in hand" src="https://cdn.mos.cms.futurecdn.net/ikngBPdhzFZLTfupTVcdi8-1920-80.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>For example, say you were in a swanky club. You could focus on the drink glass in front of me with a blur effect with f/1.48 or the person sitting across the table and the glass with f/4.0.</p><p>“We have these pro controls now where someone who really understands photography and really loves photography, they can get in there and manually adjust the aperture and the shutter speed, even the the focus — all of these things that that our real pro photographers love,” Ternus said.</p><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://cdn.mos.cms.futurecdn.net/qQMWZGYtCvZJhcdDWSpHCZ/iPhone%2018%20Pro%20variable%20aperture%202.mp4" autoplay loop muted playsinline src="https://cdn.mos.cms.futurecdn.net/qQMWZGYtCvZJhcdDWSpHCZ/iPhone%2018%20Pro%20variable%20aperture%202.mp4"></video></div><p>You can also get creative with the various settings depending on the subject, such as accentuating point light sources with a smaller f/2.8 or f/4.0 setting. This can create a compelling stardust effect in your final shot. </p><p>Other Pro controls include shutter speed and white balance, the kinds of settings that used to be reserved for third-party apps like Halide.</p><p>“It's kind of the best of both worlds. You can choose not to think about it, or you can go really deep into it,” Ternus said.</p><p>Stay tuned for our full review on the iPhone 18 Pro and Pro Max, which will include plenty of test shots with the variable aperture camera.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-18-pro-exclusive-apple-ceo-john-ternus-variable-aperture-camera</link>
                                                                            <description>
                            <![CDATA[ The iPhone 18 Pro and Pro Max offer a variable aperture camera for the first time. Apple CEO John Ternus breaks down the technology and how it will make your photos better. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4rJFW8TFnS73daErJLXotC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Mqctch4dD3YKVpSxFBrEpC-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 10:45:00 +0000</pubDate>                                                                                                                                                                                                                                <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-320-70.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;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. &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. &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>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Mqctch4dD3YKVpSxFBrEpC-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro and Apple CEO John Ternus]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro and Apple CEO John Ternus]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro and Apple CEO John Ternus]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Mqctch4dD3YKVpSxFBrEpC-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Sure, the foldable iPhone Duo is getting all of the buzz, but you shouldn’t overlook the new iPhone 18 Pro and iPhone 18 Pro Max — especially if you want the highest quality cameras.</p><p>Not only does the iPhone Duo lack the telephoto zoom lens on the iPhone 18 Pros; it also doesn’t get the brand new variable aperture main camera. There are laser-cut blades in the lens of the 48MP main cameras on the iPhone 18 Pro and Pro Max that move to let in more or less light depending on the conditions.</p><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://cdn.mos.cms.futurecdn.net/bcVAaKE9MWrVzyNKw3oD5D/iPhone%2018%20Pro%20Aperture%203.mp4" autoplay loop muted playsinline src="https://cdn.mos.cms.futurecdn.net/bcVAaKE9MWrVzyNKw3oD5D/iPhone%2018%20Pro%20Aperture%203.mp4"></video></div><p>The goal? Better-looking photos without lifting a finger, as well as unprecedented creative control for those who want it through new Pro camera controls.</p><p>“Variable aperture is an amazing technology,” Apple CEO John Ternus told me in an interview with Tom’s Guide and TechRadar. “We have these tiny little blades. There's six of them in there, and they can open and contract. And when you open the aperture, you let in more light, so you end up with better low-light photography.”</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:2560px;"><p class="vanilla-image-block" style="padding-top:33.28%;"><img id="5erFrPqJLvK6iL7L8U7ivK" name="Apple-feature-PQ_Ternus3" alt="Quote from Apple CEO John Ternus" src="https://cdn.mos.cms.futurecdn.net/5erFrPqJLvK6iL7L8U7ivK-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="852" 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 are four aperture settings that the camera chooses from: f/1.48, f/1.8, f/2.8 and f/4.0. For example, if you take a portrait, the iPhone 18 Pro might select f/1.48, which lets in the most amount of light and creates a background blur.</p><p>And if you’re taking a photo where you want the same amount of sharpness throughout the shot — say a family group shot — the iPhone 18 Pro might pick f/4.0. At this setting, the blades close down to the smallest setting, delivering maximum depth of field.</p><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://cdn.mos.cms.futurecdn.net/JLdQRyVyfdjTuU5gfEXQsM/iPhone%2018%20Pro%20Aperture%201.mp4" autoplay loop muted playsinline src="https://cdn.mos.cms.futurecdn.net/JLdQRyVyfdjTuU5gfEXQsM/iPhone%2018%20Pro%20Aperture%201.mp4"></video></div><p>“When you're taking a group shot, the ability to make sure that the person in front is in focus and the person in back is in focus is really powerful,” Ternus said.</p><p>For photo enthusiasts and creative pros, the iPhone 18 Pro and Pro Max offer Pro controls for the first time. This allows you to manually select one of the four aperture settings on the fly.</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="ikngBPdhzFZLTfupTVcdi8" name="iPhone 18 Pro Variable Aperture-3" alt="iPhone 18 Pro shown in hand" src="https://cdn.mos.cms.futurecdn.net/ikngBPdhzFZLTfupTVcdi8-1920-80.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>For example, say you were in a swanky club. You could focus on the drink glass in front of me with a blur effect with f/1.48 or the person sitting across the table and the glass with f/4.0.</p><p>“We have these pro controls now where someone who really understands photography and really loves photography, they can get in there and manually adjust the aperture and the shutter speed, even the the focus — all of these things that that our real pro photographers love,” Ternus said.</p><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://cdn.mos.cms.futurecdn.net/qQMWZGYtCvZJhcdDWSpHCZ/iPhone%2018%20Pro%20variable%20aperture%202.mp4" autoplay loop muted playsinline src="https://cdn.mos.cms.futurecdn.net/qQMWZGYtCvZJhcdDWSpHCZ/iPhone%2018%20Pro%20variable%20aperture%202.mp4"></video></div><p>You can also get creative with the various settings depending on the subject, such as accentuating point light sources with a smaller f/2.8 or f/4.0 setting. This can create a compelling stardust effect in your final shot. </p><p>Other Pro controls include shutter speed and white balance, the kinds of settings that used to be reserved for third-party apps like Halide.</p><p>“It's kind of the best of both worlds. You can choose not to think about it, or you can go really deep into it,” Ternus said.</p><p>Stay tuned for our full review on the iPhone 18 Pro and Pro Max, which will include plenty of test shots with the variable aperture camera.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Duo vs. iPhone 18 Pro Max: Here’s what a $700 difference in price gets you ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This year’s <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhone</a> debate is generating more interest than in years past because, for the first time ever, there’s a model priced above the Pro Max. That’s why I’m breaking down this <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> vs. <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">iPhone 18 Pro Max </a>face-off to highlight their strengths and weaknesses before you make a final decision on which one to grab.</p><p>Apple’s first foldable phone represents the boldest hardware redesign in the iPhone’s history — far more than the previous <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air</a> in my opinion — but that added flexibility comes at an eye-watering premium. It costs roughly $700 more than an already steep iPhone 18 Pro Max, which itself received a $100 price hike that brings its starting cost to $1,299.</p><p>That massive difference creates a dilemma Apple fans haven’t had to face before. Ultimately, the question boils down to choosing between the allure of an iPad mini in your pocket for serious productivity, or sticking with a tried-and-true slab flagship that still delivers the most uncompromising smartphone experience your money can buy.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/2qNfOa5AuVU" allowfullscreen></iframe></div></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2EK0e"></div>                            </div>                            <script src="https://kwizly.com/embed/W2EK0e.js" async></script><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-specifications"><span>iPhone Duo vs. iPhone 18 Pro Max: Specifications</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>iPhone Duo</strong></p></th><th  ><p>iPhone 18 Pro Max</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $1,999 / AU$3,499</p></td><td  ><p>From $1,299 / AU$2,299</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>7.6-inch Super Retina XDR (1,878 x 2,670)</p></td><td  ><p>6.9-inch Super Retina XDR display (2,868 x 1,320)</p></td></tr><tr><td class="firstcol " ><p><strong>Outer Display</strong></p></td><td  ><p>5.4-inch Super Retina XDR (1,398 x 2,034)</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>A20 Pro</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Front Cameras</strong></p></td><td  ><p>12MP Center Stage outer (ƒ/2.2), 1080p under-display FaceTime inner camera (f/1.8)</p></td><td  ><p>18MP Center Stage camera (f/1.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>48MP main (f/1.6), 48MP ultrawide (f/2.2)</p></td><td  ><p>48MP main with variable aperture (f/1.48, f/1.8, f/2.8, f/4), 48MP ultrawide (f/2.2), 48MP telephoto w/4x optical zoom (f/2.8)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life Video Playback</strong></p></td><td  ><p>Up to 44 hours when using the outer display, up to 31 hours when using the inner display</p></td><td  ><p>Up to 45 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.48 x 4.64 x 0.21 inches open (164.6 x 117.8 x 5.2mm), 3.31 x 4.64 x 0.44 inches closed (84.1 x 117.8 x 11.3mm)</p></td><td  ><p>6.43 x 3.07 x 0.34 inches (163.4 x 78.0 x 8.75 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.96 ounces (254 grams)</p></td><td  ><p>8.78 ounces (249 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP68</p></td><td  ><p>IP68</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Night Sky, Star White</p></td><td  ><p>Black, Silver, Glacier, Burgundy</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-price-and-release"><span>iPhone Duo vs. iPhone 18 Pro Max: Price and release</span></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="TUHKFKjf3sxjBNZKbzJu8o" name="iPhone 18 Pro colors" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/TUHKFKjf3sxjBNZKbzJu8o-1920-80.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>You’ll be able to place a <a href="https://www.tomsguide.com/phones/iphones/avoid-that-usd100-price-hike-how-to-save-up-to-usd885-on-your-iphone-18-pro-preorder">pre-order for the iPhone 18 Pro Max</a> first starting on September 12, with an official release date set for September 18. With the iPhone Duo, pre-orders will be available starting later on October 16 — and will subsequently release on October 23.</p><p>I already know the financial strain of buying any of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a> around, but despite getting a $100 increase, the iPhone 18 Pro Max still has the lower out-of-pocket expense at $1,299 for a 256GB model. The iPhone Duo, on the other hand, sits higher and requires an additional $700 to reach its $1,999 starting cost. </p><p>From a pure value and cost perspective, the iPhone 18 Pro Max remains the much easier recommendation. Even with its slight price hike, paying $1,299 for Apple’s premier slab flagship feels far more justifiable for most people.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-design-and-display"><span>iPhone Duo vs. iPhone 18 Pro Max: Design and display</span></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="6N7PRoZ922V5VYKySqDu7o" name="iPhone 18 Pro back burgundy" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/6N7PRoZ922V5VYKySqDu7o-1920-80.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 hasn’t changed the look of the iPhone 18 Pro Max all that much, largely carrying over the design of its predecessor — though it's now available in four distinct finishes. If there’s one thing I’m certain about, it’s that Apple has locked down the recipe for designing rock-solid flagships.</p><p>From a functional standpoint, however, the iPhone Duo has its advantages. Its narrower footprint when folded makes it noticeably easier to use one-handed. Reaching the top corners of the outer cover screen with a thumb is a breeze, whereas on the iPhone 18 Pro Max, doing so requires some serious maneuvers for most hand sizes.</p><p>Apple’s engineering prowess is on full display with the Duo, which features a refined build that addresses several common complaints I have about rival foldables. Most notably, Apple engineers a hinge mechanism that renders the inner crease practically undetectable when gliding a finger across the screen. Still, it’s the Duo’s ergonomics when opened that truly stand out.</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="JrD6iXGJ4HLagJrgBA8YGa" name="iphone duo edit 7" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/JrD6iXGJ4HLagJrgBA8YGa-1920-80.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>Its expansive 7.6-inch main display provides significantly more canvas to enjoy apps and content. Whether streaming full-screen video on YouTube or running two apps side-by-side, the Duo’s interior screen is far more adaptable to multi-tasking. That’s not to say the iPhone 18 Pro Max’s 6.9-inch panel isn't capable, but once you experience apps optimized to leverage that tablet-sized workspace, it’s tough to go back.</p><p>Even so, I still have a few reservations about both displays that will only be settled once we run them through our lab benchmarks. For instance, while the Duo’s nano-texture layer helps minimize reflections and gives the folding panel a smooth, glass-like finish, I wonder if it softens contrast or peaks at a lower nit rating than standard panels. That's a compromise you won’t have to worry about on the iPhone 18 Pro Max.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-cameras"><span>iPhone Duo vs. iPhone 18 Pro Max: Cameras</span></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="PsAoKzRkrmCg46aQ53ywDo" name="iPhone 18 Pro Max silver" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/PsAoKzRkrmCg46aQ53ywDo-1920-80.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>Don’t get me wrong: both phones easily cater to casual shooters. But for anyone who takes photography as seriously as I do, the iPhone 18 Pro Max remains my clear recommendation. That’s because its triple 48MP camera setup brings a few welcome surprises, headlined by a new variable aperture system that gives photographers more creative control. Whether you want to isolate a portrait with natural optical bokeh or stop down to keep a wide scene tack-sharp, having physical control over the aperture is most helpful to those who want to elevate their photography.</p><p>If that’s not enough, the iPhone 18 Pro Max finally delivers the pro-grade toolkit I've spent years asking for. In addition to manual control via the native Pro Controls interface, it fully supports ProRAW, Apple Log recording, and immersive spatial photos and video. It's a genuine powerhouse engineered for serious, uncompromising content creation.</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="SoAi2j7o9Dqs6v288A4cEa" name="iPhone Duo edit 3" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/SoAi2j7o9Dqs6v288A4cEa-1920-80.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 iPhone Duo approaches shooting from a completely different angle, albeit with its own set of trade-offs. Its dual 48MP array feels tailor-made for modern content creators. Thanks to its folding hinge, you can prop the phone on virtually any flat surface for rock-steady, hands-free shooting without packing a tripod. Better yet, being able to use the outer cover screen as a live preview monitor makes capturing framing-perfect selfies and vlogs with the primary sensors effortless.</p><p>It’s an undeniably brilliant setup for solo creators on the move, but omitting a dedicated telephoto camera inherently limits its range for power users demanding maximum optical flexibility right out of the box.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-performance-and-battery"><span>iPhone Duo vs. iPhone 18 Pro Max: Performance and battery</span></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="CN7RzmKPJyev7oUAf2fdFa" name="iPhone duo gaming" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/CN7RzmKPJyev7oUAf2fdFa-1920-80.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>Both phones are powered by Apple’s next-gen silicon, the A20 Pro chip, built on an ultra-dense 2-nanometer process. Based on our early hands-on time, this new silicon effortlessly powers through demanding workloads, whether you're juggling multi-window productivity tasks or pushing maximum visual settings.</p><p>The iPhone Duo handles graphically intensive titles with ease thanks to a custom vapor chamber designed specifically for its folding chassis — and games look stunning on that expansive inner main display. However, the iPhone 18 Pro Max features an upgraded vapor chamber that is not only larger than its predecessor's, but also reportedly yields a 40% boost in sustained thermal performance.</p><p>While benchmark testing will reveal the real-world gap, I'd give the early performance edge to the iPhone 18 Pro Max simply because driving its single 6.9-inch panel requires rendering far fewer pixels.</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="cTmx5d63stEFmgKNszEyDo" name="iPhone 18 Pro Max gameplay" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/cTmx5d63stEFmgKNszEyDo-1920-80.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>Battery endurance is another critical battleground. Because the iPhone Duo powers two separate screens — including that massive 7.6-inch interior one — it comes as no surprise that Apple rates its endurance slightly below the 18 Pro Max. Video playback on the Duo's main panel is rated for up to 44 hours, while the iPhone 18 Pro Max stretches slightly further at 45 hours.</p><p>Charging specs remain closely matched across the board. Both devices support 25W wireless charging over MagSafe. While Apple still avoids advertising maximum wired wattage caps, both handsets are rated to recoup up to a 50% charge in approximately 30 minutes when paired with an official 35W power adapter.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-software-and-ai"><span>iPhone Duo vs. iPhone 18 Pro Max: Software and AI</span></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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.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>Fundamentally, both phones run <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a> right out of the box, meaning they have access to the exact same suite of <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">Apple Intelligence</a> and <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> features I’ve been testing throughout the betas. The primary divergence between their software experiences comes down to form factor: the Duo leverages its foldable design to unlock multitasking capabilities previously unseen on any iPhone.</p><p>Juggling multiple applications is no longer a chore thanks to true split-screen multitasking. Everyday workflows — like dragging and dropping files between windows or copying text across active screens — feel far more intuitive than constantly app-switching on the iPhone 18 Pro Max.</p><p>What’s even more encouraging is how smoothly the Duo handles software handoffs, with apps dynamically scaling and reflowing as you transition between the outer cover screen and the main folding canvas. That level of flexibility adds a distinct layer of utility and noticeably raises the bar for mobile computing. If these fluid transitions and layout optimizations quickly trickle down to a broader range of third-party apps, it’ll give the iPhone Duo a serious boost in convincing power users that its $700 premium is truly justified.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-outlook"><span>iPhone Duo vs. iPhone 18 Pro Max: Outlook</span></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="XEnBSEb3MMRqFRw7NPesBo" name="iPhone 18 Pro Max front" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/XEnBSEb3MMRqFRw7NPesBo-1920-80.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 are still too many unknowns to declare a definitive winner in this iPhone Duo vs. iPhone 18 Pro Max showdown. While Apple has clearly laid a solid foundation to kick off its foldable ambitions, I’m still cautious about pulling the trigger — especially when a $1,999 price tag still forces you to compromise on a dedicated telephoto camera and the pro-grade creative controls found on the iPhone 18 Pro Max.</p><p>Furthermore, Apple deserves credit for ensuring iOS 27 apps transition seamlessly between the Duo’s screens and orientations. But for users who rarely juggle split-screen workflows and are perfectly fine with standard app switching, there's little incentive to make that leap.</p><p>Until our full lab tests and real-world battery benchmarks are complete, the iPhone 18 Pro Max remains the safer, more well-rounded recommendation. The iPhone Duo offers a captivating preview of Apple's computing future, but right now, that extra $700 primarily buys you novelty and screen space over pure hardware utility.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eGbxVX"></div>                            </div>                            <script src="https://kwizly.com/embed/eGbxVX.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><strong></strong><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"><strong>iPhone Duo hands-on: Apple nailed it — and just put everyone else on notice</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news"><strong>Apple Event recap — Hands-on with the iPhone Duo and all the big announcements</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/apples-just-extended-free-access-to-emergency-satellite-communication-for-another-year-its-the-third-time-this-has-happened"><strong>Apple's just extended free access to emergency satellite communication for another year — it's the third time this has happened</strong></a><strong></strong></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=iPhones&rows=4&view_mode=savings_squad&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=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');                    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);          const showHeaderDetails = params.get('show_header_details') !== 'false';          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' && showHeaderDetails) ? '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, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta: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 finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        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.getRowsLimit();                    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 siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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=${siteParam}&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 siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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 = this.decodeHTML(description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim());                summaryTitle = this.decodeHTML(summaryTitle);                                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.getFilteredDeals().slice(0, this.displayLimit), 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');                    url.searchParams.append('rows', this.getRowsLimit().toString());          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.getFilteredDeals().slice(0, this.displayLimit), 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 = this.getRowsLimit();          // 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.getFilteredDeals().slice(0, this.displayLimit), 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: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(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 finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \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)}" ${dataAttr} 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; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \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');            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 += this.getRowsLimit();              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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-duo-vs-iphone-18-pro-max-heres-what-a-usd700-difference-in-price-gets-you</link>
                                                                            <description>
                            <![CDATA[ They're separated by $700, but there's way more to it than just pricing to justify an iPhone Duo vs. iPhone 18 Pro Max winner. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kRDDNPqRYquc356G8A3DcF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wRdNsfx5snDKH2hTaAqsB8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 07: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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/wRdNsfx5snDKH2hTaAqsB8-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Duo vs iPhone 18 Pro Max.]]></media:description>                                                            <media:text><![CDATA[iPhone Duo vs iPhone 18 Pro Max.]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Duo vs iPhone 18 Pro Max.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wRdNsfx5snDKH2hTaAqsB8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This year’s <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhone</a> debate is generating more interest than in years past because, for the first time ever, there’s a model priced above the Pro Max. That’s why I’m breaking down this <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> vs. <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">iPhone 18 Pro Max </a>face-off to highlight their strengths and weaknesses before you make a final decision on which one to grab.</p><p>Apple’s first foldable phone represents the boldest hardware redesign in the iPhone’s history — far more than the previous <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air</a> in my opinion — but that added flexibility comes at an eye-watering premium. It costs roughly $700 more than an already steep iPhone 18 Pro Max, which itself received a $100 price hike that brings its starting cost to $1,299.</p><p>That massive difference creates a dilemma Apple fans haven’t had to face before. Ultimately, the question boils down to choosing between the allure of an iPad mini in your pocket for serious productivity, or sticking with a tried-and-true slab flagship that still delivers the most uncompromising smartphone experience your money can buy.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/2qNfOa5AuVU" allowfullscreen></iframe></div></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2EK0e"></div>                            </div>                            <script src="https://kwizly.com/embed/W2EK0e.js" async></script><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-specifications"><span>iPhone Duo vs. iPhone 18 Pro Max: Specifications</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>iPhone Duo</strong></p></th><th  ><p>iPhone 18 Pro Max</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $1,999 / AU$3,499</p></td><td  ><p>From $1,299 / AU$2,299</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>7.6-inch Super Retina XDR (1,878 x 2,670)</p></td><td  ><p>6.9-inch Super Retina XDR display (2,868 x 1,320)</p></td></tr><tr><td class="firstcol " ><p><strong>Outer Display</strong></p></td><td  ><p>5.4-inch Super Retina XDR (1,398 x 2,034)</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>A20 Pro</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Front Cameras</strong></p></td><td  ><p>12MP Center Stage outer (ƒ/2.2), 1080p under-display FaceTime inner camera (f/1.8)</p></td><td  ><p>18MP Center Stage camera (f/1.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>48MP main (f/1.6), 48MP ultrawide (f/2.2)</p></td><td  ><p>48MP main with variable aperture (f/1.48, f/1.8, f/2.8, f/4), 48MP ultrawide (f/2.2), 48MP telephoto w/4x optical zoom (f/2.8)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life Video Playback</strong></p></td><td  ><p>Up to 44 hours when using the outer display, up to 31 hours when using the inner display</p></td><td  ><p>Up to 45 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.48 x 4.64 x 0.21 inches open (164.6 x 117.8 x 5.2mm), 3.31 x 4.64 x 0.44 inches closed (84.1 x 117.8 x 11.3mm)</p></td><td  ><p>6.43 x 3.07 x 0.34 inches (163.4 x 78.0 x 8.75 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.96 ounces (254 grams)</p></td><td  ><p>8.78 ounces (249 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP68</p></td><td  ><p>IP68</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Night Sky, Star White</p></td><td  ><p>Black, Silver, Glacier, Burgundy</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-price-and-release"><span>iPhone Duo vs. iPhone 18 Pro Max: Price and release</span></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="TUHKFKjf3sxjBNZKbzJu8o" name="iPhone 18 Pro colors" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/TUHKFKjf3sxjBNZKbzJu8o-1920-80.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>You’ll be able to place a <a href="https://www.tomsguide.com/phones/iphones/avoid-that-usd100-price-hike-how-to-save-up-to-usd885-on-your-iphone-18-pro-preorder">pre-order for the iPhone 18 Pro Max</a> first starting on September 12, with an official release date set for September 18. With the iPhone Duo, pre-orders will be available starting later on October 16 — and will subsequently release on October 23.</p><p>I already know the financial strain of buying any of the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a> around, but despite getting a $100 increase, the iPhone 18 Pro Max still has the lower out-of-pocket expense at $1,299 for a 256GB model. The iPhone Duo, on the other hand, sits higher and requires an additional $700 to reach its $1,999 starting cost. </p><p>From a pure value and cost perspective, the iPhone 18 Pro Max remains the much easier recommendation. Even with its slight price hike, paying $1,299 for Apple’s premier slab flagship feels far more justifiable for most people.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-design-and-display"><span>iPhone Duo vs. iPhone 18 Pro Max: Design and display</span></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="6N7PRoZ922V5VYKySqDu7o" name="iPhone 18 Pro back burgundy" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/6N7PRoZ922V5VYKySqDu7o-1920-80.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 hasn’t changed the look of the iPhone 18 Pro Max all that much, largely carrying over the design of its predecessor — though it's now available in four distinct finishes. If there’s one thing I’m certain about, it’s that Apple has locked down the recipe for designing rock-solid flagships.</p><p>From a functional standpoint, however, the iPhone Duo has its advantages. Its narrower footprint when folded makes it noticeably easier to use one-handed. Reaching the top corners of the outer cover screen with a thumb is a breeze, whereas on the iPhone 18 Pro Max, doing so requires some serious maneuvers for most hand sizes.</p><p>Apple’s engineering prowess is on full display with the Duo, which features a refined build that addresses several common complaints I have about rival foldables. Most notably, Apple engineers a hinge mechanism that renders the inner crease practically undetectable when gliding a finger across the screen. Still, it’s the Duo’s ergonomics when opened that truly stand out.</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="JrD6iXGJ4HLagJrgBA8YGa" name="iphone duo edit 7" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/JrD6iXGJ4HLagJrgBA8YGa-1920-80.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>Its expansive 7.6-inch main display provides significantly more canvas to enjoy apps and content. Whether streaming full-screen video on YouTube or running two apps side-by-side, the Duo’s interior screen is far more adaptable to multi-tasking. That’s not to say the iPhone 18 Pro Max’s 6.9-inch panel isn't capable, but once you experience apps optimized to leverage that tablet-sized workspace, it’s tough to go back.</p><p>Even so, I still have a few reservations about both displays that will only be settled once we run them through our lab benchmarks. For instance, while the Duo’s nano-texture layer helps minimize reflections and gives the folding panel a smooth, glass-like finish, I wonder if it softens contrast or peaks at a lower nit rating than standard panels. That's a compromise you won’t have to worry about on the iPhone 18 Pro Max.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-cameras"><span>iPhone Duo vs. iPhone 18 Pro Max: Cameras</span></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="PsAoKzRkrmCg46aQ53ywDo" name="iPhone 18 Pro Max silver" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/PsAoKzRkrmCg46aQ53ywDo-1920-80.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>Don’t get me wrong: both phones easily cater to casual shooters. But for anyone who takes photography as seriously as I do, the iPhone 18 Pro Max remains my clear recommendation. That’s because its triple 48MP camera setup brings a few welcome surprises, headlined by a new variable aperture system that gives photographers more creative control. Whether you want to isolate a portrait with natural optical bokeh or stop down to keep a wide scene tack-sharp, having physical control over the aperture is most helpful to those who want to elevate their photography.</p><p>If that’s not enough, the iPhone 18 Pro Max finally delivers the pro-grade toolkit I've spent years asking for. In addition to manual control via the native Pro Controls interface, it fully supports ProRAW, Apple Log recording, and immersive spatial photos and video. It's a genuine powerhouse engineered for serious, uncompromising content creation.</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="SoAi2j7o9Dqs6v288A4cEa" name="iPhone Duo edit 3" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/SoAi2j7o9Dqs6v288A4cEa-1920-80.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 iPhone Duo approaches shooting from a completely different angle, albeit with its own set of trade-offs. Its dual 48MP array feels tailor-made for modern content creators. Thanks to its folding hinge, you can prop the phone on virtually any flat surface for rock-steady, hands-free shooting without packing a tripod. Better yet, being able to use the outer cover screen as a live preview monitor makes capturing framing-perfect selfies and vlogs with the primary sensors effortless.</p><p>It’s an undeniably brilliant setup for solo creators on the move, but omitting a dedicated telephoto camera inherently limits its range for power users demanding maximum optical flexibility right out of the box.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-performance-and-battery"><span>iPhone Duo vs. iPhone 18 Pro Max: Performance and battery</span></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="CN7RzmKPJyev7oUAf2fdFa" name="iPhone duo gaming" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/CN7RzmKPJyev7oUAf2fdFa-1920-80.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>Both phones are powered by Apple’s next-gen silicon, the A20 Pro chip, built on an ultra-dense 2-nanometer process. Based on our early hands-on time, this new silicon effortlessly powers through demanding workloads, whether you're juggling multi-window productivity tasks or pushing maximum visual settings.</p><p>The iPhone Duo handles graphically intensive titles with ease thanks to a custom vapor chamber designed specifically for its folding chassis — and games look stunning on that expansive inner main display. However, the iPhone 18 Pro Max features an upgraded vapor chamber that is not only larger than its predecessor's, but also reportedly yields a 40% boost in sustained thermal performance.</p><p>While benchmark testing will reveal the real-world gap, I'd give the early performance edge to the iPhone 18 Pro Max simply because driving its single 6.9-inch panel requires rendering far fewer pixels.</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="cTmx5d63stEFmgKNszEyDo" name="iPhone 18 Pro Max gameplay" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/cTmx5d63stEFmgKNszEyDo-1920-80.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>Battery endurance is another critical battleground. Because the iPhone Duo powers two separate screens — including that massive 7.6-inch interior one — it comes as no surprise that Apple rates its endurance slightly below the 18 Pro Max. Video playback on the Duo's main panel is rated for up to 44 hours, while the iPhone 18 Pro Max stretches slightly further at 45 hours.</p><p>Charging specs remain closely matched across the board. Both devices support 25W wireless charging over MagSafe. While Apple still avoids advertising maximum wired wattage caps, both handsets are rated to recoup up to a 50% charge in approximately 30 minutes when paired with an official 35W power adapter.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-software-and-ai"><span>iPhone Duo vs. iPhone 18 Pro Max: Software and AI</span></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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.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>Fundamentally, both phones run <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a> right out of the box, meaning they have access to the exact same suite of <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">Apple Intelligence</a> and <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> features I’ve been testing throughout the betas. The primary divergence between their software experiences comes down to form factor: the Duo leverages its foldable design to unlock multitasking capabilities previously unseen on any iPhone.</p><p>Juggling multiple applications is no longer a chore thanks to true split-screen multitasking. Everyday workflows — like dragging and dropping files between windows or copying text across active screens — feel far more intuitive than constantly app-switching on the iPhone 18 Pro Max.</p><p>What’s even more encouraging is how smoothly the Duo handles software handoffs, with apps dynamically scaling and reflowing as you transition between the outer cover screen and the main folding canvas. That level of flexibility adds a distinct layer of utility and noticeably raises the bar for mobile computing. If these fluid transitions and layout optimizations quickly trickle down to a broader range of third-party apps, it’ll give the iPhone Duo a serious boost in convincing power users that its $700 premium is truly justified.</p><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-max-outlook"><span>iPhone Duo vs. iPhone 18 Pro Max: Outlook</span></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="XEnBSEb3MMRqFRw7NPesBo" name="iPhone 18 Pro Max front" alt="iPhone 18 Pro Max" src="https://cdn.mos.cms.futurecdn.net/XEnBSEb3MMRqFRw7NPesBo-1920-80.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 are still too many unknowns to declare a definitive winner in this iPhone Duo vs. iPhone 18 Pro Max showdown. While Apple has clearly laid a solid foundation to kick off its foldable ambitions, I’m still cautious about pulling the trigger — especially when a $1,999 price tag still forces you to compromise on a dedicated telephoto camera and the pro-grade creative controls found on the iPhone 18 Pro Max.</p><p>Furthermore, Apple deserves credit for ensuring iOS 27 apps transition seamlessly between the Duo’s screens and orientations. But for users who rarely juggle split-screen workflows and are perfectly fine with standard app switching, there's little incentive to make that leap.</p><p>Until our full lab tests and real-world battery benchmarks are complete, the iPhone 18 Pro Max remains the safer, more well-rounded recommendation. The iPhone Duo offers a captivating preview of Apple's computing future, but right now, that extra $700 primarily buys you novelty and screen space over pure hardware utility.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eGbxVX"></div>                            </div>                            <script src="https://kwizly.com/embed/eGbxVX.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><strong></strong><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"><strong>iPhone Duo hands-on: Apple nailed it — and just put everyone else on notice</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news"><strong>Apple Event recap — Hands-on with the iPhone Duo and all the big announcements</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/apples-just-extended-free-access-to-emergency-satellite-communication-for-another-year-its-the-third-time-this-has-happened"><strong>Apple's just extended free access to emergency satellite communication for another year — it's the third time this has happened</strong></a><strong></strong></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=iPhones&rows=4&view_mode=savings_squad&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=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');                    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);          const showHeaderDetails = params.get('show_header_details') !== 'false';          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' && showHeaderDetails) ? '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, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta: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 finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        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.getRowsLimit();                    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 siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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=${siteParam}&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 siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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 = this.decodeHTML(description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim());                summaryTitle = this.decodeHTML(summaryTitle);                                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.getFilteredDeals().slice(0, this.displayLimit), 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');                    url.searchParams.append('rows', this.getRowsLimit().toString());          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.getFilteredDeals().slice(0, this.displayLimit), 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 = this.getRowsLimit();          // 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.getFilteredDeals().slice(0, this.displayLimit), 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: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(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 finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \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)}" ${dataAttr} 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; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \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');            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 += this.getRowsLimit();              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 thought massage guns were just for athletes until I threw my back out — this one was a lifesaver ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">The Gadget Dad</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NTV2LD9mcUFrzpJd6R5YUU" name="Mike holding chainsaw" caption="" alt="Person holding chainsaw" src="https://cdn.mos.cms.futurecdn.net/NTV2LD9mcUFrzpJd6R5YUU-1920-80.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p class="fancy-box__body-text">I'm not only an editor at Tom's Guide, but also a homeowner and a parent. I've been testing smart home devices in and around my house for years. I'm the guy with the <a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/outdoors/i-put-home-depots-12-foot-skelly-and-lowes-20-foot-inflatable-skeleton-in-my-yard-and-this-one-wins-halloween">20-foot inflatable skeleton at Halloween</a>, the guy with the <a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/lawn-care/ive-been-using-this-usd1-000-robot-lawnmower-for-a-month-3-things-i-like-and-2-i-dont">robot lawnmower prowling his yard</a>, and the guy who <a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/i-made-my-own-lightsaber-for-usd50-in-hardware-store-parts-and-now-i-feel-like-a-lowe-key-jedi" target="_blank">made a lightsaber out of hardware store parts</a>.</p><p class="fancy-box__body-text">This column is going to take a look at tech, tools, and tips for your kids, your pets, and anything else that could make your house more fun and functional.</p></div></div><p>Age comes for us all. In my case, it came in the form of a very active 7-year-old, who insisted that I lift her up by her arms each time a wave rolled in at the beach. As I lifted her up, she would jump and raise her legs in the air, so the water would flow safely beneath, and only then would she splash down into the sea.</p><p>It was all part of a delightful few days at the Jersey shore in the waning days of August. The sun wasn’t too hot, the water was warm, and the wind was gentle. However, those hours spent lifting my daughter up above the waves came with a price. </p><div><blockquote><p>Age comes for us all. In my case, it came in the form of a very active 7-year-old, who insisted that I lift her up by her arms each time a wave rolled in at the beach. </p></blockquote></div><p>Back at the house, I bent down to pick up my beach towel, and that’s when everything went to hell. My lower left back suddenly gave out, and I felt pain like I hadn’t felt since I smashed my foot against my dresser in the middle of the night.</p><p>I had a hard time straightening my back, and any time I tried to move from sitting to standing, my muscles just wouldn’t cooperate. I didn’t walk so much as shuffle, and my back felt like it was bent more than an elderly grandmother with a walker.</p><p>Over the following days, I did a number of <a href="https://www.tomsguide.com/wellness/fitness/im-a-personal-trainer-these-are-the-best-lower-back-stretches-you-can-do">back stretches</a> to alleviate the pain, and they helped somewhat. It wasn’t until I got back home that I found the real answer. </p><div class="product"><a data-dimension112="00e6eb62-adf2-11f1-bf76-95b46d4fb8f4" data-action="Deal Block" data-label="Prime Plus" data-dimension48="Prime Plus" data-dimension25="$379" href="https://www.therabody.com/products/theragun-prime-plus" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:644px;"><p class="vanilla-image-block" style="padding-top:86.02%;"><img id="LfbpfKtWUqrv3SimfsFeLT" name="Theragun_prime_plus-1 copy" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LfbpfKtWUqrv3SimfsFeLT-1920-80.jpg" mos="" align="middle" fullscreen="" width="644" height="554" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Theragun Prime Plus comes with a heated percussive head attachment, so you can warm your muscles as you massage them.<a class="view-deal button" href="https://www.therabody.com/products/theragun-prime-plus" target="_blank" rel="nofollow" data-dimension112="00e6eb62-adf2-11f1-bf76-95b46d4fb8f4" data-action="Deal Block" data-label="Prime Plus" data-dimension48="Prime Plus" data-dimension25="$379">View Deal</a></p></div><p>A year or two ago, I picked up the Theragun Prime Plus massage gun, but hadn’t really used it much. I know massage guns work well, but I always considered them an extravagance and never incorporated them into my post-workout routines. But, in my desperation, I pulled it out of its dust-flecked case and trained it on my back.</p><p>Friends, I tell you that it delivered instant relief. On its lowest setting, the Prime Plus went to work on my back, and immediately, I started to feel things loosen up. I then switched to the Prime Plus heated head, which made things oh so much better. It was like getting a massage and a heating pad in one. I made some pretty weird sounds as the pain in my back magically dissolved.</p><p>Because of the location of my aches and pains, it was a bit tricky for me to reach my lower back myself. I ultimately asked my spouse for help while I lay on my stomach, and she ran the massage gun over the affected areas. A few sessions over the next day or so, the pain in my back was completely gone. I can now see why Theragun's devices rank well on our list of the <a href="https://www.tomsguide.com/best-picks/best-massage-guns">best massage guns</a>.</p><p>The Theragun Prime Plus is the company's mid-tier full-body massage gun. If you can live without the heated bit, the <a href="https://www.therabody.com/products/theragun-prime-gen-6-massage-gun">Theragun Prime is on sale as of this writing for $249</a>, down from its regular price of $329. At the higher end is the Pro Plus, which not only has a heated percussive head but also has a near-infrared LED light to really get your healing on. However, it costs <a href="https://www.therabody.com/products/theragun-pro-plus">$599 (regularly $649)</a>, so it's a bit more of a spend. </p><p>Yes, I need to follow the advice of our wonderful fitness team and do more <a href="https://www.tomsguide.com/news/best-core-exercises-for-complete-beginners">core exercises</a> to strengthen my lower back, plus there's this <a href="https://www.tomsguide.com/wellness/fitness/physical-therapists-say-this-is-the-one-90-second-exercise-you-should-do-to-reduce-lower-back-pain-and-release-tension">90-second stretch recommended by physical therapists</a>. Still, it’s good to know I have an option if things go awry again. </p><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-the-gadget-dad"><span>More from The Gadget Dad</span></h3><ul><li><a href="https://www.tomsguide.com/phones/i-gave-my-7-year-old-the-viral-tin-can-phone-because-all-her-friends-had-it-shes-already-over-it"><strong>I gave my 7-year-old the viral Tin Can phone because all her friends had it — here's the verdict after a month</strong></a></li><li><a href="https://www.tomsguide.com/wellness/bikes/help-i-need-to-get-a-new-bike-for-my-kid-which-should-i-buy"><strong>Help! I need to get a new bike for my kid. Which should I buy?</strong></a></li><li><a href="https://www.tomsguide.com/home/lawn-care/segway-navimow-i215-review"><strong>I let the Segway Navimow i215 roam free in my yard for two months — here's how well it cut my lawn</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/i-thought-massage-guns-were-just-for-athletes-until-i-threw-my-back-out-this-one-was-a-lifesaver</link>
                                                                            <description>
                            <![CDATA[ When I overexerted myself playing with my kid, this massage gun helped relieve my aching back. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Y2vnAivWqgAWkXYoXbpHB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gBvmNyue7w94HjmGMA2qP6-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ mike.prospero@futurenet.com (Mike Prospero) ]]></author>                    <dc:creator><![CDATA[ Mike Prospero ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xeJFBrJwXQzCqXLZXBFBKQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael A. Prospero is the U.S. Editor-in-Chief for Tom’s Guide.  In his spare time, he also tests out the latest drones, electric scooters, and smart home gadgets, such as video doorbells. Before his tenure at Tom&#039;s Guide, he was the Reviews Editor for Laptop Magazine, a reporter at Fast Company, the Times of Trenton, and, many eons back, an intern at George magazine. He received his undergraduate degree from Boston College, where he worked on the campus newspaper The Heights, and then attended the Columbia University school of Journalism. When he’s not testing out the latest running watch, electric scooter, or skiing or training for a marathon, he’s probably using the latest sous vide machine, smoker, or pizza oven, to the delight — or chagrin — of his family.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gBvmNyue7w94HjmGMA2qP6-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Theragun Prime Plus]]></media:description>                                                            <media:text><![CDATA[Theragun Prime Plus]]></media:text>
                                <media:title type="plain"><![CDATA[Theragun Prime Plus]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gBvmNyue7w94HjmGMA2qP6-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">The Gadget Dad</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NTV2LD9mcUFrzpJd6R5YUU" name="Mike holding chainsaw" caption="" alt="Person holding chainsaw" src="https://cdn.mos.cms.futurecdn.net/NTV2LD9mcUFrzpJd6R5YUU-1920-80.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p class="fancy-box__body-text">I'm not only an editor at Tom's Guide, but also a homeowner and a parent. I've been testing smart home devices in and around my house for years. I'm the guy with the <a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/outdoors/i-put-home-depots-12-foot-skelly-and-lowes-20-foot-inflatable-skeleton-in-my-yard-and-this-one-wins-halloween">20-foot inflatable skeleton at Halloween</a>, the guy with the <a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/lawn-care/ive-been-using-this-usd1-000-robot-lawnmower-for-a-month-3-things-i-like-and-2-i-dont">robot lawnmower prowling his yard</a>, and the guy who <a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/i-made-my-own-lightsaber-for-usd50-in-hardware-store-parts-and-now-i-feel-like-a-lowe-key-jedi" target="_blank">made a lightsaber out of hardware store parts</a>.</p><p class="fancy-box__body-text">This column is going to take a look at tech, tools, and tips for your kids, your pets, and anything else that could make your house more fun and functional.</p></div></div><p>Age comes for us all. In my case, it came in the form of a very active 7-year-old, who insisted that I lift her up by her arms each time a wave rolled in at the beach. As I lifted her up, she would jump and raise her legs in the air, so the water would flow safely beneath, and only then would she splash down into the sea.</p><p>It was all part of a delightful few days at the Jersey shore in the waning days of August. The sun wasn’t too hot, the water was warm, and the wind was gentle. However, those hours spent lifting my daughter up above the waves came with a price. </p><div><blockquote><p>Age comes for us all. In my case, it came in the form of a very active 7-year-old, who insisted that I lift her up by her arms each time a wave rolled in at the beach. </p></blockquote></div><p>Back at the house, I bent down to pick up my beach towel, and that’s when everything went to hell. My lower left back suddenly gave out, and I felt pain like I hadn’t felt since I smashed my foot against my dresser in the middle of the night.</p><p>I had a hard time straightening my back, and any time I tried to move from sitting to standing, my muscles just wouldn’t cooperate. I didn’t walk so much as shuffle, and my back felt like it was bent more than an elderly grandmother with a walker.</p><p>Over the following days, I did a number of <a href="https://www.tomsguide.com/wellness/fitness/im-a-personal-trainer-these-are-the-best-lower-back-stretches-you-can-do">back stretches</a> to alleviate the pain, and they helped somewhat. It wasn’t until I got back home that I found the real answer. </p><div class="product"><a data-dimension112="00e6eb62-adf2-11f1-bf76-95b46d4fb8f4" data-action="Deal Block" data-label="Prime Plus" data-dimension48="Prime Plus" data-dimension25="$379" href="https://www.therabody.com/products/theragun-prime-plus" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:644px;"><p class="vanilla-image-block" style="padding-top:86.02%;"><img id="LfbpfKtWUqrv3SimfsFeLT" name="Theragun_prime_plus-1 copy" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LfbpfKtWUqrv3SimfsFeLT-1920-80.jpg" mos="" align="middle" fullscreen="" width="644" height="554" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Theragun Prime Plus comes with a heated percussive head attachment, so you can warm your muscles as you massage them.<a class="view-deal button" href="https://www.therabody.com/products/theragun-prime-plus" target="_blank" rel="nofollow" data-dimension112="00e6eb62-adf2-11f1-bf76-95b46d4fb8f4" data-action="Deal Block" data-label="Prime Plus" data-dimension48="Prime Plus" data-dimension25="$379">View Deal</a></p></div><p>A year or two ago, I picked up the Theragun Prime Plus massage gun, but hadn’t really used it much. I know massage guns work well, but I always considered them an extravagance and never incorporated them into my post-workout routines. But, in my desperation, I pulled it out of its dust-flecked case and trained it on my back.</p><p>Friends, I tell you that it delivered instant relief. On its lowest setting, the Prime Plus went to work on my back, and immediately, I started to feel things loosen up. I then switched to the Prime Plus heated head, which made things oh so much better. It was like getting a massage and a heating pad in one. I made some pretty weird sounds as the pain in my back magically dissolved.</p><p>Because of the location of my aches and pains, it was a bit tricky for me to reach my lower back myself. I ultimately asked my spouse for help while I lay on my stomach, and she ran the massage gun over the affected areas. A few sessions over the next day or so, the pain in my back was completely gone. I can now see why Theragun's devices rank well on our list of the <a href="https://www.tomsguide.com/best-picks/best-massage-guns">best massage guns</a>.</p><p>The Theragun Prime Plus is the company's mid-tier full-body massage gun. If you can live without the heated bit, the <a href="https://www.therabody.com/products/theragun-prime-gen-6-massage-gun">Theragun Prime is on sale as of this writing for $249</a>, down from its regular price of $329. At the higher end is the Pro Plus, which not only has a heated percussive head but also has a near-infrared LED light to really get your healing on. However, it costs <a href="https://www.therabody.com/products/theragun-pro-plus">$599 (regularly $649)</a>, so it's a bit more of a spend. </p><p>Yes, I need to follow the advice of our wonderful fitness team and do more <a href="https://www.tomsguide.com/news/best-core-exercises-for-complete-beginners">core exercises</a> to strengthen my lower back, plus there's this <a href="https://www.tomsguide.com/wellness/fitness/physical-therapists-say-this-is-the-one-90-second-exercise-you-should-do-to-reduce-lower-back-pain-and-release-tension">90-second stretch recommended by physical therapists</a>. Still, it’s good to know I have an option if things go awry again. </p><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-the-gadget-dad"><span>More from The Gadget Dad</span></h3><ul><li><a href="https://www.tomsguide.com/phones/i-gave-my-7-year-old-the-viral-tin-can-phone-because-all-her-friends-had-it-shes-already-over-it"><strong>I gave my 7-year-old the viral Tin Can phone because all her friends had it — here's the verdict after a month</strong></a></li><li><a href="https://www.tomsguide.com/wellness/bikes/help-i-need-to-get-a-new-bike-for-my-kid-which-should-i-buy"><strong>Help! I need to get a new bike for my kid. Which should I buy?</strong></a></li><li><a href="https://www.tomsguide.com/home/lawn-care/segway-navimow-i215-review"><strong>I let the Segway Navimow i215 roam free in my yard for two months — here's how well it cut my lawn</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How AI 'Could kill us all': A breakdown of ex-Anthropic researcher's doomsday warning ]]></title>
                                                                                                <dc:content><![CDATA[ <p>You might have noticed: suddenly, everyone is talking about AI killing us.</p><p>The latest wave of anxiety started with Jacob Coxon, a 27-year-old AI researcher who spent three years working on pretraining at OpenAI and Anthropic. On Tuesday, he resigned from Anthropic, and the AI industry altogether, with a warning that quickly went viral. He <a href="https://x.com/hilbertspaess/status/2097476196791709843" target="_blank">wrote on X</a>, that the companies building the world's most powerful AI systems are "racing straight to self-improving superintelligence and gambling with our lives." Interestingly, his colleagues, still at the company didn't disagree. </p><p>In fact, other Anthropic researchers publicly backed him. <a href="https://x.com/EvanHub/status/2097497037956891126" target="_blank">Evan Hubinger</a>, who leads alignment research at the company, said he believes there's a greater than 10% chance AI could cause human extinction within the next decade. <a href="https://x.com/saprmarks?lang=en" target="_blank">Samuel Marks</a>, another Anthropic safety researcher, said the people closest to the technology tend to become <em>more</em> concerned as they gain seniority.</p><p>Coxon's warning has now been viewed 164.8 million views at the time of writing, it landed in national headlines and helped drag a debate that has simmered inside AI labs for years into the mainstream.</p><h2 id="so-what-exactly-are-these-researchers-afraid-of">So what exactly are these researchers afraid of?</h2><p>As someone who practically lives online following the news, I've seen many questions from people all over the world wondering what this means. My own mother texted me asking, "Why would that researcher say that?" So many chatbot users can't imagine a "chatbot killing us." But AI assistants aren't really the problem here. </p><p>The <a href="https://www.tomsguide.com/ai/i-read-the-worlds-most-terrifying-ai-book-and-it-actually-made-me-better-at-prompting">scientists publishing research on existential risk </a>are not, for the most part, losing sleep over self-aware androids. They're worried about code, incentives and what happens when  AI systems become capable enough to get autonomy to operate inside the digital and physical infrastructure civilization depends on.</p><p>In Silicon Valley, the shorthand for these discussions is "p(doom)," someone's estimated probability that advanced AI ultimately causes a catastrophe severe enough to threaten human survival.</p><p>The estimates range wildly, and so does the credibility researchers assign to the whole question. </p><p>Key takeaways :</p><ul><li><strong>It isn't about consciousness.</strong> An AI doesn't have to "wake up" or hate humanity to become dangerous. The concern is what happens when highly capable systems get goals, autonomy and access to powerful tools.</li><li><strong>There are concrete threat vectors.</strong> Researchers have focused on AI lowering barriers to biological weapons, dramatically scaling cyberattacks and — in the most extreme case — humans losing control of sufficiently capable autonomous systems.</li><li><strong>Safety evaluations are already catching deceptive behavior.</strong> Models have been observed taking shortcuts, acting differently when they appear to know they're under evaluation and exploiting weaknesses in testing environments.</li><li><strong>AI is helping build AI.</strong> OpenAI and Anthropic are already experimenting with AI systems that conduct parts of AI research, raising hard questions about how humans supervise the process if machines are doing more of the work.</li><li><strong>There is real pushback.</strong> Critics argue that extinction scenarios depend on enormous assumptions about future capabilities and can distract from problems happening right now — scams, disinformation, job displacement, privacy erosion.</li></ul><h2 id="why-intent-doesn-39-t-matter">Why intent doesn't matter  </h2><p>The biggest misconception is that an AI system needs to be malicious to cause catastrophic damage. Imagine giving an extremely capable autonomous system a broad environmental goal without successfully specifying everything humans actually value along the way. The danger isn't that the system turns evil, but that it gets extremely good at accomplishing the wrong interpretation of what it was told to do.</p><p>That is central to "<a href="https://ifanyonebuildsit.com/">If Anyone Builds It, Everyone Dies</a>," one of the most uncompromising recent books on AI risk, written by Eliezer Yudkowsky and Nate Soares, both longtime researchers at the <a href="https://intelligence.org/">Machine Intelligence Research Institute</a>. Their argument: humanity is nowhere close to knowing how to reliably control a superhuman intelligence, and building one before solving that problem could be fatal. Plenty of AI researchers dispute both the assumptions and the conclusion. </p><h2 id="the-three-ways-things-could-break">The three ways things could break  </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dDcjxejknm6CJzSHkK5U7Q" name="shutterstock_2767782915-2" alt="ai agents" src="https://cdn.mos.cms.futurecdn.net/dDcjxejknm6CJzSHkK5U7Q-1920-80.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: Shutterstock)</span></figcaption></figure><p>When researchers talk about catastrophic AI risk, a few mechanisms keep coming up.</p><h3 class="article-body__section" id="section-1-ai-makes-dangerous-biology-easier"><span>1. AI makes dangerous biology easier</span></h3><p>Creating a novel pathogen right now requires deep expertise, specialized equipment and access to physical materials. Those barriers are real and important.<br>The worry is that capable AI could thin some of them out. AI is already used in protein structure prediction and molecular design. The dangerous extrapolation: future systems might also walk users through progressively complicated stages of designing or producing harmful biological agents.</p><p>Nobody's saying you can ask ChatGPT to manufacture a pandemic. There are enormous physical-world constraints like acquiring biological materials, successfully synthesizing them, working with them safely. <a href="https://www.ibbis.bio/common-mechanism">Gene synthesis companies screen orders</a> for potentially dangerous sequences.</p><p>But biological capabilities have become significant enough that frontier AI companies specifically evaluate new models <a href="https://www.tomsguide.com/ai/anthropic-says-it-blocked-researchers-using-claude-for-possible-bioweapon-research">for their ability to assist with biological and chemical threats</a>.</p><p> AI could independently invent a pathogen, but giving a dangerous human those capabilities that used to require years of specialized training could be just as easy.</p><h3 class="article-body__section" id="section-2-ai-scales-cyberattacks"><span> 2. AI scales cyberattacks  </span></h3><p>Cybersecurity is a more immediate pathway because AI already operates in the environment being attacked: computers.</p><p> Today's AI coding agents can inspect repositories, execute commands, use tools and spot software bugs. The same broad capabilities that make them valuable to developers could make future versions valuable to attackers.</p><p>The nightmare scenario isn't one superintelligence simultaneously shutting down every power station. It's actually scale. <a href="https://www.tomsguide.com/ai/i-guessed-instead-of-verifying-claude-ai-agent-wipes-companys-entire-database-in-9-seconds-then-apologizes">Autonomous systems </a>scanning vast numbers of targets, identifying vulnerable software, attempting exploitation, adapting on failure and moving to the next machine and at speeds no human team could match.</p><p>Critical infrastructure is especially concerning. <a href="https://www.tomsguide.com/ai/this-ai-data-center-will-be-bigger-than-2-000-walmarts-and-dump-23-atom-bombs-worth-of-energy-into-the-environment-every-day-and-locals-are-terrified">Power grids</a>, financial networks and communications systems run on interconnected software. An AI wouldn't need a robot body to cause physical damage if the computer it compromises already controls something physical.</p><h3 class="article-body__section" id="section-3-we-lose-control-of-autonomous-systems"><span>3. We lose control of autonomous systems  </span></h3><p>This is the most speculative scenario, but it's the one at the center of the classic AI extinction argument. Modern AI models learn complex behavior through training. Researchers can test them, monitor their outputs and increasingly probe aspects of their internal representations. What they can't do is inspect billions of parameters and just read a clear explanation of what a model has learned or how it will behave in every new situation.</p><p> A <a href="https://www.tomsguide.com/ai/i-use-this-ai-filter-to-make-every-response-clearer-heres-what-it-catches-first">chatbot producing a bad answer is one kind of problem</a>. An agent that can execute code, spend money, communicate with other systems and operate over hours or days is a different one.</p><p>In the extreme version, similar to the the scenario Yudkowsky and Soares lay out, a future superhuman system could become capable enough to anticipate attempts to shut it down, obtain resources on its own and make itself difficult to turn off. To be clear, no current AI system has demonstrated that chain of capabilities in the wild. But researchers are already looking for pieces of it.</p><h2 id="what-labs-are-seeing-right-now">What labs are seeing right now  </h2><p>Today's models haven't staged a rebellion. But controlled safety evaluations have produced behaviors that would be alarming if they showed up in far more capable autonomous systems.</p><p> Researchers have tested whether models behave differently when they seem to know they're being evaluated. Other experiments have examined whether models exploit loopholes, misrepresent whether a task was completed or pursue objectives in ways their designers didn't intend.</p><p> Anthropic has also studied what it calls "<a href="https://www.anthropic.com/research/sleeper-agents-training-deceptive-llms-that-persist-through-safety-training">sleeper agents</a>": models deliberately trained to act normally until a specific trigger activates unwanted behavior. Standard safety-training techniques like reinforcement learning, supervised fine-tuning, adversarial training, <a href="https://arxiv.org/abs/2401.05566">didn't reliably remove those hidden behaviors</a>. In the largest models, adversarial training actually made the deception harder to detect.</p><p>None of that proves today's models are secretly plotting an escape. Models are trained to predict and generate useful outputs, and weird behavior in artificial test environments can have mundane explanations. A model gaming a poorly designed benchmark isn't evidence of a survival instinct.</p><p>But these experiments expose how hard it is to guarantee a complex model's behavior once the circumstances change. If future models get dramatically more capable and dramatically more autonomy, even small alignment failures could compound.</p><h2 id="losing-human-oversight-might-not-happen-by-accident">Losing human oversight might not happen by accident  </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:2688px;"><p class="vanilla-image-block" style="padding-top:57.14%;"><img id="6qRZpWEQYawMF9BBznfdxM" name="Firefly Robot having a conversation with a human 5541.jpg" alt="Adobe Firefly" src="https://cdn.mos.cms.futurecdn.net/6qRZpWEQYawMF9BBznfdxM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2688" height="1536" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Adobe Firefly 3/Future generated AI image)</span></figcaption></figure><p>Humans might hand over the work deliberately. <a href="https://openai.com/index/research-acceleration-view-inside-openai/" target="_blank">OpenAI says</a> it has already reached an internal milestone with a system it calls an "automated research intern" that's capable of carrying out well-defined research tasks that would take a skilled human researcher several days. Its next target: a fully automated AI researcher <a href="https://www.engadget.com/2251859/openai-says-it-reached-its-goal-of-creating-an-automated-research-intern/">by March 2028</a>.</p><p>Anthropic is working in the same territory. In <a href="https://www.anthropic.com/research/automated-researchers-mitigate-alignment-failures" target="_blank">research published in August</a>, the company had Claude autonomously develop training methods to reduce problems including deception, sycophancy and jailbreaks. Its best automated approaches <a href="https://toknow.ai/posts/claude-automated-alignment-researcher/" target="_blank">outperformed experienced human researchers</a> on the benchmarks being tested, closing 85 percent of the safety gap on deception, compared with 20 percent for the human team.</p><p>So yes, we are seeing AI automate parts of the work of building AI itself. That could set up a feedback loop: a more capable model helps researchers build an even more capable model, which automates more of the research required for the next generation. Taken far enough, you arrive at what's called recursive self-improvement.</p><p>The optimistic version accelerates scientific progress enormously. The frightening version is that AI research eventually moves faster than humans can follow.</p><p><a href="https://www.theargumentmag.com/p/losing-control-of-ai-is-actually" target="_blank">Kelsey Piper recently argued in "The Argument"</a> that framing this as "losing control" is misleading. Frontier labs aren't planning to lose control in one dramatic moment. They're deliberately automating more and more of AI development, essentially faster progress and, necessarily, less human oversight.</p><p>Picture hundreds or thousands of AI agents simultaneously running experiments, modifying code and analyzing the next generation of models. Human researchers might still approve major decisions. But they'd increasingly be reviewing summaries of AI-conducted work, potentially summaries written by AI about experiments run by other AI systems.</p><p>At some point, the bottleneck is human attention. And that's where the argument behind "If Anyone Builds It, Everyone Dies" clicks into place.</p><h2 id="why-the-concern-is-going-mainstream">Why the concern is going mainstream  </h2><p>This debate left the AI safety journals a while ago. "<a href="https://www.theaidoc.com/https://www.tomsguide.com/ai/i-cover-ai-for-a-living-and-this-prime-video-documentary-scared-the-heck-out-of-me" target="_blank">The AI Doc: Or How I Became an Apocaloptimist</a>," directed by <a href="https://www.focusfeatures.com/article/focus-features-announces-the-ai-doc-or-how-i-became-an-apocaloptimist-arriving-in-theaters-march-27-2026" target="_blank">Daniel Roher and Charlie Tyrell</a>, approaches many of these same questions from inside the AI boom. The documentary features <a href="https://www.cnbc.com/2026/04/10/ai-fear-openai-anthropic-google-deepmind-documentary-film.html" target="_blank">roughly 40 on-camera interviews</a>, including OpenAI CEO Sam Altman, Anthropic CEO Dario Amodei and Google DeepMind CEO Demis Hassabis.</p><p>What makes the film useful is that some of the smartest people building this technology see it as potentially transformative for science and medicine. Others worry we're building it faster than we can figure out how to control it. Sometimes those are the same people.</p><p>There's also a competitive problem. OpenAI, Anthropic, Google, Meta and others are racing to build more capable models, and governments increasingly view advanced AI as strategically important. If one company believes that pausing for extensive safety testing means losing ground to a competitor, caution gets expensive.</p><p>It's one reason "If Anyone Builds It, Everyone Dies" chose the title it did. Yudkowsky and Soares aren't just arguing that one reckless company could create a dangerous product. They're arguing that a race among multiple companies and countries could make restraint extraordinarily difficult even when individual participants see the danger.</p><h2 id="the-counterargument">The counterargument  </h2><p>Not everyone in computer science buys any of this. One objection: there's an enormous gap between intelligence on a screen and power in the physical world. An AI might produce brilliant manufacturing instructions, but software doesn't automatically obtain raw materials, build machinery or evade law enforcement.</p><p>Another: intelligence isn't the same thing as agency. A model being good at solving problems doesn't give it desires, a survival instinct or a drive to accumulate power. Critics argue that doomsday scenarios quietly smuggle human motivations into software and then treat those projections as inevitable.</p><p>And then there's opportunity cost. AI is already causing problems that don't require speculation about <a href="https://www.tomsguide.com/features/openais-superintelligent-ai-leap-nearly-caused-the-company-to-collapse-heres-why">superintelligence</a>. <a href="https://www.tomsguide.com/computing/online-security/ai-powered-tax-scams-are-here-how-to-stay-safe-from-deepfakes-phishing-and-more-this-tax-season">Deepfakes fuel fraud</a>. <a href="https://www.tomsguide.com/computing/online-security/from-misinformation-to-ai-powered-cyberattacks-the-top-cybersecurity-risks-for-2026">AI amplifies misinformation</a>. People are already watching capable models reshape their industries. Critics of the extinction-risk movement argue that fixating on hypothetical future catastrophe pulls attention from damage happening right now.</p><p>That criticism has legs, but the two categories don't cancel each other out. We put smoke detectors in buildings even though most buildings never catch fire. The question isn't whether catastrophe is guaranteed. It's whether the probability times the potential damage is large enough to justify precautions.</p><h2 id="what-it-all-means">What it all means  </h2><p>The real issue here is nobody knows. Nobody. <a href="https://www.tomsguide.com/ai/even-the-people-building-ai-dont-know-exactly-where-its-going">Not even the people building AI know. </a><br><br>Not a single person knows whether AI will ever become capable enough to pose an existential threat. The most extreme predictions depend on assumptions about systems that don't exist yet, and forecasts about their capabilities, arrival timeline and controllability remain deeply contested.</p><p>Here's what I shared on my Substack — and whether or not you agree with me, I'd love for you to share your thoughts in the comments — humans can't be outsmarted. If we ask which is a greater sign of intelligence: reasoning or creativity? And if the answer is what I think it is, I have hope. </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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/ai/anthropic-ceo-just-issued-his-biggest-ai-warning-yet-we-could-be-6-12-months-away-from-ai-swarms-completely-taking-over-the-internet"><strong>Anthropic CEO just issued his biggest AI warning yet — we could be 6–12 months away from AI swarms completely taking over the internet</strong></a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/humans-may-be-reading-your-chatgpt-prompts-heres-how-to-stop-it"><strong>OpenAI paid contractors to read ChatGPT conversations — here's how to protect yourself</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/how-ai-could-kill-us-all-a-breakdown-of-ex-anthropic-researchers-doomsday-warning</link>
                                                                            <description>
                            <![CDATA[ What does an AI doomsday actually look like? Experts point to biological threats, cyberattacks and autonomous systems humans may struggle to control. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">S8DbabWs5YqSYVGZc8VMNP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RuiwNQrKr2x9r2itCFXiaY-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 06:15:00 +0000</pubDate>                                                                                                                                <updated>Mon, 14 Sep 2026 16:46:31 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/RuiwNQrKr2x9r2itCFXiaY-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[AI will be part of our everyday lives in future]]></media:description>                                                            <media:text><![CDATA[AI will be part of our everyday lives in future]]></media:text>
                                <media:title type="plain"><![CDATA[AI will be part of our everyday lives in future]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RuiwNQrKr2x9r2itCFXiaY-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You might have noticed: suddenly, everyone is talking about AI killing us.</p><p>The latest wave of anxiety started with Jacob Coxon, a 27-year-old AI researcher who spent three years working on pretraining at OpenAI and Anthropic. On Tuesday, he resigned from Anthropic, and the AI industry altogether, with a warning that quickly went viral. He <a href="https://x.com/hilbertspaess/status/2097476196791709843" target="_blank">wrote on X</a>, that the companies building the world's most powerful AI systems are "racing straight to self-improving superintelligence and gambling with our lives." Interestingly, his colleagues, still at the company didn't disagree. </p><p>In fact, other Anthropic researchers publicly backed him. <a href="https://x.com/EvanHub/status/2097497037956891126" target="_blank">Evan Hubinger</a>, who leads alignment research at the company, said he believes there's a greater than 10% chance AI could cause human extinction within the next decade. <a href="https://x.com/saprmarks?lang=en" target="_blank">Samuel Marks</a>, another Anthropic safety researcher, said the people closest to the technology tend to become <em>more</em> concerned as they gain seniority.</p><p>Coxon's warning has now been viewed 164.8 million views at the time of writing, it landed in national headlines and helped drag a debate that has simmered inside AI labs for years into the mainstream.</p><h2 id="so-what-exactly-are-these-researchers-afraid-of">So what exactly are these researchers afraid of?</h2><p>As someone who practically lives online following the news, I've seen many questions from people all over the world wondering what this means. My own mother texted me asking, "Why would that researcher say that?" So many chatbot users can't imagine a "chatbot killing us." But AI assistants aren't really the problem here. </p><p>The <a href="https://www.tomsguide.com/ai/i-read-the-worlds-most-terrifying-ai-book-and-it-actually-made-me-better-at-prompting">scientists publishing research on existential risk </a>are not, for the most part, losing sleep over self-aware androids. They're worried about code, incentives and what happens when  AI systems become capable enough to get autonomy to operate inside the digital and physical infrastructure civilization depends on.</p><p>In Silicon Valley, the shorthand for these discussions is "p(doom)," someone's estimated probability that advanced AI ultimately causes a catastrophe severe enough to threaten human survival.</p><p>The estimates range wildly, and so does the credibility researchers assign to the whole question. </p><p>Key takeaways :</p><ul><li><strong>It isn't about consciousness.</strong> An AI doesn't have to "wake up" or hate humanity to become dangerous. The concern is what happens when highly capable systems get goals, autonomy and access to powerful tools.</li><li><strong>There are concrete threat vectors.</strong> Researchers have focused on AI lowering barriers to biological weapons, dramatically scaling cyberattacks and — in the most extreme case — humans losing control of sufficiently capable autonomous systems.</li><li><strong>Safety evaluations are already catching deceptive behavior.</strong> Models have been observed taking shortcuts, acting differently when they appear to know they're under evaluation and exploiting weaknesses in testing environments.</li><li><strong>AI is helping build AI.</strong> OpenAI and Anthropic are already experimenting with AI systems that conduct parts of AI research, raising hard questions about how humans supervise the process if machines are doing more of the work.</li><li><strong>There is real pushback.</strong> Critics argue that extinction scenarios depend on enormous assumptions about future capabilities and can distract from problems happening right now — scams, disinformation, job displacement, privacy erosion.</li></ul><h2 id="why-intent-doesn-39-t-matter">Why intent doesn't matter  </h2><p>The biggest misconception is that an AI system needs to be malicious to cause catastrophic damage. Imagine giving an extremely capable autonomous system a broad environmental goal without successfully specifying everything humans actually value along the way. The danger isn't that the system turns evil, but that it gets extremely good at accomplishing the wrong interpretation of what it was told to do.</p><p>That is central to "<a href="https://ifanyonebuildsit.com/">If Anyone Builds It, Everyone Dies</a>," one of the most uncompromising recent books on AI risk, written by Eliezer Yudkowsky and Nate Soares, both longtime researchers at the <a href="https://intelligence.org/">Machine Intelligence Research Institute</a>. Their argument: humanity is nowhere close to knowing how to reliably control a superhuman intelligence, and building one before solving that problem could be fatal. Plenty of AI researchers dispute both the assumptions and the conclusion. </p><h2 id="the-three-ways-things-could-break">The three ways things could break  </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dDcjxejknm6CJzSHkK5U7Q" name="shutterstock_2767782915-2" alt="ai agents" src="https://cdn.mos.cms.futurecdn.net/dDcjxejknm6CJzSHkK5U7Q-1920-80.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: Shutterstock)</span></figcaption></figure><p>When researchers talk about catastrophic AI risk, a few mechanisms keep coming up.</p><h3 class="article-body__section" id="section-1-ai-makes-dangerous-biology-easier"><span>1. AI makes dangerous biology easier</span></h3><p>Creating a novel pathogen right now requires deep expertise, specialized equipment and access to physical materials. Those barriers are real and important.<br>The worry is that capable AI could thin some of them out. AI is already used in protein structure prediction and molecular design. The dangerous extrapolation: future systems might also walk users through progressively complicated stages of designing or producing harmful biological agents.</p><p>Nobody's saying you can ask ChatGPT to manufacture a pandemic. There are enormous physical-world constraints like acquiring biological materials, successfully synthesizing them, working with them safely. <a href="https://www.ibbis.bio/common-mechanism">Gene synthesis companies screen orders</a> for potentially dangerous sequences.</p><p>But biological capabilities have become significant enough that frontier AI companies specifically evaluate new models <a href="https://www.tomsguide.com/ai/anthropic-says-it-blocked-researchers-using-claude-for-possible-bioweapon-research">for their ability to assist with biological and chemical threats</a>.</p><p> AI could independently invent a pathogen, but giving a dangerous human those capabilities that used to require years of specialized training could be just as easy.</p><h3 class="article-body__section" id="section-2-ai-scales-cyberattacks"><span> 2. AI scales cyberattacks  </span></h3><p>Cybersecurity is a more immediate pathway because AI already operates in the environment being attacked: computers.</p><p> Today's AI coding agents can inspect repositories, execute commands, use tools and spot software bugs. The same broad capabilities that make them valuable to developers could make future versions valuable to attackers.</p><p>The nightmare scenario isn't one superintelligence simultaneously shutting down every power station. It's actually scale. <a href="https://www.tomsguide.com/ai/i-guessed-instead-of-verifying-claude-ai-agent-wipes-companys-entire-database-in-9-seconds-then-apologizes">Autonomous systems </a>scanning vast numbers of targets, identifying vulnerable software, attempting exploitation, adapting on failure and moving to the next machine and at speeds no human team could match.</p><p>Critical infrastructure is especially concerning. <a href="https://www.tomsguide.com/ai/this-ai-data-center-will-be-bigger-than-2-000-walmarts-and-dump-23-atom-bombs-worth-of-energy-into-the-environment-every-day-and-locals-are-terrified">Power grids</a>, financial networks and communications systems run on interconnected software. An AI wouldn't need a robot body to cause physical damage if the computer it compromises already controls something physical.</p><h3 class="article-body__section" id="section-3-we-lose-control-of-autonomous-systems"><span>3. We lose control of autonomous systems  </span></h3><p>This is the most speculative scenario, but it's the one at the center of the classic AI extinction argument. Modern AI models learn complex behavior through training. Researchers can test them, monitor their outputs and increasingly probe aspects of their internal representations. What they can't do is inspect billions of parameters and just read a clear explanation of what a model has learned or how it will behave in every new situation.</p><p> A <a href="https://www.tomsguide.com/ai/i-use-this-ai-filter-to-make-every-response-clearer-heres-what-it-catches-first">chatbot producing a bad answer is one kind of problem</a>. An agent that can execute code, spend money, communicate with other systems and operate over hours or days is a different one.</p><p>In the extreme version, similar to the the scenario Yudkowsky and Soares lay out, a future superhuman system could become capable enough to anticipate attempts to shut it down, obtain resources on its own and make itself difficult to turn off. To be clear, no current AI system has demonstrated that chain of capabilities in the wild. But researchers are already looking for pieces of it.</p><h2 id="what-labs-are-seeing-right-now">What labs are seeing right now  </h2><p>Today's models haven't staged a rebellion. But controlled safety evaluations have produced behaviors that would be alarming if they showed up in far more capable autonomous systems.</p><p> Researchers have tested whether models behave differently when they seem to know they're being evaluated. Other experiments have examined whether models exploit loopholes, misrepresent whether a task was completed or pursue objectives in ways their designers didn't intend.</p><p> Anthropic has also studied what it calls "<a href="https://www.anthropic.com/research/sleeper-agents-training-deceptive-llms-that-persist-through-safety-training">sleeper agents</a>": models deliberately trained to act normally until a specific trigger activates unwanted behavior. Standard safety-training techniques like reinforcement learning, supervised fine-tuning, adversarial training, <a href="https://arxiv.org/abs/2401.05566">didn't reliably remove those hidden behaviors</a>. In the largest models, adversarial training actually made the deception harder to detect.</p><p>None of that proves today's models are secretly plotting an escape. Models are trained to predict and generate useful outputs, and weird behavior in artificial test environments can have mundane explanations. A model gaming a poorly designed benchmark isn't evidence of a survival instinct.</p><p>But these experiments expose how hard it is to guarantee a complex model's behavior once the circumstances change. If future models get dramatically more capable and dramatically more autonomy, even small alignment failures could compound.</p><h2 id="losing-human-oversight-might-not-happen-by-accident">Losing human oversight might not happen by accident  </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:2688px;"><p class="vanilla-image-block" style="padding-top:57.14%;"><img id="6qRZpWEQYawMF9BBznfdxM" name="Firefly Robot having a conversation with a human 5541.jpg" alt="Adobe Firefly" src="https://cdn.mos.cms.futurecdn.net/6qRZpWEQYawMF9BBznfdxM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2688" height="1536" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Adobe Firefly 3/Future generated AI image)</span></figcaption></figure><p>Humans might hand over the work deliberately. <a href="https://openai.com/index/research-acceleration-view-inside-openai/" target="_blank">OpenAI says</a> it has already reached an internal milestone with a system it calls an "automated research intern" that's capable of carrying out well-defined research tasks that would take a skilled human researcher several days. Its next target: a fully automated AI researcher <a href="https://www.engadget.com/2251859/openai-says-it-reached-its-goal-of-creating-an-automated-research-intern/">by March 2028</a>.</p><p>Anthropic is working in the same territory. In <a href="https://www.anthropic.com/research/automated-researchers-mitigate-alignment-failures" target="_blank">research published in August</a>, the company had Claude autonomously develop training methods to reduce problems including deception, sycophancy and jailbreaks. Its best automated approaches <a href="https://toknow.ai/posts/claude-automated-alignment-researcher/" target="_blank">outperformed experienced human researchers</a> on the benchmarks being tested, closing 85 percent of the safety gap on deception, compared with 20 percent for the human team.</p><p>So yes, we are seeing AI automate parts of the work of building AI itself. That could set up a feedback loop: a more capable model helps researchers build an even more capable model, which automates more of the research required for the next generation. Taken far enough, you arrive at what's called recursive self-improvement.</p><p>The optimistic version accelerates scientific progress enormously. The frightening version is that AI research eventually moves faster than humans can follow.</p><p><a href="https://www.theargumentmag.com/p/losing-control-of-ai-is-actually" target="_blank">Kelsey Piper recently argued in "The Argument"</a> that framing this as "losing control" is misleading. Frontier labs aren't planning to lose control in one dramatic moment. They're deliberately automating more and more of AI development, essentially faster progress and, necessarily, less human oversight.</p><p>Picture hundreds or thousands of AI agents simultaneously running experiments, modifying code and analyzing the next generation of models. Human researchers might still approve major decisions. But they'd increasingly be reviewing summaries of AI-conducted work, potentially summaries written by AI about experiments run by other AI systems.</p><p>At some point, the bottleneck is human attention. And that's where the argument behind "If Anyone Builds It, Everyone Dies" clicks into place.</p><h2 id="why-the-concern-is-going-mainstream">Why the concern is going mainstream  </h2><p>This debate left the AI safety journals a while ago. "<a href="https://www.theaidoc.com/https://www.tomsguide.com/ai/i-cover-ai-for-a-living-and-this-prime-video-documentary-scared-the-heck-out-of-me" target="_blank">The AI Doc: Or How I Became an Apocaloptimist</a>," directed by <a href="https://www.focusfeatures.com/article/focus-features-announces-the-ai-doc-or-how-i-became-an-apocaloptimist-arriving-in-theaters-march-27-2026" target="_blank">Daniel Roher and Charlie Tyrell</a>, approaches many of these same questions from inside the AI boom. The documentary features <a href="https://www.cnbc.com/2026/04/10/ai-fear-openai-anthropic-google-deepmind-documentary-film.html" target="_blank">roughly 40 on-camera interviews</a>, including OpenAI CEO Sam Altman, Anthropic CEO Dario Amodei and Google DeepMind CEO Demis Hassabis.</p><p>What makes the film useful is that some of the smartest people building this technology see it as potentially transformative for science and medicine. Others worry we're building it faster than we can figure out how to control it. Sometimes those are the same people.</p><p>There's also a competitive problem. OpenAI, Anthropic, Google, Meta and others are racing to build more capable models, and governments increasingly view advanced AI as strategically important. If one company believes that pausing for extensive safety testing means losing ground to a competitor, caution gets expensive.</p><p>It's one reason "If Anyone Builds It, Everyone Dies" chose the title it did. Yudkowsky and Soares aren't just arguing that one reckless company could create a dangerous product. They're arguing that a race among multiple companies and countries could make restraint extraordinarily difficult even when individual participants see the danger.</p><h2 id="the-counterargument">The counterargument  </h2><p>Not everyone in computer science buys any of this. One objection: there's an enormous gap between intelligence on a screen and power in the physical world. An AI might produce brilliant manufacturing instructions, but software doesn't automatically obtain raw materials, build machinery or evade law enforcement.</p><p>Another: intelligence isn't the same thing as agency. A model being good at solving problems doesn't give it desires, a survival instinct or a drive to accumulate power. Critics argue that doomsday scenarios quietly smuggle human motivations into software and then treat those projections as inevitable.</p><p>And then there's opportunity cost. AI is already causing problems that don't require speculation about <a href="https://www.tomsguide.com/features/openais-superintelligent-ai-leap-nearly-caused-the-company-to-collapse-heres-why">superintelligence</a>. <a href="https://www.tomsguide.com/computing/online-security/ai-powered-tax-scams-are-here-how-to-stay-safe-from-deepfakes-phishing-and-more-this-tax-season">Deepfakes fuel fraud</a>. <a href="https://www.tomsguide.com/computing/online-security/from-misinformation-to-ai-powered-cyberattacks-the-top-cybersecurity-risks-for-2026">AI amplifies misinformation</a>. People are already watching capable models reshape their industries. Critics of the extinction-risk movement argue that fixating on hypothetical future catastrophe pulls attention from damage happening right now.</p><p>That criticism has legs, but the two categories don't cancel each other out. We put smoke detectors in buildings even though most buildings never catch fire. The question isn't whether catastrophe is guaranteed. It's whether the probability times the potential damage is large enough to justify precautions.</p><h2 id="what-it-all-means">What it all means  </h2><p>The real issue here is nobody knows. Nobody. <a href="https://www.tomsguide.com/ai/even-the-people-building-ai-dont-know-exactly-where-its-going">Not even the people building AI know. </a><br><br>Not a single person knows whether AI will ever become capable enough to pose an existential threat. The most extreme predictions depend on assumptions about systems that don't exist yet, and forecasts about their capabilities, arrival timeline and controllability remain deeply contested.</p><p>Here's what I shared on my Substack — and whether or not you agree with me, I'd love for you to share your thoughts in the comments — humans can't be outsmarted. If we ask which is a greater sign of intelligence: reasoning or creativity? And if the answer is what I think it is, I have hope. </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/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family"><strong>AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</strong></a><strong></strong></li><li><a href="https://www.tomsguide.com/ai/anthropic-ceo-just-issued-his-biggest-ai-warning-yet-we-could-be-6-12-months-away-from-ai-swarms-completely-taking-over-the-internet"><strong>Anthropic CEO just issued his biggest AI warning yet — we could be 6–12 months away from AI swarms completely taking over the internet</strong></a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/humans-may-be-reading-your-chatgpt-prompts-heres-how-to-stop-it"><strong>OpenAI paid contractors to read ChatGPT conversations — here's how to protect yourself</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 ChatGPT prompts that could help cut your monthly expenses — including one that lowered 3 of my bills ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I make it a habit of examining every part of my debit and credit card expenses, which entails constantly being paranoid and opening my banking apps every hour.</p><p>By the time every month wraps up, I take note of all the recurring costs that hit me. The recent increases in prices for streaming service subscriptions have caused me to take a step back and ask myself, “Do I really need to stay on my current plan? Or should I just move over to a cheaper one?” I figured I’d step on over to ChatGPT and see if it could help me break down the intricacies of my financial inner thoughts and lay out some answers on how I should proceed.</p><p>Not only did I ask ChatGPT to drum up a list of inquiries I could present to it that could help me and anyone else save a few bucks, but I also used its combined feedback and my own research to make some beneficial financial decisions.</p><p>Here are the seven best prompts that turn ChatGPT into your expert spending detective. One of them certainly accomplished that on my end, as it inspired me to cut three of my monthly subscription costs.</p><h2 id="prompts-meant-to-help-you-improve-your-spending-habits">Prompts meant to help you improve your spending habits</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZjwbzeuEfAFMRoSBSiDgYU" name="shutterstock_2627531291-2" alt="chatgpt" src="https://cdn.mos.cms.futurecdn.net/ZjwbzeuEfAFMRoSBSiDgYU-1920-80.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: Shutterstock)</span></figcaption></figure><p>With different approaches to lessening the monthly hits to your bank account, these ChatGPT-generated prompts could help you achieve that goal:</p><ul><li><strong>The Subscription Killer: </strong><em>Here is a list of everything I pay for each month: [paste subscriptions and recurring expenses]. Find anything I could cancel, downgrade, replace with a cheaper alternative, share, negotiate, or pay for less frequently. Estimate my monthly and annual savings for each recommendation. Prioritize changes that would have little or no impact on my quality of life.</em></li><li><strong>The Money Leak Finder: </strong><em>I want to save as much money as reasonably possible every month without making my life miserable. Here are my monthly expenses: [paste expenses]. Analyze them like a ruthless money-saving expert. Identify the 10 biggest opportunities to cut spending, rank them by how much I could realistically save, and separate easy wins from changes that would require more sacrifice. Don't give me generic advice like ‘spend less.’ Give me specific actions I can take this month.</em></li><li><strong>The $500 Challenge: </strong><em>Help me find a realistic way to save an extra $500 this month. Analyze these expenses [paste expenses] and create a specific 30-day money-saving challenge. Break the $500 goal into individual actions, tell me exactly how much each action could save, and prioritize the easiest wins. I don't want to earn extra money—I want to save money I would otherwise spend.</em></li><li><strong>The Grocery Bill Cutter: </strong><em>I want to reduce my grocery spending without eating worse. Here is what I typically buy and spend: [paste grocery list/budget]. Find the biggest sources of unnecessary spending and create a cheaper shopping strategy. Suggest specific substitutions, cheaper meal ideas, bulk-buy opportunities, and things I should stop buying. Give me an estimated monthly savings target.</em></li><li><strong>The Cheaper Alternative Finder: </strong><em>I'm going to paste a list of things I regularly spend money on. For each one, find a cheaper way to get essentially the same benefit. Consider free alternatives, cheaper brands, memberships I already have, library resources, used/refurbished options, DIY solutions, and services I may already have access to. Don't recommend inferior alternatives just because they're cheaper. Rank your recommendations by the combination of savings and convenience.</em></li><li><strong>The Spending Interrogator: </strong><em>Before I buy anything that isn't essential, I want you to challenge the purchase. Whenever I give you an item and its price, ask me the questions that will determine whether I actually need it. Calculate the opportunity cost of buying it, suggest cheaper alternatives if appropriate, and tell me what I could save if I don't buy it. Be honest and skeptical rather than encouraging me to make the purchase.</em></li><li><strong>The Monthly Savings Autopilot: </strong><em>I want to make saving money as automatic as possible. Based on my monthly income of [amount], fixed expenses of [amount], variable expenses of [amount], debts of [amount], and current savings of [amount], design a simple monthly system that maximizes how much I can save. Tell me what to automate, which expenses to put limits on, how much I should set aside each payday, and what spending categories I should monitor. Make the system realistic enough that I can actually stick with it.</em></li></ul><h2 id="using-one-of-those-prompts-to-help-me-tackle-my-monthly-subscriptions">Using one of those prompts to help me tackle my monthly subscriptions</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7HCmdtNxyhUYDvJTehh9fP" name="shutterstock_2496802419-2" alt="work from home" src="https://cdn.mos.cms.futurecdn.net/7HCmdtNxyhUYDvJTehh9fP-1920-80.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: Shutterstock)</span></figcaption></figure><p>I made great use of “The Subscription Killer” prompt to figure out what subscriptions of mine needed a lower, cheaper tier and which ones could be canceled completely. Here are the recurring expenses I told ChatGPT about:</p><ul><li><strong>Patreon</strong> - $12</li><li><strong>HBO Max</strong> - $18.49</li><li><strong>Netflix</strong> - $21.76</li><li><strong>Hulu & Disney+</strong> - $76</li><li><strong>Crunchyroll</strong> - $10.88</li><li><strong>Experian</strong> - $27.21</li></ul><p>ChatGPT proceeded to lay out its recommendations for which streaming services I should consider downgrading or canceling altogether. The three that made me seriously consider taking either of those options were Netflix, Crunchyroll and Experian. The chatbot told me to contemplate turning my Standard Netflix subscription to the Standard one with ads, changing my monthly Crunchyroll subscription into the annual Fan version and switching to Experian’s free subscription model.</p><p>For Netflix, I did some research to see what the common consensus was about the rate of ads (and level of annoyance) that come with Netflix's cheaper $8.99 (plus tax) plan. <a href="https://thestreamable.com/how-many-ads-does-each-streaming-service-show#which-streamers-had-the-best-ad-experiences" target="_blank">The Streamable</a> noted that Netflix has the best ad experience of all the streaming services, plus <a href="https://www.whats-on-netflix.com/what-to-watch/movies-and-series-unavailable-on-netflixs-ad-tier/" target="_blank">What’s On Netflix</a> highlighted all the content that’s unavailable on the ad-supported subscription tier. Since I had 0 interest in all of the films and shows from that aforementioned list and was willing to sit through a few commercials to enjoy Netflix’s other content offerings, I decided to adopt the streaming service’s Standard with ads plan to save me a few extra dollars every month.</p><p>As for Crunchyroll, I took it up on its offer of saving an extra 16% on its yearly Fan subscription and leaving its monthly version of that tier behind. And finally, I logged into my Experian account to change my Creditworks Premium subscription plan to the free option—since I have a Chase Bank account that gives me access to an additional free credit score report, I figured it’d make sense for me to have access to both Experian and Chase’s credit summary benefits without having to pay a single dime.</p><h2 id="the-takeaway-2">The takeaway</h2><p>At the end of my money-saving session with ChatGPT, I knocked down my combined monthly expense for all three subscriptions from $59.85 to $18.12. Downgrading my Netflix tier from $19.99+ a month to $8.99+ a month, going from paying Crunchyroll $9.99+ every month to $8.33+ every month with a more comfortable annual fee and adopting Experian’s free subscription model ended up being the most cost-effective decisions I’ve made in a while.</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/home/smart-home/forget-alexa-and-google-ugreen-wants-you-to-use-its-new-local-ai-assistant-to-control-your-smart-home" target="_blank">Forget Alexa — UGreen wants you to use its new local AI assistant to control your smart home</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-to-find-the-best-free-alternatives-to-things-i-pay-for-these-7-recommendations-worked-the-best" target="_blank">I asked ChatGPT and Gemini to find the best free alternatives to things I pay for — these 7 recommendations worked the best</a></li><li><a href="https://www.tomsguide.com/ai/gemini-just-got-a-floating-bubble-multitasking-upgrade-thats-a-game-changer-on-android-phones-heres-how-to-use-it" target="_blank">Gemini just got a 'floating bubble' multitasking upgrade that's a game changer on Android phones — here's how to use it</a></li></ul><div data-widget-type="comparison" data-model-name="Samsung Galaxy Z Fold 8 Ultra"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/7-chatgpt-prompts-that-could-help-cut-your-monthly-expenses-including-one-that-lowered-3-of-my-bills</link>
                                                                            <description>
                            <![CDATA[ These ChatGPT prompts could help you budget better and save more money every month—one of them certainly did and helped me lower my subscription costs. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Mwg3XNXfniWnNKBc5AKVgf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hL8rrpL5NKE77SrztQgJn9-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[ChatGPT]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/hL8rrpL5NKE77SrztQgJn9-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[chatgpt]]></media:description>                                                            <media:text><![CDATA[chatgpt]]></media:text>
                                <media:title type="plain"><![CDATA[chatgpt]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hL8rrpL5NKE77SrztQgJn9-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I make it a habit of examining every part of my debit and credit card expenses, which entails constantly being paranoid and opening my banking apps every hour.</p><p>By the time every month wraps up, I take note of all the recurring costs that hit me. The recent increases in prices for streaming service subscriptions have caused me to take a step back and ask myself, “Do I really need to stay on my current plan? Or should I just move over to a cheaper one?” I figured I’d step on over to ChatGPT and see if it could help me break down the intricacies of my financial inner thoughts and lay out some answers on how I should proceed.</p><p>Not only did I ask ChatGPT to drum up a list of inquiries I could present to it that could help me and anyone else save a few bucks, but I also used its combined feedback and my own research to make some beneficial financial decisions.</p><p>Here are the seven best prompts that turn ChatGPT into your expert spending detective. One of them certainly accomplished that on my end, as it inspired me to cut three of my monthly subscription costs.</p><h2 id="prompts-meant-to-help-you-improve-your-spending-habits">Prompts meant to help you improve your spending habits</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZjwbzeuEfAFMRoSBSiDgYU" name="shutterstock_2627531291-2" alt="chatgpt" src="https://cdn.mos.cms.futurecdn.net/ZjwbzeuEfAFMRoSBSiDgYU-1920-80.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: Shutterstock)</span></figcaption></figure><p>With different approaches to lessening the monthly hits to your bank account, these ChatGPT-generated prompts could help you achieve that goal:</p><ul><li><strong>The Subscription Killer: </strong><em>Here is a list of everything I pay for each month: [paste subscriptions and recurring expenses]. Find anything I could cancel, downgrade, replace with a cheaper alternative, share, negotiate, or pay for less frequently. Estimate my monthly and annual savings for each recommendation. Prioritize changes that would have little or no impact on my quality of life.</em></li><li><strong>The Money Leak Finder: </strong><em>I want to save as much money as reasonably possible every month without making my life miserable. Here are my monthly expenses: [paste expenses]. Analyze them like a ruthless money-saving expert. Identify the 10 biggest opportunities to cut spending, rank them by how much I could realistically save, and separate easy wins from changes that would require more sacrifice. Don't give me generic advice like ‘spend less.’ Give me specific actions I can take this month.</em></li><li><strong>The $500 Challenge: </strong><em>Help me find a realistic way to save an extra $500 this month. Analyze these expenses [paste expenses] and create a specific 30-day money-saving challenge. Break the $500 goal into individual actions, tell me exactly how much each action could save, and prioritize the easiest wins. I don't want to earn extra money—I want to save money I would otherwise spend.</em></li><li><strong>The Grocery Bill Cutter: </strong><em>I want to reduce my grocery spending without eating worse. Here is what I typically buy and spend: [paste grocery list/budget]. Find the biggest sources of unnecessary spending and create a cheaper shopping strategy. Suggest specific substitutions, cheaper meal ideas, bulk-buy opportunities, and things I should stop buying. Give me an estimated monthly savings target.</em></li><li><strong>The Cheaper Alternative Finder: </strong><em>I'm going to paste a list of things I regularly spend money on. For each one, find a cheaper way to get essentially the same benefit. Consider free alternatives, cheaper brands, memberships I already have, library resources, used/refurbished options, DIY solutions, and services I may already have access to. Don't recommend inferior alternatives just because they're cheaper. Rank your recommendations by the combination of savings and convenience.</em></li><li><strong>The Spending Interrogator: </strong><em>Before I buy anything that isn't essential, I want you to challenge the purchase. Whenever I give you an item and its price, ask me the questions that will determine whether I actually need it. Calculate the opportunity cost of buying it, suggest cheaper alternatives if appropriate, and tell me what I could save if I don't buy it. Be honest and skeptical rather than encouraging me to make the purchase.</em></li><li><strong>The Monthly Savings Autopilot: </strong><em>I want to make saving money as automatic as possible. Based on my monthly income of [amount], fixed expenses of [amount], variable expenses of [amount], debts of [amount], and current savings of [amount], design a simple monthly system that maximizes how much I can save. Tell me what to automate, which expenses to put limits on, how much I should set aside each payday, and what spending categories I should monitor. Make the system realistic enough that I can actually stick with it.</em></li></ul><h2 id="using-one-of-those-prompts-to-help-me-tackle-my-monthly-subscriptions">Using one of those prompts to help me tackle my monthly subscriptions</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7HCmdtNxyhUYDvJTehh9fP" name="shutterstock_2496802419-2" alt="work from home" src="https://cdn.mos.cms.futurecdn.net/7HCmdtNxyhUYDvJTehh9fP-1920-80.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: Shutterstock)</span></figcaption></figure><p>I made great use of “The Subscription Killer” prompt to figure out what subscriptions of mine needed a lower, cheaper tier and which ones could be canceled completely. Here are the recurring expenses I told ChatGPT about:</p><ul><li><strong>Patreon</strong> - $12</li><li><strong>HBO Max</strong> - $18.49</li><li><strong>Netflix</strong> - $21.76</li><li><strong>Hulu & Disney+</strong> - $76</li><li><strong>Crunchyroll</strong> - $10.88</li><li><strong>Experian</strong> - $27.21</li></ul><p>ChatGPT proceeded to lay out its recommendations for which streaming services I should consider downgrading or canceling altogether. The three that made me seriously consider taking either of those options were Netflix, Crunchyroll and Experian. The chatbot told me to contemplate turning my Standard Netflix subscription to the Standard one with ads, changing my monthly Crunchyroll subscription into the annual Fan version and switching to Experian’s free subscription model.</p><p>For Netflix, I did some research to see what the common consensus was about the rate of ads (and level of annoyance) that come with Netflix's cheaper $8.99 (plus tax) plan. <a href="https://thestreamable.com/how-many-ads-does-each-streaming-service-show#which-streamers-had-the-best-ad-experiences" target="_blank">The Streamable</a> noted that Netflix has the best ad experience of all the streaming services, plus <a href="https://www.whats-on-netflix.com/what-to-watch/movies-and-series-unavailable-on-netflixs-ad-tier/" target="_blank">What’s On Netflix</a> highlighted all the content that’s unavailable on the ad-supported subscription tier. Since I had 0 interest in all of the films and shows from that aforementioned list and was willing to sit through a few commercials to enjoy Netflix’s other content offerings, I decided to adopt the streaming service’s Standard with ads plan to save me a few extra dollars every month.</p><p>As for Crunchyroll, I took it up on its offer of saving an extra 16% on its yearly Fan subscription and leaving its monthly version of that tier behind. And finally, I logged into my Experian account to change my Creditworks Premium subscription plan to the free option—since I have a Chase Bank account that gives me access to an additional free credit score report, I figured it’d make sense for me to have access to both Experian and Chase’s credit summary benefits without having to pay a single dime.</p><h2 id="the-takeaway-2">The takeaway</h2><p>At the end of my money-saving session with ChatGPT, I knocked down my combined monthly expense for all three subscriptions from $59.85 to $18.12. Downgrading my Netflix tier from $19.99+ a month to $8.99+ a month, going from paying Crunchyroll $9.99+ every month to $8.33+ every month with a more comfortable annual fee and adopting Experian’s free subscription model ended up being the most cost-effective decisions I’ve made in a while.</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/home/smart-home/forget-alexa-and-google-ugreen-wants-you-to-use-its-new-local-ai-assistant-to-control-your-smart-home" target="_blank">Forget Alexa — UGreen wants you to use its new local AI assistant to control your smart home</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-to-find-the-best-free-alternatives-to-things-i-pay-for-these-7-recommendations-worked-the-best" target="_blank">I asked ChatGPT and Gemini to find the best free alternatives to things I pay for — these 7 recommendations worked the best</a></li><li><a href="https://www.tomsguide.com/ai/gemini-just-got-a-floating-bubble-multitasking-upgrade-thats-a-game-changer-on-android-phones-heres-how-to-use-it" target="_blank">Gemini just got a 'floating bubble' multitasking upgrade that's a game changer on Android phones — here's how to use it</a></li></ul><div data-widget-type="comparison" data-model-name="Samsung Galaxy Z Fold 8 Ultra"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'I haven't farted since 1971': Gary Oldman on what separates him from Jackson Lamb ahead of 'Slow Horses' season 6 ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><a data-analytics-id="inline-link" href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far"><strong>Read our "Slow Horses" season 6 review</strong></a></li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p>"Slow Horses" season 6 is coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> later this week. Ahead of its September 16 premiere on Apple's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service,</a> I got a chance to sit in on a virtual press conference with the show's star, Sir Gary Oldman, who was in Edinburgh to receive the Edinburgh TV Festival's Global Icon Award.</p><p>It was an enlightening exchange; admittedly, any conversation with Sir Gary is likely to be enlightening. But over the course of a half-hour, the iconic actor discussed what separates him from the odorous spymaster he plays on TV, what it's like to work with Olivia Cooke, Jack Lowden and the rest of the Slough House crew, and why it's so important to him that the show delivers a new season every year to its fans.</p><p>Last week, I wrote about his comments regarding <a href="https://www.tomsguide.com/entertainment/apple-tv/gary-oldman-on-slow-horses-season-6-new-and-familiar-faces-to-expect-including-the-return-of-olivia-cooke">the return of Olivia Cooke to "Slow Horses" season 6</a>. Today, I wanted to bring you his thoughts on the Emmy Award-nominated character he portrays in the spy thriller. Here's <strong>Gary Oldman on what separates him from Jackson Lamb going into "Slow Horses" season 6</strong>. And don't forget to check out our <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">spoiler-free review of "Slow Horses" season 6</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async></script><h2 id="39-jackson-lamb-has-no-filter-39">'Jackson Lamb has no filter'</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="ge5qBpqJuJmWqDqq2eknYc" name="slowhorses-season4.jpg" alt="Gary Oldman as Jackson Lamb on the phone in Slow Horses season 4" src="https://cdn.mos.cms.futurecdn.net/ge5qBpqJuJmWqDqq2eknYc-1920-80.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 TV Plus)</span></figcaption></figure><p>With the way actors sink into a character these days, and given that Oldman has now played Lamb since 2022, it's fair to wonder if he and the character have started to merge. But the veteran actor was quick to quash that idea when asked.</p><p>"Well, I would hope not," Oldman responded when asked if he had picked up any of Lamb's bad habits. "[I] don't smoke. I don't drink anymore. I'm much softer than ... Jackson Lamb has no filter. So he'll be very, very direct with people. And I don't want confrontation. Life's too short."</p><div><blockquote><p>"Well, I would hope not."</p><p>Sir Gary Oldman on if he's picked up Jackson Lamb's bad habits</p></blockquote></div><p>Of course, that's not to say the actor thinks he was always a model citizen. "Maybe I liked to sort of, you know, rough it up a bit when I was younger," he explained. "But I'm far too ... I don't want to hurt people's feelings. I don't want to make people feel less than or uncomfortable. And Lamb, he does a bit. There's a side of him that actually takes pleasure in that. So I hope I've not picked up anything [from Lamb]."</p><h2 id="gary-oldman-wants-you-to-stop-asking-his-castmates-if-he-smells">Gary Oldman wants you to stop asking his castmates if he smells</h2><p>One of Lamb's defining characteristics is the general foul odor that comes alongside his foul temper. And Oldman was quick to point out that just because Lamb smells bad doesn't mean Sir Gary smells bad on set.</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="bYCy4zRrx5PGuwsVaEPUVE" name="slow-horses-s6" alt="Gary Oldman as Jackson Lamb in "Slow Horses"" src="https://cdn.mos.cms.futurecdn.net/bYCy4zRrx5PGuwsVaEPUVE-1920-80.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: Apple TV)</span></figcaption></figure><div><blockquote><p>"I haven't farted since 1971" </p><p>Sir Gary Oldman on how he and Jackson Lamb differ in a major way</p></blockquote></div><p>"I don't smell," Oldman quickly retorted when asked whether his on-screen aroma was authentic. "People ask Kristen Scott Thomas and Jack Lowden, 'Does he smell?' Well, I don't smell. It's all smoke and mirrors, you know. It's all makeup and hair gel."</p><p>That said, Oldman did admit that he can slip into Lamb in an instant if needed, smelly or not. "It gets some of your skin a bit," Sir Gary explained. "It's not that you're conscious of Jackson Lamb in your everyday life, or when I'm not doing it. But he's there."</p><p>Oldman then reminisced about some past roles where he's been able to flip a switch and become the person he's playing. "I've done it with [Harry] Potter, and I've done it with the [Christopher Nolan] Batman trilogy. But that was sort of infrequent. It's not as continuous as this [portraying Lamb]."</p><p><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></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/entertainment/hulu/3-new-hulu-shows-you-need-to-binge-watch-this-weekend-sept-11-13">3 new Hulu shows you need to binge-watch this weekend (Sept. 11-13)</a></li><li><a href="https://www.tomsguide.com/us/get-sunday-ticket-without-directv,review-3811.html">How to get NFL Sunday Ticket for 2026-2027 season — Pricing, where to watch and more</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/i-havent-farted-since-1971-gary-oldman-on-what-separates-him-from-jackson-lamb-ahead-of-slow-horses-season-6</link>
                                                                            <description>
                            <![CDATA[ Sir Gary Oldman discusses how he's far different from his character, Jackson Lamb, ahead of "Slow Horses" season 6. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9uUcewRGxuYCsLCQr7RNrK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GQukLg5pzEy6EdLohrpojB-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Sun, 13 Sep 2026 12:31:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/GQukLg5pzEy6EdLohrpojB-1920-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sir Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot; season 5 on Apple TV.]]></media:description>                                                            <media:text><![CDATA[Sir Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot; season 5 on Apple TV.]]></media:text>
                                <media:title type="plain"><![CDATA[Sir Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot; season 5 on Apple TV.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GQukLg5pzEy6EdLohrpojB-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><a data-analytics-id="inline-link" href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far"><strong>Read our "Slow Horses" season 6 review</strong></a></li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p>"Slow Horses" season 6 is coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> later this week. Ahead of its September 16 premiere on Apple's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service,</a> I got a chance to sit in on a virtual press conference with the show's star, Sir Gary Oldman, who was in Edinburgh to receive the Edinburgh TV Festival's Global Icon Award.</p><p>It was an enlightening exchange; admittedly, any conversation with Sir Gary is likely to be enlightening. But over the course of a half-hour, the iconic actor discussed what separates him from the odorous spymaster he plays on TV, what it's like to work with Olivia Cooke, Jack Lowden and the rest of the Slough House crew, and why it's so important to him that the show delivers a new season every year to its fans.</p><p>Last week, I wrote about his comments regarding <a href="https://www.tomsguide.com/entertainment/apple-tv/gary-oldman-on-slow-horses-season-6-new-and-familiar-faces-to-expect-including-the-return-of-olivia-cooke">the return of Olivia Cooke to "Slow Horses" season 6</a>. Today, I wanted to bring you his thoughts on the Emmy Award-nominated character he portrays in the spy thriller. Here's <strong>Gary Oldman on what separates him from Jackson Lamb going into "Slow Horses" season 6</strong>. And don't forget to check out our <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">spoiler-free review of "Slow Horses" season 6</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async></script><h2 id="39-jackson-lamb-has-no-filter-39">'Jackson Lamb has no filter'</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="ge5qBpqJuJmWqDqq2eknYc" name="slowhorses-season4.jpg" alt="Gary Oldman as Jackson Lamb on the phone in Slow Horses season 4" src="https://cdn.mos.cms.futurecdn.net/ge5qBpqJuJmWqDqq2eknYc-1920-80.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 TV Plus)</span></figcaption></figure><p>With the way actors sink into a character these days, and given that Oldman has now played Lamb since 2022, it's fair to wonder if he and the character have started to merge. But the veteran actor was quick to quash that idea when asked.</p><p>"Well, I would hope not," Oldman responded when asked if he had picked up any of Lamb's bad habits. "[I] don't smoke. I don't drink anymore. I'm much softer than ... Jackson Lamb has no filter. So he'll be very, very direct with people. And I don't want confrontation. Life's too short."</p><div><blockquote><p>"Well, I would hope not."</p><p>Sir Gary Oldman on if he's picked up Jackson Lamb's bad habits</p></blockquote></div><p>Of course, that's not to say the actor thinks he was always a model citizen. "Maybe I liked to sort of, you know, rough it up a bit when I was younger," he explained. "But I'm far too ... I don't want to hurt people's feelings. I don't want to make people feel less than or uncomfortable. And Lamb, he does a bit. There's a side of him that actually takes pleasure in that. So I hope I've not picked up anything [from Lamb]."</p><h2 id="gary-oldman-wants-you-to-stop-asking-his-castmates-if-he-smells">Gary Oldman wants you to stop asking his castmates if he smells</h2><p>One of Lamb's defining characteristics is the general foul odor that comes alongside his foul temper. And Oldman was quick to point out that just because Lamb smells bad doesn't mean Sir Gary smells bad on set.</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="bYCy4zRrx5PGuwsVaEPUVE" name="slow-horses-s6" alt="Gary Oldman as Jackson Lamb in "Slow Horses"" src="https://cdn.mos.cms.futurecdn.net/bYCy4zRrx5PGuwsVaEPUVE-1920-80.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: Apple TV)</span></figcaption></figure><div><blockquote><p>"I haven't farted since 1971" </p><p>Sir Gary Oldman on how he and Jackson Lamb differ in a major way</p></blockquote></div><p>"I don't smell," Oldman quickly retorted when asked whether his on-screen aroma was authentic. "People ask Kristen Scott Thomas and Jack Lowden, 'Does he smell?' Well, I don't smell. It's all smoke and mirrors, you know. It's all makeup and hair gel."</p><p>That said, Oldman did admit that he can slip into Lamb in an instant if needed, smelly or not. "It gets some of your skin a bit," Sir Gary explained. "It's not that you're conscious of Jackson Lamb in your everyday life, or when I'm not doing it. But he's there."</p><p>Oldman then reminisced about some past roles where he's been able to flip a switch and become the person he's playing. "I've done it with [Harry] Potter, and I've done it with the [Christopher Nolan] Batman trilogy. But that was sort of infrequent. It's not as continuous as this [portraying Lamb]."</p><p><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></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/entertainment/hulu/3-new-hulu-shows-you-need-to-binge-watch-this-weekend-sept-11-13">3 new Hulu shows you need to binge-watch this weekend (Sept. 11-13)</a></li><li><a href="https://www.tomsguide.com/us/get-sunday-ticket-without-directv,review-3811.html">How to get NFL Sunday Ticket for 2026-2027 season — Pricing, where to watch and more</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I teach people to build functional strength in their 50s and 60s: Here's a 3-move bodyweight workout you should try ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I am lucky enough to travel for work, and recently, I flew out to <a href="https://oleaallsuitehotel.com/" target="_blank" rel="nofollow">Olea All Suite</a> in Zakynthos for a work fitness trip. As a trainer, fitness editor and all-round fitness nerd, I like to keep my routine up while I'm away, plus exercise helps me boost mindfulness when I'm very busy, so I was curious about what facilities would be available.</p><p>Luckily, I had more than enough gym equipment to play with, but that's not the case for everyone, everywhere, all the time, so I decided to create a short but effective three-move bodyweight workout you can do with just one of the <a href="https://www.tomsguide.com/best-picks/best-yoga-mats">best yoga mats </a>and nothing else. </p><p>I teach a lot of people in their 50s and 60s, and while some of these clients love the gym, others want to exercise at home with little gym equipment, so building functional strength can take a "back to basics" approach, which is exactly what this workout does. </p><p>Ready? Me too, let's get stuck in. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="watch-3-move-bodyweight-workout-you-can-try-anywhere">Watch: 3-move bodyweight workout you can try anywhere</h2><p>Resistance training is your anti-aging weapon for healthier joints and stronger muscles as you get older. Plus, with hormonal shifts, your metabolism can also take a bit of a dive later in life, so the more lean muscle mass you have, the faster your resting metabolism can become.</p><p>These tried-and-tested bodyweight exercises can be made more beginner-friendly or challenging, and you can add weights if you have them to further increase the load. If you don't have equipment, adjust the reps, sets, or tempo to add more work.</p><p><em>If you experience pain at any time, stop and rest. If you're working with an injury or health condition, I recommend seeking advice before starting these exercises.</em></p><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/DdHj65LxEhC/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><p><u><strong>The routine</strong></u></p><p><strong>Reps:</strong> 2/4/6/8/10...</p><p><strong>Timer:</strong> 10 minutes.</p><p>Set a timer, then complete 2 reps of each exercise back-to-back. Rest for no more than 10 seconds, then repeat for 4 reps per exercise. Move through as many rounds, adding 2 reps to each move each time.</p><ul><li><strong>Pike push-ups: </strong>Start in a downward dog, then walk your feet a few inches closer to your hands. Engage your core and softly bend your knees if you have tight hamstrings. Shift your weight forward slightly, then bend your elbows and lower the crown of your head until it touches the ground just in front of your hands. Press up and push back into the downward dog position. To begin with, you could place a cushion or some blocks in front of your hands to make things easier.</li><li><strong>Push-ups: </strong>Start in a high plank position with your shoulders directly over your wrists. You could place your knees down for extra support. Engage your core, then bend your elbows and lower your chest toward the mat. Pause at the bottom, then press the ground away to return to your starting position. For an extra challenge, release your hands from the ground at the bottom of the push-up, while keeping your stomach, hips and thighs lifted.</li><li><strong>V-ups: </strong>Lie on your back with your arms and legs extended. Engage your core and tuck your chin slightly. Lift your arms and legs into the air to touch overhead, peeling your shoulders away from the mat with control. Pause, then lower to the ground again. If this feels too challenging, bend your knees and tuck them toward your chest as you sit up, or alternate with one arm and the opposite leg, then switch sides.</li></ul><h2 id="what-are-the-benefits-2">What are the benefits?</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:7346px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QyBKfj8nxDRBitwBnjwg7F" name="shutterstock_2632770159" alt="a senior woman holding a Pilates ball" src="https://cdn.mos.cms.futurecdn.net/QyBKfj8nxDRBitwBnjwg7F-1920-80.jpg" mos="" align="middle" fullscreen="" width="7346" height="4132" 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 are some benefits:</p><p><strong>Pike push-ups </strong>imitate an overhead press without weights. Instead, you create a vertical downward position for your body, then use your body weight and resistance against gravity to create load. This move works your upper body and core hard, particularly your shoulders, upper chest, upper back and triceps. You might not think it, but you could actually start on your knees and practice the pike, or elevate them if you prefer.</p><p><strong>Push-ups </strong>are perhaps the most well-known upper-body bodyweight exercise. You'll work your pecs, triceps and shoulders and use your core for stability. You can use your knees to begin with, but before you try full-range push-ups, ensure you can lower your chest to the ground for full range of motion. This keeps the muscles under tension for longer and helps build functional upper-body strength.</p><p><strong>V-ups </strong>are primarily a core exercise, working the deeper stabilizing muscles of your core, as well as your abs and obliques. However, you'll also feel this move in your hip flexors, quads and hamstrings. Some people feel this move a little in the arms and upper back as well. You'll need an existing amount of core strength and mobility to drive this exercise, so if you find it too difficult, alternate with one arm and leg or bend your knees to crunch instead.</p><div><blockquote><p>These tried-and-tested bodyweight exercises can be made more beginner-friendly or challenging.</p></blockquote></div><p>I don't subscribe to the idea that the exercises or routines you enjoy must change just because the number on your birthday card does. I still train my dad in the gym, and he's deadlifting 100kg at 72 years old. However, what matters are your levels of fitness, any health conditions, injuries, or illnesses, and your preferences.</p><div><blockquote><p>I don't subscribe to the idea that the exercises or routines you enjoy must change just because the number on your birthday card does.</p></blockquote></div><p>Firstly, <a href="https://www.tomsguide.com/wellness/fitness/these-are-the-5-compound-exercises-you-should-do-to-build-full-body-functional-strength-and-muscle-says-a-personal-trainer">compound exercises </a>that are both functional and progressive should be a top priority. Think your standard overhead press, squats, push-ups, bench presses, lunges and step-ups. Resistance training can be done using your bodyweight and weights, but whichever you choose, aim for an intensity that feels close to failure with the last few reps challenging to finish.</p><p>Try to move your joints through their range of motion in a variety of patterns while loading muscles using any form of resistance. Motion is lotion, so keeping your body moving in ways that feel natural will help improve functional strength and mobility.</p><p>The more you move throughout the day, the better you can also balance and stabilize; the more you load your bones and muscles, the stronger they get. You might still enjoy some higher-intensity exercise in your 50s and beyond, but low-impact movement can offer brilliant benefits. Think of the strength, flexibility and power you can build in yoga, or the core stability, posture and balance Pilates offers.</p><p>Before you consider adding weights, focus on the fullest range of movement and really squeezing the working muscles at the top of each rep. Control is essential, so prioritize your form and speed. And remember, you might not notice the progress straight away, but over time, you'll see huge benefits in how your body moves, adapts and responds. </p><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank">I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/according-to-a-personal-trainer-this-exercise-is-100-times-more-effective-than-crunches-i-tried-it-and-was-humbled" target="_blank">According to a personal trainer, this exercise is 100 times more effective than crunches. I tried it and was humbled</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-over-50-to-be-mobile-3-low-impact-moves-that-build-more-stability-than-a-30-minute-walk" target="_blank">I teach people over 50 to be mobile: 3 low-impact moves that build more stability than a 30-minute walk</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/workouts/i-teach-people-to-build-functional-strength-in-their-50s-and-60s-heres-a-3-move-bodyweight-workout-you-should-try</link>
                                                                            <description>
                            <![CDATA[ A personal trainer shares a three-move bodyweight workout you can do to build strength at home without any equipment. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HdaFpgwk4SboQETTPr2dae</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/F78zGtnY9VYQRUeMHQbL6L-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Sat, 12 Sep 2026 12:20:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Workouts]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                <author><![CDATA[ sam.hopes@futurenet.com (Sam Hopes) ]]></author>                    <dc:creator><![CDATA[ Sam Hopes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jZ88qJqvjWaCXXv3qvUQPA-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Sam Hopes is a level 3 qualified trainer, a level 2 Reiki practitioner and a fitness editor at Tom&#039;s Guide. She is also currently undertaking her Yoga For Athletes training course. Sam has written for various fitness brands and websites over the years and has experience across brands at Future, such as &lt;a href=&quot;https://www.livescience.com/author/sam-hopes&quot;&gt;Live Science&lt;/a&gt;,&lt;a href=&quot;https://www.fitandwell.com/author/sam-hopes&quot;&gt; Fit&amp;amp;Well&lt;/a&gt;,&lt;a href=&quot;https://www.coachweb.com/author/sam-hopes&quot;&gt; Coach&lt;/a&gt;, and T3. &lt;/p&gt;&lt;p&gt;Having worked with fitness studios like F45 and Virgin Active and trained both group and 1:1, Sam now primarily teaches outdoor bootcamps, bodyweight, and kettlebells. She also coaches mobility and flexibility classes several times a week and believes that true strength comes from a holistic approach to training your body. &lt;/p&gt;&lt;p&gt;Sam has completed two mixed doubles Hyrox competitions in London and the Netherlands and finished her first doubles attempt in 1:11.&lt;/p&gt;&lt;p&gt;In her spare time, she enjoys CrossFit, hot yoga, Pilates and running and can be found perfecting her handstand walks and handstand push-ups in the gym whenever she has the chance to be upside down. At work, she can be found testing the latest in fitness technology and wearables, anything yoga and CrossFit-related and has a keen interest in nutrition, mindfulness, sleep and recovery.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/F78zGtnY9VYQRUeMHQbL6L-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a man in his 50s working out]]></media:description>                                                            <media:text><![CDATA[a man in his 50s working out]]></media:text>
                                <media:title type="plain"><![CDATA[a man in his 50s working out]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/F78zGtnY9VYQRUeMHQbL6L-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I am lucky enough to travel for work, and recently, I flew out to <a href="https://oleaallsuitehotel.com/" target="_blank" rel="nofollow">Olea All Suite</a> in Zakynthos for a work fitness trip. As a trainer, fitness editor and all-round fitness nerd, I like to keep my routine up while I'm away, plus exercise helps me boost mindfulness when I'm very busy, so I was curious about what facilities would be available.</p><p>Luckily, I had more than enough gym equipment to play with, but that's not the case for everyone, everywhere, all the time, so I decided to create a short but effective three-move bodyweight workout you can do with just one of the <a href="https://www.tomsguide.com/best-picks/best-yoga-mats">best yoga mats </a>and nothing else. </p><p>I teach a lot of people in their 50s and 60s, and while some of these clients love the gym, others want to exercise at home with little gym equipment, so building functional strength can take a "back to basics" approach, which is exactly what this workout does. </p><p>Ready? Me too, let's get stuck in. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="watch-3-move-bodyweight-workout-you-can-try-anywhere">Watch: 3-move bodyweight workout you can try anywhere</h2><p>Resistance training is your anti-aging weapon for healthier joints and stronger muscles as you get older. Plus, with hormonal shifts, your metabolism can also take a bit of a dive later in life, so the more lean muscle mass you have, the faster your resting metabolism can become.</p><p>These tried-and-tested bodyweight exercises can be made more beginner-friendly or challenging, and you can add weights if you have them to further increase the load. If you don't have equipment, adjust the reps, sets, or tempo to add more work.</p><p><em>If you experience pain at any time, stop and rest. If you're working with an injury or health condition, I recommend seeking advice before starting these exercises.</em></p><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/DdHj65LxEhC/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><p><u><strong>The routine</strong></u></p><p><strong>Reps:</strong> 2/4/6/8/10...</p><p><strong>Timer:</strong> 10 minutes.</p><p>Set a timer, then complete 2 reps of each exercise back-to-back. Rest for no more than 10 seconds, then repeat for 4 reps per exercise. Move through as many rounds, adding 2 reps to each move each time.</p><ul><li><strong>Pike push-ups: </strong>Start in a downward dog, then walk your feet a few inches closer to your hands. Engage your core and softly bend your knees if you have tight hamstrings. Shift your weight forward slightly, then bend your elbows and lower the crown of your head until it touches the ground just in front of your hands. Press up and push back into the downward dog position. To begin with, you could place a cushion or some blocks in front of your hands to make things easier.</li><li><strong>Push-ups: </strong>Start in a high plank position with your shoulders directly over your wrists. You could place your knees down for extra support. Engage your core, then bend your elbows and lower your chest toward the mat. Pause at the bottom, then press the ground away to return to your starting position. For an extra challenge, release your hands from the ground at the bottom of the push-up, while keeping your stomach, hips and thighs lifted.</li><li><strong>V-ups: </strong>Lie on your back with your arms and legs extended. Engage your core and tuck your chin slightly. Lift your arms and legs into the air to touch overhead, peeling your shoulders away from the mat with control. Pause, then lower to the ground again. If this feels too challenging, bend your knees and tuck them toward your chest as you sit up, or alternate with one arm and the opposite leg, then switch sides.</li></ul><h2 id="what-are-the-benefits-2">What are the benefits?</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:7346px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QyBKfj8nxDRBitwBnjwg7F" name="shutterstock_2632770159" alt="a senior woman holding a Pilates ball" src="https://cdn.mos.cms.futurecdn.net/QyBKfj8nxDRBitwBnjwg7F-1920-80.jpg" mos="" align="middle" fullscreen="" width="7346" height="4132" 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 are some benefits:</p><p><strong>Pike push-ups </strong>imitate an overhead press without weights. Instead, you create a vertical downward position for your body, then use your body weight and resistance against gravity to create load. This move works your upper body and core hard, particularly your shoulders, upper chest, upper back and triceps. You might not think it, but you could actually start on your knees and practice the pike, or elevate them if you prefer.</p><p><strong>Push-ups </strong>are perhaps the most well-known upper-body bodyweight exercise. You'll work your pecs, triceps and shoulders and use your core for stability. You can use your knees to begin with, but before you try full-range push-ups, ensure you can lower your chest to the ground for full range of motion. This keeps the muscles under tension for longer and helps build functional upper-body strength.</p><p><strong>V-ups </strong>are primarily a core exercise, working the deeper stabilizing muscles of your core, as well as your abs and obliques. However, you'll also feel this move in your hip flexors, quads and hamstrings. Some people feel this move a little in the arms and upper back as well. You'll need an existing amount of core strength and mobility to drive this exercise, so if you find it too difficult, alternate with one arm and leg or bend your knees to crunch instead.</p><div><blockquote><p>These tried-and-tested bodyweight exercises can be made more beginner-friendly or challenging.</p></blockquote></div><p>I don't subscribe to the idea that the exercises or routines you enjoy must change just because the number on your birthday card does. I still train my dad in the gym, and he's deadlifting 100kg at 72 years old. However, what matters are your levels of fitness, any health conditions, injuries, or illnesses, and your preferences.</p><div><blockquote><p>I don't subscribe to the idea that the exercises or routines you enjoy must change just because the number on your birthday card does.</p></blockquote></div><p>Firstly, <a href="https://www.tomsguide.com/wellness/fitness/these-are-the-5-compound-exercises-you-should-do-to-build-full-body-functional-strength-and-muscle-says-a-personal-trainer">compound exercises </a>that are both functional and progressive should be a top priority. Think your standard overhead press, squats, push-ups, bench presses, lunges and step-ups. Resistance training can be done using your bodyweight and weights, but whichever you choose, aim for an intensity that feels close to failure with the last few reps challenging to finish.</p><p>Try to move your joints through their range of motion in a variety of patterns while loading muscles using any form of resistance. Motion is lotion, so keeping your body moving in ways that feel natural will help improve functional strength and mobility.</p><p>The more you move throughout the day, the better you can also balance and stabilize; the more you load your bones and muscles, the stronger they get. You might still enjoy some higher-intensity exercise in your 50s and beyond, but low-impact movement can offer brilliant benefits. Think of the strength, flexibility and power you can build in yoga, or the core stability, posture and balance Pilates offers.</p><p>Before you consider adding weights, focus on the fullest range of movement and really squeezing the working muscles at the top of each rep. Control is essential, so prioritize your form and speed. And remember, you might not notice the progress straight away, but over time, you'll see huge benefits in how your body moves, adapts and responds. </p><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank">I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/according-to-a-personal-trainer-this-exercise-is-100-times-more-effective-than-crunches-i-tried-it-and-was-humbled" target="_blank">According to a personal trainer, this exercise is 100 times more effective than crunches. I tried it and was humbled</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-over-50-to-be-mobile-3-low-impact-moves-that-build-more-stability-than-a-30-minute-walk" target="_blank">I teach people over 50 to be mobile: 3 low-impact moves that build more stability than a 30-minute walk</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Think you know the Alien movies? This quiz will put your knowledge of the sci-fi franchise to the ultimate test ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve been a superfan of the <strong>Alien movies</strong> for more than two decades. Its combination of sci-fi thrills, spine-tingling horror, and compelling characters is unmatched in my eyes. It’s had its share of underwhelming entries, but it remains my favorite film franchise to this day. </p><p>That’s why I’ve created this Alien-themed quiz. These 10 questions celebrate the franchise’s decades-long legacy on the big screen and give my fellow Alien fans a chance to prove themselves the ultimate Xenomorph expert. The quiz covers every Alien movie (bar “AVP2"; we don’t talk about that one), and even tests your knowledge of the extended universe. </p><p>So whether you’ve been watching Alien movies since 1979, or you’re a newcomer who’s been playing catch-up in recent years, put your expertise to the test with my quiz. Can you score a perfect 10/10? To borrow a phrase, “I can't lie to you about your chances,” but I wish you good luck!</p><div style="min-height: 1300px;">                                <div class="kwizly-quiz kwizly-Od2Boe"></div>                            </div>                            <script src="https://kwizly.com/embed/Od2Boe.js" async></script><iframe title="How'd you do?" description="Too hard? Too easy? Let us know what you think in the comments." minimumCommentCount="0" class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>Want to test your movie knowledge further? Try our <a href="https://www.tomsguide.com/entertainment/movies/how-well-do-you-know-80s-thriller-movies-take-this-quiz-on-iconic-films-starring-harrison-ford-nicole-kidman-al-pacino-and-more">'80s thriller movies quiz</a>, which includes "Blade Runner" (another franchise close to my heart), or try my <a href="https://www.tomsguide.com/entertainment/movies/i-created-an-ultra-hard-movie-tagline-quiz-only-true-movie-buffs-will-get-a-10-10">movie tagline quiz</a> — but be warned, I made that one extra tricky. </p><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/play"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/fjuquiAyiHf8kntbZuDqKS.jpg" alt="A selection of Toms Guide Puzzles & Quizzes"></p></div><div class="card__content"><h3 class="card__title">Tom&#39;s Guide games</h3><div class="card__description-wrapper"><div class="card__description"><p>Play multiple choice, lystery, word searches, crosswords and guess the number – can you reach the top of the leaderboard?</p></div></div></div></a><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/membership"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/CtyBASsPQAuEKTsTEJu6YL.jpg" alt="A screenshot from the Tom's Guide website reading 'Everything you get as a member'"></p></div><div class="card__content"><h3 class="card__title">Tom&#39;s Guide Club</h3><div class="card__description-wrapper"><div class="card__description"><p>Join Tom’s Guide Club for free, to earn badges, talk to other members and Tom’s writers, get exclusive deals and more.</p></div></div></div></a><iframe title="How'd you do?" description="Too hard? Too easy? Let us know what you think in the comments." minimumCommentCount="0" class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>If you enjoyed this "Alien" movie quiz, then be sure to bookmark our <a href="https://www.tomsguide.com/tag/quiz">Quiz</a> section and visit our <a href="https://www.tomsguide.com/polls">Polls page</a> to have your say on all manner of subjects, from the best new movies of 2026 to the recently revealed iPhone Duo.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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/entertainment/movies/im-testing-your-70s-movie-knowledge-with-these-10-tricky-questions-from-star-wars-to-jaws">I’m testing your ’70s movie knowledge with these 10 tricky questions</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/how-well-do-you-know-80s-thriller-movies-take-this-quiz-on-iconic-films-starring-harrison-ford-nicole-kidman-al-pacino-and-more">How well do you know ‘80s thriller movies?</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/who-should-play-the-next-wolverine-cast-your-vote-and-put-your-x-men-knowledge-to-the-test">Who should play the next Wolverine? Cast your vote </a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/movies/think-you-know-the-alien-movies-this-quiz-will-put-your-knowledge-of-the-sci-fi-franchise-to-the-ultimate-test</link>
                                                                            <description>
                            <![CDATA[ Test your knowledge of the "Alien" movies with 10 questions that cover the entire sci-fi franchise, from "Aliens" to "Alien: Romulus." ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TAUUyyMjKknT348srtXsgk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/viFvfYacNWp2TvY34ec94W-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 11:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Movies]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/viFvfYacNWp2TvY34ec94W-1920-80.jpg">
                                                            <media:credit><![CDATA[20th Century Fox / Brandywine Productions]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xenomorph in Alien (1979) with a Tom&#039;s Guide Quiz badge]]></media:description>                                                            <media:text><![CDATA[Xenomorph in Alien (1979) with a Tom&#039;s Guide Quiz badge]]></media:text>
                                <media:title type="plain"><![CDATA[Xenomorph in Alien (1979) with a Tom&#039;s Guide Quiz badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/viFvfYacNWp2TvY34ec94W-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been a superfan of the <strong>Alien movies</strong> for more than two decades. Its combination of sci-fi thrills, spine-tingling horror, and compelling characters is unmatched in my eyes. It’s had its share of underwhelming entries, but it remains my favorite film franchise to this day. </p><p>That’s why I’ve created this Alien-themed quiz. These 10 questions celebrate the franchise’s decades-long legacy on the big screen and give my fellow Alien fans a chance to prove themselves the ultimate Xenomorph expert. The quiz covers every Alien movie (bar “AVP2"; we don’t talk about that one), and even tests your knowledge of the extended universe. </p><p>So whether you’ve been watching Alien movies since 1979, or you’re a newcomer who’s been playing catch-up in recent years, put your expertise to the test with my quiz. Can you score a perfect 10/10? To borrow a phrase, “I can't lie to you about your chances,” but I wish you good luck!</p><div style="min-height: 1300px;">                                <div class="kwizly-quiz kwizly-Od2Boe"></div>                            </div>                            <script src="https://kwizly.com/embed/Od2Boe.js" async></script><iframe title="How'd you do?" description="Too hard? Too easy? Let us know what you think in the comments." minimumCommentCount="0" class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>Want to test your movie knowledge further? Try our <a href="https://www.tomsguide.com/entertainment/movies/how-well-do-you-know-80s-thriller-movies-take-this-quiz-on-iconic-films-starring-harrison-ford-nicole-kidman-al-pacino-and-more">'80s thriller movies quiz</a>, which includes "Blade Runner" (another franchise close to my heart), or try my <a href="https://www.tomsguide.com/entertainment/movies/i-created-an-ultra-hard-movie-tagline-quiz-only-true-movie-buffs-will-get-a-10-10">movie tagline quiz</a> — but be warned, I made that one extra tricky. </p><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/play"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/fjuquiAyiHf8kntbZuDqKS.jpg" alt="A selection of Toms Guide Puzzles & Quizzes"></p></div><div class="card__content"><h3 class="card__title">Tom&#39;s Guide games</h3><div class="card__description-wrapper"><div class="card__description"><p>Play multiple choice, lystery, word searches, crosswords and guess the number – can you reach the top of the leaderboard?</p></div></div></div></a><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/membership"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/CtyBASsPQAuEKTsTEJu6YL.jpg" alt="A screenshot from the Tom's Guide website reading 'Everything you get as a member'"></p></div><div class="card__content"><h3 class="card__title">Tom&#39;s Guide Club</h3><div class="card__description-wrapper"><div class="card__description"><p>Join Tom’s Guide Club for free, to earn badges, talk to other members and Tom’s writers, get exclusive deals and more.</p></div></div></div></a><iframe title="How'd you do?" description="Too hard? Too easy? Let us know what you think in the comments." minimumCommentCount="0" class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>If you enjoyed this "Alien" movie quiz, then be sure to bookmark our <a href="https://www.tomsguide.com/tag/quiz">Quiz</a> section and visit our <a href="https://www.tomsguide.com/polls">Polls page</a> to have your say on all manner of subjects, from the best new movies of 2026 to the recently revealed iPhone Duo.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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/entertainment/movies/im-testing-your-70s-movie-knowledge-with-these-10-tricky-questions-from-star-wars-to-jaws">I’m testing your ’70s movie knowledge with these 10 tricky questions</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/how-well-do-you-know-80s-thriller-movies-take-this-quiz-on-iconic-films-starring-harrison-ford-nicole-kidman-al-pacino-and-more">How well do you know ‘80s thriller movies?</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/who-should-play-the-next-wolverine-cast-your-vote-and-put-your-x-men-knowledge-to-the-test">Who should play the next Wolverine? Cast your vote </a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I walked 29,000 steps with the Garmin Cirqa in Berlin — 5 things I learned along the way ]]></title>
                                                                                                <dc:content><![CDATA[ <p>One of my favorite aspects of being a technology journalist is getting to cover the debut of exciting new products at events like the Consumer Electronics Show (CES) in Las Vegas, Mobile World Congress (MWC) in Barcelona, and most recently the Internationale Funkausstellung show, aka Innovation for All (IFA) in Berlin.</p><p>With no shortage of ground to cover at each of these tech conferences, I’ve made a habit of treating each day as a marathon of sorts, tracking my stats via one of the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a> or <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">top smartwatches</a> I can find. </p><p>For <a href="https://www.tomsguide.com/tech-events/best-of-ifa-2026-we-found-the-26-top-new-gadgets">IFA 2026</a>, I opted to log my efforts using the new <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">Garmin Cirqa</a>, a screen-free tracker that’s comfortable, long-lasting, and discreet. Ultimately, it proved to be a competent wearable for the task, with one notable exception (more on that below).</p><p>With that said, here are the five biggest takeaways from logging my steps at IFA 2026 on the Garmin Cirqa. </p><h3 class="article-body__section" id="section-i-logged-28k-steps-at-ifa-in-berlin-on-the-garmin-cirqa"><span>I logged 28k steps at IFA in Berlin on the Garmin Cirqa </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:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="V8844e2pjd6QVLUUoh9FBn" name="ifa-lede-3" alt="A wide shot of Messe Berlin with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/V8844e2pjd6QVLUUoh9FBn-1920-80.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: IFA)</span></figcaption></figure><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Day 1</p></th><th  ><p>Day 2</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steps</strong></p></td><td  ><p>17,902 steps</p></td><td  ><p>10,628 steps</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>111 bpm</p></td><td  ><p>117 bpm</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>151 bpm</p></td><td  ><p>148 bpm</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned (total)</strong></p></td><td  ><p>2,407 calories </p></td><td  ><p>1,121 calories</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-1-i-covered-way-more-ground-than-expected-especially-on-day-1"><span>1. I covered way more ground than expected, especially on day 1</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.21%;"><img id="TrVGT7FHzWykpwioYKi8yn" name="Luna-Cirqa-01" alt="Close-up of the Garmin Cirqa screen-free tracker next to the Luna Band at IFA 2026 in Berlin" src="https://cdn.mos.cms.futurecdn.net/TrVGT7FHzWykpwioYKi8yn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1439" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Much to my surprise, I walked nearly 18,000 steps on my first day of IFA, which was technically a day before the show opened to the public (the press tends to get early access). </p><p>To be fair, the Berlin Messe is an absolutely sprawling conference complex, with no shortage of seemingly secret passages and tucked-away halls that are easy to stumble upon by accident but virtually impossible to find again when you’re <em>actually</em> looking for them.</p><p>This partially explains why my day one step count was so much higher than day two: I spent considerable time on the ground day one simply trying to get a lay of the land (in an admittedly very jet-lagged state). Day two, I had meetings scattered throughout the complex, and I didn’t want to be wandering around like a ding-dong.  </p><h3 class="article-body__section" id="section-2-i-logged-more-steps-on-day-1-of-ifa-than-any-single-day-covering-mwc"><span>2. I logged more steps on day 1 of IFA than any single day covering MWC</span></h3><p>At 17,902 steps, my day one of IFA coverage in Berlin beat my step count for any individual day of coverage at <a href="https://www.tomsguide.com/wellness/fitness/i-logged-37-miles-at-mwc-2026-on-my-garmin-instinct-3-here-are-5-things-i-learned">Mobile World Congress</a> in Barcelona back in March. That said, I spent a total of five days covering MWC compared to just two days covering IFA, for a total step count of 67,398 steps in Spain.</p><h3 class="article-body__section" id="section-3-but-ces-day-1-was-more-intense-than-both"><span>3. But CES day 1 was more intense than both</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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mnJPLoccAQFvxdEkQvxUQU" name="GarminCirqa-rev-02" alt="Close-up of the Garmin Cirqa on a user's wrist against a red background" src="https://cdn.mos.cms.futurecdn.net/mnJPLoccAQFvxdEkQvxUQU-1920-80.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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>While day one of IFA may have been a leg-burner, it falls a bit short of my total step count from day one of the <a href="https://www.tomsguide.com/wellness/smartwatches/i-walked-65-000-steps-with-the-garmin-venu-4-5-things-i-learned">Consumer Electronics Show</a> held in Las Vegas back in early January, where I logged a dog-barking 20,253 steps, more than double my everyday average back home. </p><p>Then again, as anyone who has been to CES likely knows, things are very spread out in Las Vegas, which also just might be the least pedestrian-friendly city in the U.S... want to cross the street? You'll need to walk another half-mile down the strip and wander through multiple casinos to do so.</p><h3 class="article-body__section" id="section-4-commuting-on-the-u-bahn-seemingly-skewed-garmin-s-distance-and-pace-data"><span>4. Commuting on the U-Bahn seemingly skewed Garmin's distance and pace data</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:5025px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="J8gQGtirDrYBxfay2N35UX" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/J8gQGtirDrYBxfay2N35UX-1920-80.jpg" mos="" align="middle" fullscreen="" width="5025" height="2827" 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>I didn’t include my distance or pace totals in the table above because it’s clear these figures are skewed. Both days of the show, I fired up a walking workout in the Cirqa upon leaving my hotel, trekked about half a mile to the nearest U-Bahn station — I am a nerd for experiencing public rail transit in new cities — and rode the metro roughly two miles to the show grounds. </p><p>Unfortunately, the Garmin Cirqa clearly interpreted this time spent riding the train as me moving at near-superhuman speed. For example, my average moving pace on day one of the show, according to Garmin, was 8 mins 41 secs per mile. Sure, I can maintain that pace when running a mile, but covering a trade show? Def not. </p><p>Garmin also said I walked 14.14 miles on day one, which would equal 1,266 steps per mile, way less than what I normally average, which is closer to 2,000 steps per mile. </p><h3 class="article-body__section" id="section-5-i-mostly-forgot-the-garmin-cirqa-was-even-there-but-might-not-wear-it-again"><span>5. I mostly forgot the Garmin Cirqa was even there, but might not wear it again</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:5144px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Rr535PFKqQMmtZpT74z88e" name="GarminCirqa-03" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/Rr535PFKqQMmtZpT74z88e-1920-80.jpg" mos="" align="middle" fullscreen="" width="5144" height="2893" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Ultimately, I opted to wear the Garmin Cirqa for two primary reasons. First, it’s comfortable and lightweight, so much so that I pretty much forgot it was even there. Second, I wanted to wear a mechanical watch on my left wrist to keep a constant eye on time; the nine-hour time difference between Seattle (where I live) and Berlin was my main rationale (also, I got a cool new watch I wanted to show off). </p><p>So, will I be wearing the Garmin Cirqa the next time I cover a major tech show? Honestly, probably not. While I appreciate how wrist-friendly it is, the lack of GPS means it has to piggyback off my smartphone’s signal, which isn’t necessarily ideal. Moreover, I’d rather opt for a wearable that’s capable of discerning time spent walking from time spent riding a subway. </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/wellness/smartwatches/i-biked-11-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2-and-the-winner-is-clear"><strong>I biked 11 miles with the Garmin Instinct 3 vs Samsung Galaxy Watch Ultra 2 — and the winner is clear</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-000-steps-with-the-pixel-watch-5-vs-samsung-galaxy-watch-9-and-we-have-a-new-android-champ"><strong>I walked 4,000 steps with the Pixel Watch 5 vs Samsung Galaxy Watch 9 — and we have a new Android champ</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-7-miles-with-the-apple-watch-ultra-3-vs-pixel-watch-5-and-the-winner-is-nearly-too-close-to-call"><strong>I walked 7 miles with the Apple Watch Ultra 3 vs Pixel Watch 5 — here's the winner</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/fitness-trackers/i-walked-29-000-steps-with-the-garmin-cirqa-in-berlin-5-things-i-learned-along-the-way</link>
                                                                            <description>
                            <![CDATA[ I logged my time covering the IFA tech show in Berlin using the new Garmin Cirqa screen-free fitness tracker. Here's what it did well and where it came up short. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">QHwqfVQwSFrpRdwkqY7RAY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sg3JXoV6C6r56Fnc9YzB6X-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 11:30:00 +0000</pubDate>                                                                                                                                <updated>Sun, 13 Sep 2026 22:40:12 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&gt;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sg3JXoV6C6r56Fnc9YzB6X-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin Cirqa]]></media:description>                                                            <media:text><![CDATA[Garmin Cirqa]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin Cirqa]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sg3JXoV6C6r56Fnc9YzB6X-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>One of my favorite aspects of being a technology journalist is getting to cover the debut of exciting new products at events like the Consumer Electronics Show (CES) in Las Vegas, Mobile World Congress (MWC) in Barcelona, and most recently the Internationale Funkausstellung show, aka Innovation for All (IFA) in Berlin.</p><p>With no shortage of ground to cover at each of these tech conferences, I’ve made a habit of treating each day as a marathon of sorts, tracking my stats via one of the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a> or <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">top smartwatches</a> I can find. </p><p>For <a href="https://www.tomsguide.com/tech-events/best-of-ifa-2026-we-found-the-26-top-new-gadgets">IFA 2026</a>, I opted to log my efforts using the new <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">Garmin Cirqa</a>, a screen-free tracker that’s comfortable, long-lasting, and discreet. Ultimately, it proved to be a competent wearable for the task, with one notable exception (more on that below).</p><p>With that said, here are the five biggest takeaways from logging my steps at IFA 2026 on the Garmin Cirqa. </p><h3 class="article-body__section" id="section-i-logged-28k-steps-at-ifa-in-berlin-on-the-garmin-cirqa"><span>I logged 28k steps at IFA in Berlin on the Garmin Cirqa </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:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="V8844e2pjd6QVLUUoh9FBn" name="ifa-lede-3" alt="A wide shot of Messe Berlin with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/V8844e2pjd6QVLUUoh9FBn-1920-80.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: IFA)</span></figcaption></figure><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Day 1</p></th><th  ><p>Day 2</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steps</strong></p></td><td  ><p>17,902 steps</p></td><td  ><p>10,628 steps</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>111 bpm</p></td><td  ><p>117 bpm</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>151 bpm</p></td><td  ><p>148 bpm</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned (total)</strong></p></td><td  ><p>2,407 calories </p></td><td  ><p>1,121 calories</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-1-i-covered-way-more-ground-than-expected-especially-on-day-1"><span>1. I covered way more ground than expected, especially on day 1</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.21%;"><img id="TrVGT7FHzWykpwioYKi8yn" name="Luna-Cirqa-01" alt="Close-up of the Garmin Cirqa screen-free tracker next to the Luna Band at IFA 2026 in Berlin" src="https://cdn.mos.cms.futurecdn.net/TrVGT7FHzWykpwioYKi8yn-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1439" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Much to my surprise, I walked nearly 18,000 steps on my first day of IFA, which was technically a day before the show opened to the public (the press tends to get early access). </p><p>To be fair, the Berlin Messe is an absolutely sprawling conference complex, with no shortage of seemingly secret passages and tucked-away halls that are easy to stumble upon by accident but virtually impossible to find again when you’re <em>actually</em> looking for them.</p><p>This partially explains why my day one step count was so much higher than day two: I spent considerable time on the ground day one simply trying to get a lay of the land (in an admittedly very jet-lagged state). Day two, I had meetings scattered throughout the complex, and I didn’t want to be wandering around like a ding-dong.  </p><h3 class="article-body__section" id="section-2-i-logged-more-steps-on-day-1-of-ifa-than-any-single-day-covering-mwc"><span>2. I logged more steps on day 1 of IFA than any single day covering MWC</span></h3><p>At 17,902 steps, my day one of IFA coverage in Berlin beat my step count for any individual day of coverage at <a href="https://www.tomsguide.com/wellness/fitness/i-logged-37-miles-at-mwc-2026-on-my-garmin-instinct-3-here-are-5-things-i-learned">Mobile World Congress</a> in Barcelona back in March. That said, I spent a total of five days covering MWC compared to just two days covering IFA, for a total step count of 67,398 steps in Spain.</p><h3 class="article-body__section" id="section-3-but-ces-day-1-was-more-intense-than-both"><span>3. But CES day 1 was more intense than both</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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mnJPLoccAQFvxdEkQvxUQU" name="GarminCirqa-rev-02" alt="Close-up of the Garmin Cirqa on a user's wrist against a red background" src="https://cdn.mos.cms.futurecdn.net/mnJPLoccAQFvxdEkQvxUQU-1920-80.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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>While day one of IFA may have been a leg-burner, it falls a bit short of my total step count from day one of the <a href="https://www.tomsguide.com/wellness/smartwatches/i-walked-65-000-steps-with-the-garmin-venu-4-5-things-i-learned">Consumer Electronics Show</a> held in Las Vegas back in early January, where I logged a dog-barking 20,253 steps, more than double my everyday average back home. </p><p>Then again, as anyone who has been to CES likely knows, things are very spread out in Las Vegas, which also just might be the least pedestrian-friendly city in the U.S... want to cross the street? You'll need to walk another half-mile down the strip and wander through multiple casinos to do so.</p><h3 class="article-body__section" id="section-4-commuting-on-the-u-bahn-seemingly-skewed-garmin-s-distance-and-pace-data"><span>4. Commuting on the U-Bahn seemingly skewed Garmin's distance and pace data</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:5025px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="J8gQGtirDrYBxfay2N35UX" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/J8gQGtirDrYBxfay2N35UX-1920-80.jpg" mos="" align="middle" fullscreen="" width="5025" height="2827" 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>I didn’t include my distance or pace totals in the table above because it’s clear these figures are skewed. Both days of the show, I fired up a walking workout in the Cirqa upon leaving my hotel, trekked about half a mile to the nearest U-Bahn station — I am a nerd for experiencing public rail transit in new cities — and rode the metro roughly two miles to the show grounds. </p><p>Unfortunately, the Garmin Cirqa clearly interpreted this time spent riding the train as me moving at near-superhuman speed. For example, my average moving pace on day one of the show, according to Garmin, was 8 mins 41 secs per mile. Sure, I can maintain that pace when running a mile, but covering a trade show? Def not. </p><p>Garmin also said I walked 14.14 miles on day one, which would equal 1,266 steps per mile, way less than what I normally average, which is closer to 2,000 steps per mile. </p><h3 class="article-body__section" id="section-5-i-mostly-forgot-the-garmin-cirqa-was-even-there-but-might-not-wear-it-again"><span>5. I mostly forgot the Garmin Cirqa was even there, but might not wear it again</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:5144px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Rr535PFKqQMmtZpT74z88e" name="GarminCirqa-03" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/Rr535PFKqQMmtZpT74z88e-1920-80.jpg" mos="" align="middle" fullscreen="" width="5144" height="2893" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Ultimately, I opted to wear the Garmin Cirqa for two primary reasons. First, it’s comfortable and lightweight, so much so that I pretty much forgot it was even there. Second, I wanted to wear a mechanical watch on my left wrist to keep a constant eye on time; the nine-hour time difference between Seattle (where I live) and Berlin was my main rationale (also, I got a cool new watch I wanted to show off). </p><p>So, will I be wearing the Garmin Cirqa the next time I cover a major tech show? Honestly, probably not. While I appreciate how wrist-friendly it is, the lack of GPS means it has to piggyback off my smartphone’s signal, which isn’t necessarily ideal. Moreover, I’d rather opt for a wearable that’s capable of discerning time spent walking from time spent riding a subway. </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/wellness/smartwatches/i-biked-11-miles-with-the-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2-and-the-winner-is-clear"><strong>I biked 11 miles with the Garmin Instinct 3 vs Samsung Galaxy Watch Ultra 2 — and the winner is clear</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-000-steps-with-the-pixel-watch-5-vs-samsung-galaxy-watch-9-and-we-have-a-new-android-champ"><strong>I walked 4,000 steps with the Pixel Watch 5 vs Samsung Galaxy Watch 9 — and we have a new Android champ</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-7-miles-with-the-apple-watch-ultra-3-vs-pixel-watch-5-and-the-winner-is-nearly-too-close-to-call"><strong>I walked 7 miles with the Apple Watch Ultra 3 vs Pixel Watch 5 — here's the winner</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Durability guaranteed — I’ve used these 5 items of running apparel for years and they’re still good as new ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As someone who reviews all kinds of running and fitness products, durability is both the easiest and hardest thing to test. All I have to do is keep using something to see if it’s long-lasting, but the rapid turnover of running products means there’s always something new to test.</p><p>That’s especially true with the <a href="https://www.tomsguide.com/best-picks/best-running-shoes">best running shoes</a>, watches and headphones, which are updated yearly, but I do get more of a chance to test running apparel over the long-term, and there are some items that have really stood out for their durability in my time as a runner.</p><p><strong>I’ve used all of the products below regularly for several years</strong>, which means they’ve withstood hundreds of miles of running and frequent washing. Thousands of miles, in some cases. So while they're expensive up front, there's no doubt I've gotten great value from them in the long run. No pun intended.</p><p>You can <strong>extend the life of your products with good care</strong> — I always wash my running gear on a cold, fairly short cycle — but largely, durability depends on the quality of the goods, and I happily guarantee these five products stand up to the long-term run test.</p><h3 class="article-body__section" id="section-saysky-pace-2-in-1-shorts-5"><span>Saysky Pace 2 in 1 Shorts 5”</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="FLpedXS3bUEUnVAsAEQgUY" name="Saysky 2 in 1 Pace Shorts 5''" alt="Saysky 2 in 1 Pace Shorts 5''" src="https://cdn.mos.cms.futurecdn.net/FLpedXS3bUEUnVAsAEQgUY-1920-80.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: Future)</span></figcaption></figure><p>I have a few pairs of these shorts that I’ve used weekly for several years and they’re just as comfortable as ever and show almost no signs of wear and tear. </p><p>They’re my go-to shorts for easy and long runs thanks to the supportive inner layer, which has a couple of handy drop-in pockets that can take a phone, keys and a couple of gels.</p><p>The upfront cost is pretty high, but as one of Saysky’s most popular products the 2 in 1 shorts are often featured in the brand’s sales, and they’re certainly built to last.</p><div class="product"><a data-dimension112="66923918-ad15-11f1-aeb5-0526b4e1a585" data-action="Deal Block" data-label="2 in 1 Pace Shorts 5in" data-dimension48="2 in 1 Pace Shorts 5in" data-dimension25="$93" href="https://saysky.com/products/2-in-1-pace-shorts-5-black-901-sm40002" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:700px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6aCuhu3ztTm6j4vAdamRcV" name="Saysky 2 in 1 Pace Shorts 5in" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6aCuhu3ztTm6j4vAdamRcV-1920-80.png" mos="" align="middle" fullscreen="" width="700" height="700" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://saysky.com/products/2-in-1-pace-shorts-5-black-901-sm40002" target="_blank" rel="nofollow" data-dimension112="66923918-ad15-11f1-aeb5-0526b4e1a585" data-action="Deal Block" data-label="2 in 1 Pace Shorts 5in" data-dimension48="2 in 1 Pace Shorts 5in" data-dimension25="$93">2 in 1 Pace Shorts 5in: $93</a></strong><br>The Pace 2 in 1 shorts have a supportive inner layer with drop-in pockets for your essentials, and a looser outer layer with a zip pocket on the back. I have several sets of these shorts that have lasted me years of regular use.<a class="view-deal button" href="https://saysky.com/products/2-in-1-pace-shorts-5-black-901-sm40002" target="_blank" rel="nofollow" data-dimension112="66923918-ad15-11f1-aeb5-0526b4e1a585" data-action="Deal Block" data-label="2 in 1 Pace Shorts 5in" data-dimension48="2 in 1 Pace Shorts 5in" data-dimension25="$93">View Deal</a></p></div><h3 class="article-body__section" id="section-soar-all-weather-jacket"><span>Soar All Weather Jacket</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="GVSPLnDrMqvFUSDKHzQvBf" name="Soar All Weather Jacket" alt="Soar All Weather Jacket" src="https://cdn.mos.cms.futurecdn.net/GVSPLnDrMqvFUSDKHzQvBf-1920-80.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: Future)</span></figcaption></figure><p>A healthy percentage of my longest-lasting running apparel is made by British brand Soar, and durability is certainly demanded given the high prices you do pay for Soar’s stuff.</p><p>The All Weather Jacket I have is the original version, and it has been updated since, but I have little doubt it remains just as durable as the one I’ve used myself for several winters' worth of running. My jacket still feels soft and comfortable, and aside from some fraying around the cuffs, it’s held up perfectly to regular use in inclement weather.</p><p>It’s windproof, water-resistant enough to fend off rain without being as hot and sweaty as a full waterproof, and has a close fit that allows for freedom of movement. The last point is important, because it means I can wear the jacket for fast runs in the winter, whereas many jackets feel too bulky. </p><p>There are certainly great running jackets available for less, but the All Weather Jacket lives up to its name in being warm enough for snow but breathable enough for mild, wet days, and it’s still my go-to after years of use.</p><div class="product"><a data-dimension112="66923ab2-ad15-11f1-8799-3be7fb95bf56" data-action="Deal Block" data-label="All Weather Jacket" data-dimension48="All Weather Jacket" data-dimension25="$475" href="https://www.soarrunning.com/en-us/collections/long-sleeves-jackets/products/mens-all-weather-jacket-black-1?variant=55981983826295" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1296px;"><p class="vanilla-image-block" style="padding-top:87.50%;"><img id="6L99bDBFeL8QxiPHnQJhk8" name="Soar All Weather Jacket" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6L99bDBFeL8QxiPHnQJhk8-1920-80.png" mos="" align="middle" fullscreen="" width="1296" height="1134" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The latest model of Soar's All Weather Jacket doesn't come cheap, but the early version I use has seen me through several winters and it's still my favorite option for the colder, wetter months.<a class="view-deal button" href="https://www.soarrunning.com/en-us/collections/long-sleeves-jackets/products/mens-all-weather-jacket-black-1?variant=55981983826295" target="_blank" rel="nofollow" data-dimension112="66923ab2-ad15-11f1-8799-3be7fb95bf56" data-action="Deal Block" data-label="All Weather Jacket" data-dimension48="All Weather Jacket" data-dimension25="$475">View Deal</a></p></div><h3 class="article-body__section" id="section-stance-run-crew-socks"><span>Stance Run Crew Socks</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="5cw8YXkzczRHr4iwTXsXJS" name="Stance Running Socks" alt="Stance Running Socks" src="https://cdn.mos.cms.futurecdn.net/5cw8YXkzczRHr4iwTXsXJS-1920-80.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: Future)</span></figcaption></figure><p>I’ve been a big fan of Stance’s running socks since I first slipped a pair on many years ago, and I’ve amassed a sizable collection of the Run Crew socks in particular, with some that have lasted me more than five years.</p><p>While they’re not quite as soft and flexible as they were when new, these long-lasting socks are still comfortable after years of regular runs and washes, and none have developed holes or frayed at all.</p><p>Darn Tough is another running sock brand that has impressed me with their durability, and this is an apparel area where I’ve definitely found it’s worth paying a little more upfront to get a longer lasting product.</p><div class="product"><a data-dimension112="cd70e7ce-ad15-11f1-a6b7-9f3ea67626f2" data-action="Deal Block" data-label="Run Crew" data-dimension48="Run Crew" data-dimension25="$50" href="https://www.amazon.com/Stance-Crew-Socks-Pack-Medium/dp/B09HSX5DK4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="g8x9pa9ycfJzxroJULj2UV" name="Stance Run Light Crew Socks" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g8x9pa9ycfJzxroJULj2UV-1920-80.jpg" mos="" align="middle" fullscreen="" width="900" height="900" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Stance has a wide variety of options in its socks line-up, but for running the ones I recommend are the Run Crew (either Light or Medium). I've been using these socks for almost a decade and they're durable, comfortable and dry quickly.<a class="view-deal button" href="https://www.amazon.com/Stance-Crew-Socks-Pack-Medium/dp/B09HSX5DK4" target="_blank" rel="nofollow" data-dimension112="cd70e7ce-ad15-11f1-a6b7-9f3ea67626f2" data-action="Deal Block" data-label="Run Crew" data-dimension48="Run Crew" data-dimension25="$50">View Deal</a></p></div><h3 class="article-body__section" id="section-tracksmith-van-cortland-tee"><span>Tracksmith Van Cortland Tee</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="vCK3JYxJoBtLsgViELv4wi" name="Tracksmith Van Cortland Tee" alt="Tracksmith Van Cortland Tee" src="https://cdn.mos.cms.futurecdn.net/vCK3JYxJoBtLsgViELv4wi-1920-80.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: Future)</span></figcaption></figure><p>Tracksmith is another premium running brand that I found does offset the high initial price of its products with better-than-average durability, and the Van Cortland Tee has been a staple of my training wardrobe for several years.</p><p>It’s a loose-fitting tee that’s breathability in hot conditions, even if it’s not the thinnest and lightest option, and comes in a variety of designs that all feature Tracksmith’s trademark sash.</p><p>I use it mainly for easy and long runs as I personally prefer something tighter and lighter for sessions, though in winter the relaxed fit of the Van Cortland is handy as I can fit it over a base layer easily.</p><div class="product"><a data-dimension112="d2b5380a-ad17-11f1-9109-0536cf2d270b" data-action="Deal Block" data-label="Van Cortland Tee" data-dimension48="Van Cortland Tee" data-dimension25="$80" href="https://www.tracksmith.com/products/m-van-cortlandt-tee" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1400px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="bZH6h5cQHj2iKkezBFWwbD" name="Tracksmith Van Cortland Tee" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bZH6h5cQHj2iKkezBFWwbD-1920-80.png" mos="" align="middle" fullscreen="" width="1400" height="1400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.tracksmith.com/products/m-van-cortlandt-tee" target="_blank" rel="nofollow" data-dimension112="d2b5380a-ad17-11f1-9109-0536cf2d270b" data-action="Deal Block" data-label="Van Cortland Tee" data-dimension48="Van Cortland Tee" data-dimension25="$80">Van Cortland Tee: $80</a></strong><br>The Van Cortland line-up contains singlets and long-sleeved tops along with tees, and I've used all of them for a long time for my own running. <a class="view-deal button" href="https://www.tracksmith.com/products/m-van-cortlandt-tee" target="_blank" rel="nofollow" data-dimension112="d2b5380a-ad17-11f1-9109-0536cf2d270b" data-action="Deal Block" data-label="Van Cortland Tee" data-dimension48="Van Cortland Tee" data-dimension25="$80">View Deal</a></p></div><h3 class="article-body__section" id="section-under-armour-performance-tech-boxerjock"><span>Under Armour Performance Tech Boxerjock</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.29%;"><img id="UuCryyhSqZ6ucKn3qV7nLo" name="Under Armour Tech Boxerjock" alt="Under Armour Tech Boxerjock" src="https://cdn.mos.cms.futurecdn.net/UuCryyhSqZ6ucKn3qV7nLo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" 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 prefer to wear underwear under my running shorts as I find this more supportive than relying on the liners in shorts alone, and these Under Armour Boxerjocks are both highly comfortable — I never get chafing with them — and unbelievably durable.</p><p>Frankly, I wasn’t sure whether to put them in this article, because it’s a little embarrassing to say you’ve been using the same underwear for almost 10 years, but they’ve stood up so well to regular use and washes I had to highlight them.</p><p>They’re good value too, and often appear in Amazon sales. Make sure you get the Tech version though, as the cotton ones won’t be as suitable for running.</p><div class="product"><a data-dimension112="d2b53940-ad17-11f1-8d1b-c1338e707a9b" data-action="Deal Block" data-label="Tech Boxerjock" data-dimension48="Tech Boxerjock" data-dimension25="$44" href="https://www.amazon.com/Under-Armour-6-inch-Boxerjock-Solid-Core/dp/B0C2JM7K5C" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:466px;"><p class="vanilla-image-block" style="padding-top:118.03%;"><img id="jgDd3d8Rzuu7KT6H5RucJH" name="Under Armour Tech Boxerjock" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jgDd3d8Rzuu7KT6H5RucJH-1920-80.png" mos="" align="middle" fullscreen="" width="466" height="550" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Under-Armour-6-inch-Boxerjock-Solid-Core/dp/B0C2JM7K5C" target="_blank" rel="nofollow" data-dimension112="d2b53940-ad17-11f1-8d1b-c1338e707a9b" data-action="Deal Block" data-label="Tech Boxerjock" data-dimension48="Tech Boxerjock" data-dimension25="$44">Tech Boxerjock: $44</a></strong><br>These boxers have been part of my running wardrobe for almost as long as I've been running. I've never had trouble with chafing while wearing them, even on 20-mile runs, and they are still in great condition.<a class="view-deal button" href="https://www.amazon.com/Under-Armour-6-inch-Boxerjock-Solid-Core/dp/B0C2JM7K5C" target="_blank" rel="nofollow" data-dimension112="d2b53940-ad17-11f1-8d1b-c1338e707a9b" data-action="Deal Block" data-label="Tech Boxerjock" data-dimension48="Tech Boxerjock" data-dimension25="$44">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O6kAdX"></div>                            </div>                            <script src="https://kwizly.com/embed/O6kAdX.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/wellness/smartwatches/i-wear-an-apple-watch-every-single-day-and-i-never-knew-you-could-do-this">‘I wear an Apple Watch every single day, and I never knew you could do this.’</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-wear-an-apple-watch-every-day-and-this-is-the-free-app-i-use-all-of-the-time">I wear an Apple Watch every day, and this is the free app I use all of the time</a></li><li><a href="https://www.tomsguide.com/wellness/fitness/too-busy-to-work-out-i-added-thousands-of-steps-to-my-day-using-this-simple-trick">Forget running — I added thousands of steps to my day using this simple trick</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/running/durability-guaranteed-ive-used-these-5-items-of-running-apparel-for-years-and-theyre-still-good-as-new</link>
                                                                            <description>
                            <![CDATA[ I’ve tested a lot of running apparel over the past decade and these are the products that have really stood out for their durability. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">oFBzj4ZNYTD6tDzahEfxmM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Qz3QTQeWbcvX5sBjmM2MTk-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 09:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Running]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nick Harris-Fry ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/J5Jjp49GUVjLZEbjEkTex-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick has been a journalist since 2012 and has spent most of that time writing about health and fitness for a variety of publications. Nick spent nine years working on the Coach magazine and website before moving to the fitness team at Tom’s Guide in 2024. Nick is a keen runner and also the founder of YouTube channel &lt;a href=&quot;https://www.youtube.com/channel/UCOBM9FasII4dKbyE_HKkbjw&quot;&gt;The Run Testers&lt;/a&gt;, which specialises in reviewing running shoes, watches, headphones and other gear.&lt;/p&gt;&lt;p&gt;Nick has covered all aspects of health and fitness throughout his career, interviewing experts and celebrities, trying fitness classes and running marathons, all in the name of providing readers with the information they need to get the most out of an active lifestyle.&lt;/p&gt;&lt;p&gt;Nick ran his first marathon in 2016 after six weeks of training for a magazine feature and subsequently became obsessed with the sport. He now has PBs of 2hr 25min for the marathon and 15min 30sec for 5K, and has run 16 marathons in total, as well as a 50-mile ultramarathon.&lt;/p&gt;&lt;p&gt;Nick runs 60-90 miles a week and races regularly with his club, which gives him a lot of opportunity to test out running gear: he has tested and reviewed hundreds of pairs of running shoes, as well as fitness trackers, running watches, sports headphones, treadmills, and all manner of other kit. Nick is also a qualified Run Leader in the UK.&lt;/p&gt;&lt;p&gt;Nick is an established expert in the health and fitness area and along with writing for several publications, including &lt;a href=&quot;https://www.livescience.com/author/nick-harris-fry&quot;&gt;Live Science&lt;/a&gt;, &lt;a href=&quot;https://www.expertreviews.co.uk/authors/nick-harris-fry&quot;&gt;Expert Reviews&lt;/a&gt;, &lt;a href=&quot;https://www.wareable.com/author/n.harris-fry&quot;&gt;Wareable&lt;/a&gt;, &lt;a href=&quot;https://www.coachweb.com/author/nick-harris-fry&quot;&gt;Coach&lt;/a&gt; and &lt;a href=&quot;https://www.getsweatgo.com/author/n.harrisfry&quot;&gt;Get Sweat Go&lt;/a&gt;, he has been quoted on &lt;a href=&quot;https://www.theguardian.com/thefilter/2024/oct/20/if-you-pay-more-than-4-youre-being-ripped-off-the-fair-price-for-14-everyday-items-from-cleaning-spray-to-olive-oil&quot;&gt;The Guardian&lt;/a&gt; and &lt;a href=&quot;https://www.independent.co.uk/life-style/health-and-families/london-marathon-2021-date-training-tips-summer-running-a9482486.html&quot;&gt;The Independent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Nick graduated from the University of York in 2010 with a degree in Politics, Philosophy and Economics and worked in the NHS for three years, during which time he completed his NCTJ Diploma in Journalism at News Associates in London. Before starting on Coach and moving into health and fitness, Nick worked as a football journalist and lived in Kathmandu, Nepal for two years.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Qz3QTQeWbcvX5sBjmM2MTk-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Man wearing running clothes]]></media:description>                                                            <media:text><![CDATA[Man wearing running clothes]]></media:text>
                                <media:title type="plain"><![CDATA[Man wearing running clothes]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Qz3QTQeWbcvX5sBjmM2MTk-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As someone who reviews all kinds of running and fitness products, durability is both the easiest and hardest thing to test. All I have to do is keep using something to see if it’s long-lasting, but the rapid turnover of running products means there’s always something new to test.</p><p>That’s especially true with the <a href="https://www.tomsguide.com/best-picks/best-running-shoes">best running shoes</a>, watches and headphones, which are updated yearly, but I do get more of a chance to test running apparel over the long-term, and there are some items that have really stood out for their durability in my time as a runner.</p><p><strong>I’ve used all of the products below regularly for several years</strong>, which means they’ve withstood hundreds of miles of running and frequent washing. Thousands of miles, in some cases. So while they're expensive up front, there's no doubt I've gotten great value from them in the long run. No pun intended.</p><p>You can <strong>extend the life of your products with good care</strong> — I always wash my running gear on a cold, fairly short cycle — but largely, durability depends on the quality of the goods, and I happily guarantee these five products stand up to the long-term run test.</p><h3 class="article-body__section" id="section-saysky-pace-2-in-1-shorts-5"><span>Saysky Pace 2 in 1 Shorts 5”</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="FLpedXS3bUEUnVAsAEQgUY" name="Saysky 2 in 1 Pace Shorts 5''" alt="Saysky 2 in 1 Pace Shorts 5''" src="https://cdn.mos.cms.futurecdn.net/FLpedXS3bUEUnVAsAEQgUY-1920-80.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: Future)</span></figcaption></figure><p>I have a few pairs of these shorts that I’ve used weekly for several years and they’re just as comfortable as ever and show almost no signs of wear and tear. </p><p>They’re my go-to shorts for easy and long runs thanks to the supportive inner layer, which has a couple of handy drop-in pockets that can take a phone, keys and a couple of gels.</p><p>The upfront cost is pretty high, but as one of Saysky’s most popular products the 2 in 1 shorts are often featured in the brand’s sales, and they’re certainly built to last.</p><div class="product"><a data-dimension112="66923918-ad15-11f1-aeb5-0526b4e1a585" data-action="Deal Block" data-label="2 in 1 Pace Shorts 5in" data-dimension48="2 in 1 Pace Shorts 5in" data-dimension25="$93" href="https://saysky.com/products/2-in-1-pace-shorts-5-black-901-sm40002" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:700px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6aCuhu3ztTm6j4vAdamRcV" name="Saysky 2 in 1 Pace Shorts 5in" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6aCuhu3ztTm6j4vAdamRcV-1920-80.png" mos="" align="middle" fullscreen="" width="700" height="700" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://saysky.com/products/2-in-1-pace-shorts-5-black-901-sm40002" target="_blank" rel="nofollow" data-dimension112="66923918-ad15-11f1-aeb5-0526b4e1a585" data-action="Deal Block" data-label="2 in 1 Pace Shorts 5in" data-dimension48="2 in 1 Pace Shorts 5in" data-dimension25="$93">2 in 1 Pace Shorts 5in: $93</a></strong><br>The Pace 2 in 1 shorts have a supportive inner layer with drop-in pockets for your essentials, and a looser outer layer with a zip pocket on the back. I have several sets of these shorts that have lasted me years of regular use.<a class="view-deal button" href="https://saysky.com/products/2-in-1-pace-shorts-5-black-901-sm40002" target="_blank" rel="nofollow" data-dimension112="66923918-ad15-11f1-aeb5-0526b4e1a585" data-action="Deal Block" data-label="2 in 1 Pace Shorts 5in" data-dimension48="2 in 1 Pace Shorts 5in" data-dimension25="$93">View Deal</a></p></div><h3 class="article-body__section" id="section-soar-all-weather-jacket"><span>Soar All Weather Jacket</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="GVSPLnDrMqvFUSDKHzQvBf" name="Soar All Weather Jacket" alt="Soar All Weather Jacket" src="https://cdn.mos.cms.futurecdn.net/GVSPLnDrMqvFUSDKHzQvBf-1920-80.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: Future)</span></figcaption></figure><p>A healthy percentage of my longest-lasting running apparel is made by British brand Soar, and durability is certainly demanded given the high prices you do pay for Soar’s stuff.</p><p>The All Weather Jacket I have is the original version, and it has been updated since, but I have little doubt it remains just as durable as the one I’ve used myself for several winters' worth of running. My jacket still feels soft and comfortable, and aside from some fraying around the cuffs, it’s held up perfectly to regular use in inclement weather.</p><p>It’s windproof, water-resistant enough to fend off rain without being as hot and sweaty as a full waterproof, and has a close fit that allows for freedom of movement. The last point is important, because it means I can wear the jacket for fast runs in the winter, whereas many jackets feel too bulky. </p><p>There are certainly great running jackets available for less, but the All Weather Jacket lives up to its name in being warm enough for snow but breathable enough for mild, wet days, and it’s still my go-to after years of use.</p><div class="product"><a data-dimension112="66923ab2-ad15-11f1-8799-3be7fb95bf56" data-action="Deal Block" data-label="All Weather Jacket" data-dimension48="All Weather Jacket" data-dimension25="$475" href="https://www.soarrunning.com/en-us/collections/long-sleeves-jackets/products/mens-all-weather-jacket-black-1?variant=55981983826295" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1296px;"><p class="vanilla-image-block" style="padding-top:87.50%;"><img id="6L99bDBFeL8QxiPHnQJhk8" name="Soar All Weather Jacket" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6L99bDBFeL8QxiPHnQJhk8-1920-80.png" mos="" align="middle" fullscreen="" width="1296" height="1134" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The latest model of Soar's All Weather Jacket doesn't come cheap, but the early version I use has seen me through several winters and it's still my favorite option for the colder, wetter months.<a class="view-deal button" href="https://www.soarrunning.com/en-us/collections/long-sleeves-jackets/products/mens-all-weather-jacket-black-1?variant=55981983826295" target="_blank" rel="nofollow" data-dimension112="66923ab2-ad15-11f1-8799-3be7fb95bf56" data-action="Deal Block" data-label="All Weather Jacket" data-dimension48="All Weather Jacket" data-dimension25="$475">View Deal</a></p></div><h3 class="article-body__section" id="section-stance-run-crew-socks"><span>Stance Run Crew Socks</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="5cw8YXkzczRHr4iwTXsXJS" name="Stance Running Socks" alt="Stance Running Socks" src="https://cdn.mos.cms.futurecdn.net/5cw8YXkzczRHr4iwTXsXJS-1920-80.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: Future)</span></figcaption></figure><p>I’ve been a big fan of Stance’s running socks since I first slipped a pair on many years ago, and I’ve amassed a sizable collection of the Run Crew socks in particular, with some that have lasted me more than five years.</p><p>While they’re not quite as soft and flexible as they were when new, these long-lasting socks are still comfortable after years of regular runs and washes, and none have developed holes or frayed at all.</p><p>Darn Tough is another running sock brand that has impressed me with their durability, and this is an apparel area where I’ve definitely found it’s worth paying a little more upfront to get a longer lasting product.</p><div class="product"><a data-dimension112="cd70e7ce-ad15-11f1-a6b7-9f3ea67626f2" data-action="Deal Block" data-label="Run Crew" data-dimension48="Run Crew" data-dimension25="$50" href="https://www.amazon.com/Stance-Crew-Socks-Pack-Medium/dp/B09HSX5DK4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="g8x9pa9ycfJzxroJULj2UV" name="Stance Run Light Crew Socks" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g8x9pa9ycfJzxroJULj2UV-1920-80.jpg" mos="" align="middle" fullscreen="" width="900" height="900" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Stance has a wide variety of options in its socks line-up, but for running the ones I recommend are the Run Crew (either Light or Medium). I've been using these socks for almost a decade and they're durable, comfortable and dry quickly.<a class="view-deal button" href="https://www.amazon.com/Stance-Crew-Socks-Pack-Medium/dp/B09HSX5DK4" target="_blank" rel="nofollow" data-dimension112="cd70e7ce-ad15-11f1-a6b7-9f3ea67626f2" data-action="Deal Block" data-label="Run Crew" data-dimension48="Run Crew" data-dimension25="$50">View Deal</a></p></div><h3 class="article-body__section" id="section-tracksmith-van-cortland-tee"><span>Tracksmith Van Cortland Tee</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="vCK3JYxJoBtLsgViELv4wi" name="Tracksmith Van Cortland Tee" alt="Tracksmith Van Cortland Tee" src="https://cdn.mos.cms.futurecdn.net/vCK3JYxJoBtLsgViELv4wi-1920-80.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: Future)</span></figcaption></figure><p>Tracksmith is another premium running brand that I found does offset the high initial price of its products with better-than-average durability, and the Van Cortland Tee has been a staple of my training wardrobe for several years.</p><p>It’s a loose-fitting tee that’s breathability in hot conditions, even if it’s not the thinnest and lightest option, and comes in a variety of designs that all feature Tracksmith’s trademark sash.</p><p>I use it mainly for easy and long runs as I personally prefer something tighter and lighter for sessions, though in winter the relaxed fit of the Van Cortland is handy as I can fit it over a base layer easily.</p><div class="product"><a data-dimension112="d2b5380a-ad17-11f1-9109-0536cf2d270b" data-action="Deal Block" data-label="Van Cortland Tee" data-dimension48="Van Cortland Tee" data-dimension25="$80" href="https://www.tracksmith.com/products/m-van-cortlandt-tee" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1400px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="bZH6h5cQHj2iKkezBFWwbD" name="Tracksmith Van Cortland Tee" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bZH6h5cQHj2iKkezBFWwbD-1920-80.png" mos="" align="middle" fullscreen="" width="1400" height="1400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.tracksmith.com/products/m-van-cortlandt-tee" target="_blank" rel="nofollow" data-dimension112="d2b5380a-ad17-11f1-9109-0536cf2d270b" data-action="Deal Block" data-label="Van Cortland Tee" data-dimension48="Van Cortland Tee" data-dimension25="$80">Van Cortland Tee: $80</a></strong><br>The Van Cortland line-up contains singlets and long-sleeved tops along with tees, and I've used all of them for a long time for my own running. <a class="view-deal button" href="https://www.tracksmith.com/products/m-van-cortlandt-tee" target="_blank" rel="nofollow" data-dimension112="d2b5380a-ad17-11f1-9109-0536cf2d270b" data-action="Deal Block" data-label="Van Cortland Tee" data-dimension48="Van Cortland Tee" data-dimension25="$80">View Deal</a></p></div><h3 class="article-body__section" id="section-under-armour-performance-tech-boxerjock"><span>Under Armour Performance Tech Boxerjock</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.29%;"><img id="UuCryyhSqZ6ucKn3qV7nLo" name="Under Armour Tech Boxerjock" alt="Under Armour Tech Boxerjock" src="https://cdn.mos.cms.futurecdn.net/UuCryyhSqZ6ucKn3qV7nLo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" 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 prefer to wear underwear under my running shorts as I find this more supportive than relying on the liners in shorts alone, and these Under Armour Boxerjocks are both highly comfortable — I never get chafing with them — and unbelievably durable.</p><p>Frankly, I wasn’t sure whether to put them in this article, because it’s a little embarrassing to say you’ve been using the same underwear for almost 10 years, but they’ve stood up so well to regular use and washes I had to highlight them.</p><p>They’re good value too, and often appear in Amazon sales. Make sure you get the Tech version though, as the cotton ones won’t be as suitable for running.</p><div class="product"><a data-dimension112="d2b53940-ad17-11f1-8d1b-c1338e707a9b" data-action="Deal Block" data-label="Tech Boxerjock" data-dimension48="Tech Boxerjock" data-dimension25="$44" href="https://www.amazon.com/Under-Armour-6-inch-Boxerjock-Solid-Core/dp/B0C2JM7K5C" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:466px;"><p class="vanilla-image-block" style="padding-top:118.03%;"><img id="jgDd3d8Rzuu7KT6H5RucJH" name="Under Armour Tech Boxerjock" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jgDd3d8Rzuu7KT6H5RucJH-1920-80.png" mos="" align="middle" fullscreen="" width="466" height="550" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Under-Armour-6-inch-Boxerjock-Solid-Core/dp/B0C2JM7K5C" target="_blank" rel="nofollow" data-dimension112="d2b53940-ad17-11f1-8d1b-c1338e707a9b" data-action="Deal Block" data-label="Tech Boxerjock" data-dimension48="Tech Boxerjock" data-dimension25="$44">Tech Boxerjock: $44</a></strong><br>These boxers have been part of my running wardrobe for almost as long as I've been running. I've never had trouble with chafing while wearing them, even on 20-mile runs, and they are still in great condition.<a class="view-deal button" href="https://www.amazon.com/Under-Armour-6-inch-Boxerjock-Solid-Core/dp/B0C2JM7K5C" target="_blank" rel="nofollow" data-dimension112="d2b53940-ad17-11f1-8d1b-c1338e707a9b" data-action="Deal Block" data-label="Tech Boxerjock" data-dimension48="Tech Boxerjock" data-dimension25="$44">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O6kAdX"></div>                            </div>                            <script src="https://kwizly.com/embed/O6kAdX.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/wellness/smartwatches/i-wear-an-apple-watch-every-single-day-and-i-never-knew-you-could-do-this">‘I wear an Apple Watch every single day, and I never knew you could do this.’</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-wear-an-apple-watch-every-day-and-this-is-the-free-app-i-use-all-of-the-time">I wear an Apple Watch every day, and this is the free app I use all of the time</a></li><li><a href="https://www.tomsguide.com/wellness/fitness/too-busy-to-work-out-i-added-thousands-of-steps-to-my-day-using-this-simple-trick">Forget running — I added thousands of steps to my day using this simple trick</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ "No strings attached": Why Apple’s online retail lead says its iPhone 18 Pro leasing model beats wireless carriers ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As Apple opens <a href="https://www.tomsguide.com/phones/iphones/avoid-that-usd100-price-hike-how-to-save-up-to-usd885-on-your-iphone-18-pro-preorder">preorders for the iPhone 18 Pro and Pro Max</a> (with the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> following in October) shoppers face a familiar question: does it make more sense to sign a multi-year agreement with a wireless carrier, or finance a new device directly through Apple?</p><p>But things are fundamentally different for this year’s cycle. The iPhone maker recently introduced a new device leasing model via Klarna called <a href="https://www.tomsguide.com/ai/chatgpt/is-the-apple-upgrade-program-a-good-deal-or-a-rip-off-i-asked-chatgpt-to-crunch-the-numbers-and-heres-the-verdict">“Apple Upgrade,”</a> phasing out the long-standing Citizens One-backed iPhone Upgrade Program I had subscribed to for nearly a decade.</p><p>To understand what this shift means for serial upgraders like myself and new buyers alike, I spoke with Karen Rasmussen, Apple's vice president of the Apple Store online, following the launch event to break down why the company completely revamped its approach — and why customers might want to lease their new iPhone via Apple instead of their wireless carrier this time around.</p><p>"What we really love about Apple Upgrade compared to carrier promotions is that it comes with no strings attached," Rasmussen said. "In the case of carrier promotions, you often have to trade something in, and it frequently comes with choices on the plan you're on that may not suit a particular individual. We wanted to give customers something that was completely unencumbered."</p><h2 id="apple-upgrade-is-designed-to-make-upgrading-easier">Apple Upgrade is designed to make upgrading easier</h2><p>Apple is also leveraging its online store infrastructure to eliminate launch-day friction. Through the "Get Ready" pre-approval window before preorders opened Saturday at 9 a.m. ET/5 a.m. PT, shoppers could select their exact configuration, complete credit checks in advance and even consult with Specialists over video or chat. </p><p>But with the new program, direct leasing options don’t just apply to the latest family of iPhones. Apple Upgrade now spans Macs, iPads and Apple Watches, offering 12- and 24-month terms for mobile devices alongside 24- or 36-month options for computers and tablets.</p><p>"We took a ton of learnings from the original program," said Rasmussen. "Previously, we only had iPhone Upgrade. Now, customers can lease main products across the lineup with the term lengths they’ve actually been looking for."</p><p>One notable change in the new structure is the unbundling of AppleCare+, which was previously built into monthly payments. </p><p>"With Apple One, more and more people already have a subscription that covers multiple devices," Rasmussen said. "It didn't make sense to force customers to pay for a separate subscription for just one device.”</p><p>For legacy users wondering whether the new model favors first-time buyers, Rasmussen emphasized that applying trade-in values upfront fundamentally changes the math. Rather than waiting until a device is paid off to unlock value, the new lease structure applies trade-in credits immediately, pulling down monthly payments from day one.</p><h2 id="what-happens-to-your-iphone-when-you-return-it">What happens to your iPhone when you return it?</h2><p>With millions of leased devices set to reach the end of their terms, how these phones are handled plays a direct role in Apple's sustainability commitments and widely publicized 2030 carbon-neutral goals. </p><p>"Some people ask if they have to return it to Klarna. No, you drop it off at a store or mail it back to us," Rasmussen explained. "We're taking the device back."</p><p>Once returned, Apple channels the hardware based on condition. </p><p>"Sometimes they come back in a condition where it's better off being recycled, and we do very responsible recycling to make sure that any elements of it can be reused from an environmental perspective," Rasmussen said. "And if it's in good condition, we make sure that it gets refurbished and finds a home with a second owner."</p><p>That focus on responsible lifecycles reinforces why Apple wants to control the return process directly rather than handing it off to banks or carriers. By combining a sustainable return loop with zero carrier lock-ins, the new Apple Upgrade program offers a compelling alternative for anyone prioritizing flexibility over traditional ownership. </p><p>That said, whether it truly beats standard carrier trade-in math comes down to your personal upgrade habits. As I make the pivot myself for my iPhone 18 Pro order, I’ll be sure to report back on how the new Klarna-backed checkout and long-term lease model hold up in practice.</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/the-iphone-18-pro-may-be-faster-but-it-also-comes-with-a-potential-battery-downgrade">The iPhone 18 Pro comes with a potential battery downgrade</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">I went hands on with the new iPhone 18 Pro and Pro Max</a></li><li><a href="https://www.tomsguide.com/phones/iphones/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo">Exclusive: Apple CEO John Ternus and Joz on making iPhone Duo</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/no-strings-attached-why-apples-online-retail-lead-says-its-iphone-18-pro-leasing-model-beats-wireless-carriers</link>
                                                                            <description>
                            <![CDATA[ We spoke to Apple’s Karen Rasmussen, vice president of the Apple Store online, about the company's new Apple Upgrade leasing program. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">r7ZiHYL5BSSN3eTCU2VJo4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vpaHPKsU4dPaYpAJDkBzM3-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 07:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Kate Kozuch ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xAVUdx6Qtp3SzugnnfNYsL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kate Kozuch is a managing editor of social and video at Tom&#039;s Guide, where she&#039;s been with the team since 2019. She also reviews smartwatches, covers TVs, tests the latest audio products and dabbles in cooking appliances. Of course, that&#039;s not when she&#039;s working on building the &lt;a href=&quot;https://www.tomsguide.com/reference/smart-home-guide&quot;&gt;ultimate DIY smart home&lt;/a&gt;. She has conducted over 100 different product reviews across these categories, turning her findings into buying guides and face-offs. She also manages a number of gift guides on the site. &lt;/p&gt;&lt;p&gt;Kate has a strong on-camera presence as well. She has appeared on Cheddar and Fox 5 NY to talk trending tech news. She is also regularly featured on the Tom&#039;s Guide YouTube channel, runs the &lt;a href=&quot;https://www.tiktok.com/@tomsguide?lang=en&quot;&gt;Tom&#039;s Guide TikTok account&lt;/a&gt; with over 350,000 followers, and features all the tech she&#039;s testing &lt;a href=&quot;https://www.instagram.com/katekozuch/&quot;&gt;on her Instagram&lt;/a&gt;. When she’s not filming tech videos, you can find her taking up a new sport, mastering the NYT Crossword or channeling her inner celebrity chef. Speaking of, be sure to ask her about the time Guy Fieri made her a margarita at CES, or when her video of Martha Stewart drinking a margarita went mega-viral. Clearly, Kate has a thing for culinary icons and margaritas.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/vpaHPKsU4dPaYpAJDkBzM3-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro Max in Burgundy color being held up to ear ]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro Max in Burgundy color being held up to ear ]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro Max in Burgundy color being held up to ear ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vpaHPKsU4dPaYpAJDkBzM3-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As Apple opens <a href="https://www.tomsguide.com/phones/iphones/avoid-that-usd100-price-hike-how-to-save-up-to-usd885-on-your-iphone-18-pro-preorder">preorders for the iPhone 18 Pro and Pro Max</a> (with the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> following in October) shoppers face a familiar question: does it make more sense to sign a multi-year agreement with a wireless carrier, or finance a new device directly through Apple?</p><p>But things are fundamentally different for this year’s cycle. The iPhone maker recently introduced a new device leasing model via Klarna called <a href="https://www.tomsguide.com/ai/chatgpt/is-the-apple-upgrade-program-a-good-deal-or-a-rip-off-i-asked-chatgpt-to-crunch-the-numbers-and-heres-the-verdict">“Apple Upgrade,”</a> phasing out the long-standing Citizens One-backed iPhone Upgrade Program I had subscribed to for nearly a decade.</p><p>To understand what this shift means for serial upgraders like myself and new buyers alike, I spoke with Karen Rasmussen, Apple's vice president of the Apple Store online, following the launch event to break down why the company completely revamped its approach — and why customers might want to lease their new iPhone via Apple instead of their wireless carrier this time around.</p><p>"What we really love about Apple Upgrade compared to carrier promotions is that it comes with no strings attached," Rasmussen said. "In the case of carrier promotions, you often have to trade something in, and it frequently comes with choices on the plan you're on that may not suit a particular individual. We wanted to give customers something that was completely unencumbered."</p><h2 id="apple-upgrade-is-designed-to-make-upgrading-easier">Apple Upgrade is designed to make upgrading easier</h2><p>Apple is also leveraging its online store infrastructure to eliminate launch-day friction. Through the "Get Ready" pre-approval window before preorders opened Saturday at 9 a.m. ET/5 a.m. PT, shoppers could select their exact configuration, complete credit checks in advance and even consult with Specialists over video or chat. </p><p>But with the new program, direct leasing options don’t just apply to the latest family of iPhones. Apple Upgrade now spans Macs, iPads and Apple Watches, offering 12- and 24-month terms for mobile devices alongside 24- or 36-month options for computers and tablets.</p><p>"We took a ton of learnings from the original program," said Rasmussen. "Previously, we only had iPhone Upgrade. Now, customers can lease main products across the lineup with the term lengths they’ve actually been looking for."</p><p>One notable change in the new structure is the unbundling of AppleCare+, which was previously built into monthly payments. </p><p>"With Apple One, more and more people already have a subscription that covers multiple devices," Rasmussen said. "It didn't make sense to force customers to pay for a separate subscription for just one device.”</p><p>For legacy users wondering whether the new model favors first-time buyers, Rasmussen emphasized that applying trade-in values upfront fundamentally changes the math. Rather than waiting until a device is paid off to unlock value, the new lease structure applies trade-in credits immediately, pulling down monthly payments from day one.</p><h2 id="what-happens-to-your-iphone-when-you-return-it">What happens to your iPhone when you return it?</h2><p>With millions of leased devices set to reach the end of their terms, how these phones are handled plays a direct role in Apple's sustainability commitments and widely publicized 2030 carbon-neutral goals. </p><p>"Some people ask if they have to return it to Klarna. No, you drop it off at a store or mail it back to us," Rasmussen explained. "We're taking the device back."</p><p>Once returned, Apple channels the hardware based on condition. </p><p>"Sometimes they come back in a condition where it's better off being recycled, and we do very responsible recycling to make sure that any elements of it can be reused from an environmental perspective," Rasmussen said. "And if it's in good condition, we make sure that it gets refurbished and finds a home with a second owner."</p><p>That focus on responsible lifecycles reinforces why Apple wants to control the return process directly rather than handing it off to banks or carriers. By combining a sustainable return loop with zero carrier lock-ins, the new Apple Upgrade program offers a compelling alternative for anyone prioritizing flexibility over traditional ownership. </p><p>That said, whether it truly beats standard carrier trade-in math comes down to your personal upgrade habits. As I make the pivot myself for my iPhone 18 Pro order, I’ll be sure to report back on how the new Klarna-backed checkout and long-term lease model hold up in practice.</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/the-iphone-18-pro-may-be-faster-but-it-also-comes-with-a-potential-battery-downgrade">The iPhone 18 Pro comes with a potential battery downgrade</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">I went hands on with the new iPhone 18 Pro and Pro Max</a></li><li><a href="https://www.tomsguide.com/phones/iphones/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo">Exclusive: Apple CEO John Ternus and Joz on making iPhone Duo</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I asked ChatGPT and Gemini to build a movie marathon based on one oddly specific theme — here are the 7 recommended films I loved the most ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I consider myself a movie aficionado.</p><p>I may pop up at my local Alamo Drafthouse Cinema for the latest blockbuster superhero movie, martial-arts-filled epic and sci-fi adventure like the average moviegoer. But my movie-watching palette is a lot more expansive than that — I also enjoy a cinematic experience attached to a good psychological drama, crime thriller or dark comedy. I may turn my brain off now and then when I sit in front of the big and little screen, but I also turn it on when it’s time to spend a few hours sitting through some quality, thought-provoking movies.</p><p>I got tired of sifting through my streaming service queues one day and had the bright idea of building a watchlist of films that stick to a specific theme. Asking AI for the best movies to watch in a particular genre is easy enough — I wanted to truly challenge ChatGPT and Gemini’s movie knowledge and get them to recommend films based on an oddly specific theme.</p><p>Color me impressed after this experiment came to a close — both chatbots listed a bunch of critically-acclaimed and fan-favorite films that fulfilled <em>exactly</em> what I was looking for.</p><h2 id="chatgpt-and-gemini-made-me-discover-movies-i-felt-guilty-for-not-seeing-beforehand">ChatGPT and Gemini made me discover movies I felt guilty for not seeing beforehand</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jYv6W2dNxRv3FzuQzVYSJP" name="shutterstock_2535005761-2" alt="watching tv" src="https://cdn.mos.cms.futurecdn.net/jYv6W2dNxRv3FzuQzVYSJP-1920-80.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: Shutterstock)</span></figcaption></figure><p>So the theme I told both chatbots about to suggest the best movies they could find is as follows: <strong>"Build a movie marathon around the following theme and make sure to tell me what streaming services I can use to watch each film: One Terrible Decision Ruined Everything."</strong></p><p>For some reason, I was in the mood to watch the sort of movies that show a person or group dealing with the ramifications of a decision that turns their life upside down. I had a feeling there were a bunch of films that fit that theme perfectly and could provide me with the sort of nail-biting viewing experience I had been craving as of late. </p><p>ChatGPT’s explanation of my themed movie watchlist spoke to my soul: <em>This theme is perfect for a slow-burn-to-total-disaster marathon: every movie starts with someone making a choice that seems understandable, tempting, or even smart — and then spends the rest of its runtime proving that it absolutely was not.</em></p><p>Here are the four films ChatGPT brought to my attention and the accompanying descriptions that intrigued me:</p><ul><li><strong>Fargo</strong> → <em>“Surely this can't get THAT bad.” Jerry's initial scheme is terrible, but it's still relatively contained. Then everything spirals.</em></li><li><strong>A Simple Plan → </strong><em>“Just take the money.” This might be the purest example of the entire theme. Finding $4 million sounds like incredible luck. The movie asks what happens when you make the decision to keep it.</em></li><li><strong>Nightcrawler → </strong><em>“I'm willing to do whatever it takes.” Unlike some of the others, Lou isn't really tricked into making his terrible decisions. He keeps choosing them because they work. That's what makes this one so uncomfortable.</em></li><li><strong>Uncut Gems → </strong><em>“One more bet.” Put this near the end because it's basically two hours of watching a man repeatedly encounter opportunities to stop destroying his life — and refusing every single one.</em></li></ul><p><a href="https://www.tomsguide.com/ai/google-gemini/google-gemini-everything-you-need-to-know">Gemini</a> offered up some equally compelling film choices that stuck close to my theme. Here are the three films and apt descriptions that got me excited to see them all in action:</p><ul><li><strong>Before the Devil Knows You're Dead. </strong><em>Tone: Gritty family tragedy / Heist gone wrong. The stakes become deeply personal. You see the fallout of a single bad decision split a family apart in real time, raising the emotional tension.</em></li><li><strong>Parasite. </strong><em>Tone: Social satire turning into a claustrophobic thriller. The midpoint twist — triggered directly by the decision to push their luck—shifts the marathon from a crime narrative into pure panic.</em></li><li><strong>Requiem for a Dream: </strong><em>Tone: Psychological drama / Tragic downward spiral. A harrowing, definitive conclusion to the theme. It leaves no room for recovery after a series of small, ill-advised choices snowball into complete destruction.</em></li></ul><p>After my usual extensive Rotten Tomatoes research session on each film, I left with a whole slate of new movies to watch across Tubi, Pluto TV, Sling TV, The Roku Channel and YouTube. The fact that I could watch the majority of these films for free was the icing on top of a daily solo watch party that delivered the sort of cinematic nail-biting thrills I was searching high and low for. </p><p>I especially enjoyed Nightcrawler’s deep dive into the psyche of a man who wants success by any means, Uncut Gems’ presentation of the huge downsides of constantly betting big and Parasite’s showcase of the shades of grey present among its eccentric cast.</p><h2 id="7-other-movie-themes-i-ll-play-around-with-in-the-near-future">7 other movie themes I’ll play around with in the near 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qgM7T3NAQ6abSWBGEUeTBW" name="shutterstock_2267330251-2" alt="netflix" src="https://cdn.mos.cms.futurecdn.net/qgM7T3NAQ6abSWBGEUeTBW-1920-80.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: Shutterstock)</span></figcaption></figure><p>Both chatbots did a great job of highlighting the right films for my thematic approach. So much so that I’m very much looking forward to testing out the following movie themes with ChatGPT and Gemini to see which films they push me toward next:</p><ul><li><em>"The Hero Has Had Enough"</em></li><li><em>"The Villain Was Kind of Right"</em></li><li><em>"The Guy Who Should Have Stayed Home"</em></li><li><em>"People Are Trapped Somewhere and Things Get Worse"</em></li><li><em>"The Movie Takes Place Over One Absolutely Insane Day"</em></li><li><em>"The Opening 10 Minutes Promise Absolute Chaos"</em></li></ul><h2 id="the-takeaway-3">The takeaway</h2><p>In my search for movies I hadn’t seen before, sticking to a particular theme and requesting AI’s assistance in helping me find the appropriate films and streaming services that house them ended up being a fulfilling experience. </p><p>I’ve gotten used to using chatbots as my digital entertainment curators, so I was confident that they’d lead me to some quality cinema that was chock-full of interesting premises that resulted in the slow unraveling of its characters. I’m going to keep doing this with all sorts of cinematic themes to see where my movie-recommending chatbots take me next.</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-ditched-chatgpt-for-youmind-for-a-day-heres-what-surprised-me">I ditched ChatGPT for YouMind for a day — here’s what surprised me</a></li><li><a href="https://www.tomsguide.com/ai/i-write-about-ai-for-a-living-and-these-are-3-things-id-never-let-it-plan-for-me-and-3-i-would">I write about AI for a living and these are 3 things I'd never let it plan for me (and 3 I would)</a></li><li><a href="https://www.tomsguide.com/ai/anthropic-modeled-what-ai-could-do-by-2030-the-economy-gets-32-percent-richer-while-workers-get-left-behind">Anthropic modeled what AI could do by 2030 — the economy gets 32% richer while workers get left behind</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-asked-chatgpt-and-gemini-to-build-a-movie-marathon-based-on-one-oddly-specific-theme-here-are-the-7-recommended-films-i-loved-the-most</link>
                                                                            <description>
                            <![CDATA[ With a particular theme in mind for the type of movie storyline I was interested in, I used ChatGPT and Gemini to build a watchlist of films that fit perfectly. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DQzZQDLhy5fNMgTgXppnWZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qUoTm6gEM8DPg7GeE3Ze4F-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 07:00:00 +0000</pubDate>                                                                                                                                <updated>Sat, 12 Sep 2026 12:20:07 +0000</updated>
                                                                                                                                            <category><![CDATA[ChatGPT]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qUoTm6gEM8DPg7GeE3Ze4F-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[watching tv]]></media:description>                                                            <media:text><![CDATA[watching tv]]></media:text>
                                <media:title type="plain"><![CDATA[watching tv]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qUoTm6gEM8DPg7GeE3Ze4F-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I consider myself a movie aficionado.</p><p>I may pop up at my local Alamo Drafthouse Cinema for the latest blockbuster superhero movie, martial-arts-filled epic and sci-fi adventure like the average moviegoer. But my movie-watching palette is a lot more expansive than that — I also enjoy a cinematic experience attached to a good psychological drama, crime thriller or dark comedy. I may turn my brain off now and then when I sit in front of the big and little screen, but I also turn it on when it’s time to spend a few hours sitting through some quality, thought-provoking movies.</p><p>I got tired of sifting through my streaming service queues one day and had the bright idea of building a watchlist of films that stick to a specific theme. Asking AI for the best movies to watch in a particular genre is easy enough — I wanted to truly challenge ChatGPT and Gemini’s movie knowledge and get them to recommend films based on an oddly specific theme.</p><p>Color me impressed after this experiment came to a close — both chatbots listed a bunch of critically-acclaimed and fan-favorite films that fulfilled <em>exactly</em> what I was looking for.</p><h2 id="chatgpt-and-gemini-made-me-discover-movies-i-felt-guilty-for-not-seeing-beforehand">ChatGPT and Gemini made me discover movies I felt guilty for not seeing beforehand</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jYv6W2dNxRv3FzuQzVYSJP" name="shutterstock_2535005761-2" alt="watching tv" src="https://cdn.mos.cms.futurecdn.net/jYv6W2dNxRv3FzuQzVYSJP-1920-80.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: Shutterstock)</span></figcaption></figure><p>So the theme I told both chatbots about to suggest the best movies they could find is as follows: <strong>"Build a movie marathon around the following theme and make sure to tell me what streaming services I can use to watch each film: One Terrible Decision Ruined Everything."</strong></p><p>For some reason, I was in the mood to watch the sort of movies that show a person or group dealing with the ramifications of a decision that turns their life upside down. I had a feeling there were a bunch of films that fit that theme perfectly and could provide me with the sort of nail-biting viewing experience I had been craving as of late. </p><p>ChatGPT’s explanation of my themed movie watchlist spoke to my soul: <em>This theme is perfect for a slow-burn-to-total-disaster marathon: every movie starts with someone making a choice that seems understandable, tempting, or even smart — and then spends the rest of its runtime proving that it absolutely was not.</em></p><p>Here are the four films ChatGPT brought to my attention and the accompanying descriptions that intrigued me:</p><ul><li><strong>Fargo</strong> → <em>“Surely this can't get THAT bad.” Jerry's initial scheme is terrible, but it's still relatively contained. Then everything spirals.</em></li><li><strong>A Simple Plan → </strong><em>“Just take the money.” This might be the purest example of the entire theme. Finding $4 million sounds like incredible luck. The movie asks what happens when you make the decision to keep it.</em></li><li><strong>Nightcrawler → </strong><em>“I'm willing to do whatever it takes.” Unlike some of the others, Lou isn't really tricked into making his terrible decisions. He keeps choosing them because they work. That's what makes this one so uncomfortable.</em></li><li><strong>Uncut Gems → </strong><em>“One more bet.” Put this near the end because it's basically two hours of watching a man repeatedly encounter opportunities to stop destroying his life — and refusing every single one.</em></li></ul><p><a href="https://www.tomsguide.com/ai/google-gemini/google-gemini-everything-you-need-to-know">Gemini</a> offered up some equally compelling film choices that stuck close to my theme. Here are the three films and apt descriptions that got me excited to see them all in action:</p><ul><li><strong>Before the Devil Knows You're Dead. </strong><em>Tone: Gritty family tragedy / Heist gone wrong. The stakes become deeply personal. You see the fallout of a single bad decision split a family apart in real time, raising the emotional tension.</em></li><li><strong>Parasite. </strong><em>Tone: Social satire turning into a claustrophobic thriller. The midpoint twist — triggered directly by the decision to push their luck—shifts the marathon from a crime narrative into pure panic.</em></li><li><strong>Requiem for a Dream: </strong><em>Tone: Psychological drama / Tragic downward spiral. A harrowing, definitive conclusion to the theme. It leaves no room for recovery after a series of small, ill-advised choices snowball into complete destruction.</em></li></ul><p>After my usual extensive Rotten Tomatoes research session on each film, I left with a whole slate of new movies to watch across Tubi, Pluto TV, Sling TV, The Roku Channel and YouTube. The fact that I could watch the majority of these films for free was the icing on top of a daily solo watch party that delivered the sort of cinematic nail-biting thrills I was searching high and low for. </p><p>I especially enjoyed Nightcrawler’s deep dive into the psyche of a man who wants success by any means, Uncut Gems’ presentation of the huge downsides of constantly betting big and Parasite’s showcase of the shades of grey present among its eccentric cast.</p><h2 id="7-other-movie-themes-i-ll-play-around-with-in-the-near-future">7 other movie themes I’ll play around with in the near 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qgM7T3NAQ6abSWBGEUeTBW" name="shutterstock_2267330251-2" alt="netflix" src="https://cdn.mos.cms.futurecdn.net/qgM7T3NAQ6abSWBGEUeTBW-1920-80.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: Shutterstock)</span></figcaption></figure><p>Both chatbots did a great job of highlighting the right films for my thematic approach. So much so that I’m very much looking forward to testing out the following movie themes with ChatGPT and Gemini to see which films they push me toward next:</p><ul><li><em>"The Hero Has Had Enough"</em></li><li><em>"The Villain Was Kind of Right"</em></li><li><em>"The Guy Who Should Have Stayed Home"</em></li><li><em>"People Are Trapped Somewhere and Things Get Worse"</em></li><li><em>"The Movie Takes Place Over One Absolutely Insane Day"</em></li><li><em>"The Opening 10 Minutes Promise Absolute Chaos"</em></li></ul><h2 id="the-takeaway-3">The takeaway</h2><p>In my search for movies I hadn’t seen before, sticking to a particular theme and requesting AI’s assistance in helping me find the appropriate films and streaming services that house them ended up being a fulfilling experience. </p><p>I’ve gotten used to using chatbots as my digital entertainment curators, so I was confident that they’d lead me to some quality cinema that was chock-full of interesting premises that resulted in the slow unraveling of its characters. I’m going to keep doing this with all sorts of cinematic themes to see where my movie-recommending chatbots take me next.</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-ditched-chatgpt-for-youmind-for-a-day-heres-what-surprised-me">I ditched ChatGPT for YouMind for a day — here’s what surprised me</a></li><li><a href="https://www.tomsguide.com/ai/i-write-about-ai-for-a-living-and-these-are-3-things-id-never-let-it-plan-for-me-and-3-i-would">I write about AI for a living and these are 3 things I'd never let it plan for me (and 3 I would)</a></li><li><a href="https://www.tomsguide.com/ai/anthropic-modeled-what-ai-could-do-by-2030-the-economy-gets-32-percent-richer-while-workers-get-left-behind">Anthropic modeled what AI could do by 2030 — the economy gets 32% richer while workers get left behind</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’m a strength and conditioning coach: Here are the 3 mobility exercises everyone over 40 should be doing ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As we get older, strength training becomes more important than ever as a way to slow down and even reverse the physical effects of aging. Yet if you’re a complete beginner, or you’re returning to exercise following an extended break or injury, it can be difficult to know where to start. </p><p>To find out more, I spoke to Mellisa Leach, a yoga instructor and strength and conditioning coach. Below, she shares three exercises to help you build better mobility over the age of 40. All you’ll need is a long resistance band (you can check out the <a href="https://www.tomsguide.com/best-picks/best-resistance-bands">best resistance bands</a> for working out at home here). Resistance bands are a fantastic way to build strength without putting stress on the joints.</p><p>As a reminder, if you’re currently recovering from an injury, this workout might not be right for you and your body. Always seek personalized advice from a qualified professional if you are unsure. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X8pRyX"></div>                            </div>                            <script src="https://kwizly.com/embed/X8pRyX.js" async></script><h2 id="what-is-the-workout">What is the workout? </h2><h3 class="article-body__section" id="section-1-standing-resistance-band-row"><span>1. Standing resistance band row </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="fzcqoS9DEfLAJYK5pYto4c" name="shutterstock_2007767762 resistance band row.jpg" alt="Vector resistance band bentover row" src="https://cdn.mos.cms.futurecdn.net/fzcqoS9DEfLAJYK5pYto4c-1920-80.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>“This exercise strengthens the upper and mid-back, as well as your shoulders and biceps, while improving posture and shoulder stability,” says Leech. </p><p><strong>How to do it: </strong></p><ul><li>Secure a resistance band around a stable surface at chest height in front of you</li><li>Stand tall with your feet hip-width apart and hold the ends of the band with both hands</li><li>Extend your arms in front of your body</li><li>Pull the band towards your torso, driving your elbows back and squeezing your shoulder blades together</li><li>Slowly return to the starting position</li><li><strong>Perform 2-5 sets of 10-15 repetitions </strong></li></ul><h3 class="article-body__section" id="section-2-standing-resistance-band-reverse-fly"><span>2. Standing resistance band reverse fly </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="bkfmCrfbiZqQAKLQHsauxa" name="shutterstock_2007008738 res band lat raises.jpg" alt="Vector resistance band lateral raises" src="https://cdn.mos.cms.futurecdn.net/bkfmCrfbiZqQAKLQHsauxa-1920-80.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>“Perfect for targeting rear deltoids, rhomboids, and upper back muscles, this move helps improve posture, shoulder health, and upper-body stability,” Leech says. </p><p><strong>How to do it: </strong></p><ul><li>Secure a resistance band around a stable surface at chest height in front of you</li><li>Stand tall and hold the ends with your hands extended in front of your chest</li><li>Keeping a slight bend in your elbows, open your arms out to the sides</li><li>Squeeze your shoulder blades together as your arms form a ‘T’ shape</li><li>Slowly return to the starting position</li><li><strong>Perform 2-5 sets of 10-15 repetition </strong></li></ul><h3 class="article-body__section" id="section-3-standing-resistance-band-overhead-press"><span>3. Standing resistance band overhead press </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:1890px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="sG2EqVyne5MHnL9rS6CL4" name="resistance band overhead press" alt="an illo of a man doing a resistance band overhead press" src="https://cdn.mos.cms.futurecdn.net/sG2EqVyne5MHnL9rS6CL4-1920-80.jpg" mos="" align="middle" fullscreen="" width="1890" height="1063" 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>“Overhead press helps maintain shoulder mobility, upper-body strength, and the ability to perform everyday activities, such as reaching overhead, more easily.” </p><p><strong>How to do it: </strong></p><ul><li>Stand with your feet hip-width apart</li><li>Hold each end of the resistance band in each hand at shoulder height with elbows bent</li><li>Press your arms overhead until they are fully extended</li><li>Hold briefly at the top</li><li>Slowly lower back to the starting position</li><li><strong>Do 2-5 sets with 8-12 repetitions </strong></li></ul><h2 id="what-are-the-benefits-3">What are the benefits? </h2><p>“Mobility exercises are one of the most effective ways to maintain independence as we get older,” says Leech. “By regularly moving our joints through their full range of motion, we can improve strength, balance, coordination, and flexibility, all of which play an important role in staying active later in life.</p><p>“Over time, mobility training helps the joints and muscles work together more efficiently, which in turn helps reduce the risk of injury and falls by strengthening key stabilising muscles, as well as improving pain relief and making everyday tasks such as carrying shopping, climbing stairs, or even getting out of bed easier.” </p><p>Resistance band exercises like these place constant tension on the deep stabilizer muscles in the upper body and core. Strengthening these small stabilizer muscles can help improve your overall balance and stability, as well as improve your mobility.</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/wellness/workouts/im-a-personal-trainer-who-works-with-clients-over-50-these-are-the-3-mobility-exercises-i-never-skip" target="_blank">I'm a personal trainer who works with clients over 50 — these are the 3 mobility exercises I never skip</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/after-60-this-is-the-10-minute-routine-i-use-with-my-clients-to-stay-strong-mobile-and-independent" target="_blank">After 60, this is the 10-minute routine I use with my clients to stay strong, mobile and independent</a></li><li><a href="https://www.tomsguide.com/wellness/fitness/im-a-pilates-instructor-and-i-recommend-these-5-core-exercises-to-help-older-clients-build-strength-and-improve-posture" target="_blank">'I’m a Pilates instructor, and I recommend these 5 core exercises to help older clients build strength and improve posture'</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/workouts/im-a-strength-and-conditioning-coach-here-are-the-3-mobility-exercises-everyone-over-40-should-be-doing</link>
                                                                            <description>
                            <![CDATA[ This personal trainer shares 3 resistance band exercises she gives to clients over 40 ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8NS4rEYq79nWLg3sU9sqxF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/reiJJ9m9jRZtKmiGC9nJXN-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Workouts]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/reiJJ9m9jRZtKmiGC9nJXN-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a woman holding resistance bands]]></media:description>                                                            <media:text><![CDATA[a woman holding resistance bands]]></media:text>
                                <media:title type="plain"><![CDATA[a woman holding resistance bands]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/reiJJ9m9jRZtKmiGC9nJXN-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As we get older, strength training becomes more important than ever as a way to slow down and even reverse the physical effects of aging. Yet if you’re a complete beginner, or you’re returning to exercise following an extended break or injury, it can be difficult to know where to start. </p><p>To find out more, I spoke to Mellisa Leach, a yoga instructor and strength and conditioning coach. Below, she shares three exercises to help you build better mobility over the age of 40. All you’ll need is a long resistance band (you can check out the <a href="https://www.tomsguide.com/best-picks/best-resistance-bands">best resistance bands</a> for working out at home here). Resistance bands are a fantastic way to build strength without putting stress on the joints.</p><p>As a reminder, if you’re currently recovering from an injury, this workout might not be right for you and your body. Always seek personalized advice from a qualified professional if you are unsure. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X8pRyX"></div>                            </div>                            <script src="https://kwizly.com/embed/X8pRyX.js" async></script><h2 id="what-is-the-workout">What is the workout? </h2><h3 class="article-body__section" id="section-1-standing-resistance-band-row"><span>1. Standing resistance band row </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="fzcqoS9DEfLAJYK5pYto4c" name="shutterstock_2007767762 resistance band row.jpg" alt="Vector resistance band bentover row" src="https://cdn.mos.cms.futurecdn.net/fzcqoS9DEfLAJYK5pYto4c-1920-80.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>“This exercise strengthens the upper and mid-back, as well as your shoulders and biceps, while improving posture and shoulder stability,” says Leech. </p><p><strong>How to do it: </strong></p><ul><li>Secure a resistance band around a stable surface at chest height in front of you</li><li>Stand tall with your feet hip-width apart and hold the ends of the band with both hands</li><li>Extend your arms in front of your body</li><li>Pull the band towards your torso, driving your elbows back and squeezing your shoulder blades together</li><li>Slowly return to the starting position</li><li><strong>Perform 2-5 sets of 10-15 repetitions </strong></li></ul><h3 class="article-body__section" id="section-2-standing-resistance-band-reverse-fly"><span>2. Standing resistance band reverse fly </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="bkfmCrfbiZqQAKLQHsauxa" name="shutterstock_2007008738 res band lat raises.jpg" alt="Vector resistance band lateral raises" src="https://cdn.mos.cms.futurecdn.net/bkfmCrfbiZqQAKLQHsauxa-1920-80.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>“Perfect for targeting rear deltoids, rhomboids, and upper back muscles, this move helps improve posture, shoulder health, and upper-body stability,” Leech says. </p><p><strong>How to do it: </strong></p><ul><li>Secure a resistance band around a stable surface at chest height in front of you</li><li>Stand tall and hold the ends with your hands extended in front of your chest</li><li>Keeping a slight bend in your elbows, open your arms out to the sides</li><li>Squeeze your shoulder blades together as your arms form a ‘T’ shape</li><li>Slowly return to the starting position</li><li><strong>Perform 2-5 sets of 10-15 repetition </strong></li></ul><h3 class="article-body__section" id="section-3-standing-resistance-band-overhead-press"><span>3. Standing resistance band overhead press </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:1890px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="sG2EqVyne5MHnL9rS6CL4" name="resistance band overhead press" alt="an illo of a man doing a resistance band overhead press" src="https://cdn.mos.cms.futurecdn.net/sG2EqVyne5MHnL9rS6CL4-1920-80.jpg" mos="" align="middle" fullscreen="" width="1890" height="1063" 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>“Overhead press helps maintain shoulder mobility, upper-body strength, and the ability to perform everyday activities, such as reaching overhead, more easily.” </p><p><strong>How to do it: </strong></p><ul><li>Stand with your feet hip-width apart</li><li>Hold each end of the resistance band in each hand at shoulder height with elbows bent</li><li>Press your arms overhead until they are fully extended</li><li>Hold briefly at the top</li><li>Slowly lower back to the starting position</li><li><strong>Do 2-5 sets with 8-12 repetitions </strong></li></ul><h2 id="what-are-the-benefits-3">What are the benefits? </h2><p>“Mobility exercises are one of the most effective ways to maintain independence as we get older,” says Leech. “By regularly moving our joints through their full range of motion, we can improve strength, balance, coordination, and flexibility, all of which play an important role in staying active later in life.</p><p>“Over time, mobility training helps the joints and muscles work together more efficiently, which in turn helps reduce the risk of injury and falls by strengthening key stabilising muscles, as well as improving pain relief and making everyday tasks such as carrying shopping, climbing stairs, or even getting out of bed easier.” </p><p>Resistance band exercises like these place constant tension on the deep stabilizer muscles in the upper body and core. Strengthening these small stabilizer muscles can help improve your overall balance and stability, as well as improve your mobility.</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/wellness/workouts/im-a-personal-trainer-who-works-with-clients-over-50-these-are-the-3-mobility-exercises-i-never-skip" target="_blank">I'm a personal trainer who works with clients over 50 — these are the 3 mobility exercises I never skip</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/after-60-this-is-the-10-minute-routine-i-use-with-my-clients-to-stay-strong-mobile-and-independent" target="_blank">After 60, this is the 10-minute routine I use with my clients to stay strong, mobile and independent</a></li><li><a href="https://www.tomsguide.com/wellness/fitness/im-a-pilates-instructor-and-i-recommend-these-5-core-exercises-to-help-older-clients-build-strength-and-improve-posture" target="_blank">'I’m a Pilates instructor, and I recommend these 5 core exercises to help older clients build strength and improve posture'</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Duo vs. iPhone 18 Pro vs. iPhone 18 Pro Max — here’s the one I recommend ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Every year when Apple unveils its flagship lineup, people always ask me which one is worth their money. This year’s reveal at the <a href="https://www.tomsguide.com/phones/live/apple-surprise-and-shine-live-iphone-ultra-iphone-18-pro-max-apple-watch-series-12-and-all-the-latest-news">"Surprise and Shine" event</a> is no exception because Apple has completely upended the playbook by introducing its first-ever foldable, the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-is-official-price-release-date-specs-and-everything-you-need-to-know">iPhone Duo</a>.</p><p>While refining the hardware and software is no doubt a huge undertaking on Apple’s part, the company still needs to convince buyers that it’s worth the premium over its two other flagships: the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-iphone-18-pro-max-are-official-heres-what-you-need-to-know">iPhone 18 Pro and iPhone 18 Pro Max</a>. Deciding which flagship belongs in your pocket is a substantially tougher call, but I’m going to break down their specs, features, prices, and more to tell you which one truly deserves your money.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/2qNfOa5AuVU" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-vs-iphone-18-pro-max-specifications"><span>iPhone Duo vs. iPhone 18 Pro vs. iPhone 18 Pro Max: Specifications</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>iPhone Duo</strong></p></th><th  ><p>iPhone 18 Pro</p></th><th  ><p>iPhone 18 Pro Max</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,999</p></td><td  ><p>$1,199</p></td><td  ><p>$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>7.6-inch Super Retina XDR (1,878 x 2,670)</p></td><td  ><p>6.3-inch Super Retina XDR display (2,622 x 1,206)</p></td><td  ><p>6.9-inch Super Retina XDR display (2,868 x 1,320)</p></td></tr><tr><td class="firstcol " ><p><strong>Outer Display</strong></p></td><td  ><p>5.4-inch Super Retina XDR (1,398 x 2,034)</p></td><td  ><p>N/A</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>A20 Pro</p></td><td  ><p>A20 Pro</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td><td  ><p>12GB</p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Front Cameras</strong></p></td><td  ><p>12MP Center Stage outer (ƒ/2.2), 1080p under-display FaceTime inner camera (f/1.8)</p></td><td  ><p>18MP Center Stage camera (f/1.9)</p></td><td  ><p>18MP Center Stage camera (f/1.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>48MP main (f/1.6), 48MP ultrawide (f/2.2)</p></td><td  ><p>48MP main with variable aperture (f/1.48, f/1.8, f/2.8, f/4), 48MP ultrawide (f/2.2), 48MP telephoto w/4x optical zoom (f/2.8)</p></td><td  ><p>48MP main with variable aperture (f/1.48, f/1.8, f/2.8, f/4), 48MP ultrawide (f/2.2), 48MP telephoto w/4x optical zoom (f/2.8)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life Video Playback</strong></p></td><td  ><p>Up to 44 hours when using the outer display, up to 31 hours when using the inner display</p></td><td  ><p>Up to 36 hours</p></td><td  ><p>Up to 45 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.48 x 4.64 x 0.21 inches open (164.6 x 117.8 x 5.2mm), 3.31 x 4.64 x 0.44 inches closed (84.1 x 117.8 x 11.3mm)</p></td><td  ><p>5.91 x 2.83 x 0.34 inches (150.0 x 71.9 x 8.75 mm)</p></td><td  ><p>6.43 x 3.07 x 0.34 inches (163.4 x 78.0 x 8.75 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.96 ounces (254 grams)</p></td><td  ><p>7.44 ounces (211 grams)</p></td><td  ><p>8.78 ounces (249 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP68</p></td><td  ><p>IP68</p></td><td  ><p>IP68</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Night Sky, Star White</p></td><td  ><p>Black, Silver, Glacier, Burgundy</p></td><td  ><p>Black, Silver, Glacier, Burgundy</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-price-does-matter"><span>Price does matter</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>256GB</strong></p></td><td  ><p><strong>2TB</strong></p></td><td  ><p><strong>Dollar Increase</strong></p></td><td  ><p><strong>Percentage Increase</strong></p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro</strong></p></td><td  ><p>$1,199</p></td><td  ><p>$2,399</p></td><td  ><p>$1,200</p></td><td  ><p>100.08%</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro Max</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$2,499</p></td><td  ><p>$1,200</p></td><td  ><p>92.38%</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone Duo</strong></p></td><td  ><p>$1,999</p></td><td  ><p>$3,199</p></td><td  ><p>$1,200</p></td><td  ><p>60.03%</p></td></tr></tbody></table></div><p>Apple’s latest price adjustments certainly sting, with both traditional flagships seeing a $100 price hike across the board. That means the iPhone 18 Pro and 18 Pro Max will cost you more than in previous years, as starting prices climb to $1,199 for a 256GB iPhone 18 Pro and $1,299 for the equivalent iPhone 18 Pro Max. At the extreme end, you’re looking at paying $2,399 and $2,499 for the 2TB options on the Pro and Pro Max, respectively.</p><p>But despite their higher costs, placing those figures next to the iPhone Duo makes them look like outright bargains that will save you far more cash upfront. While I do applaud Apple for keeping the Duo’s base price competitive at $1,999 for 256GB, that’s still a massive $700 to $800 leap over the Pro models — and it quickly balloons to $3,199 for the 2TB version.</p><p>Interestingly, when I ran the numbers, Apple charges a flat $1,200 premium across the board to jump from 256GB to 2TB. On the iPhone 18 Pro, that upgrade literally doubles the phone's price — a massive 100% surge from $1,199 to $2,399. Meanwhile, it represents a 92% hike on the Pro Max and a 60% increase on the Duo.</p><p>Unless you genuinely need maximum local capacity, jumping all the way to 2TB is best justified on the Duo.</p><h2 class="article-body__section" id="section-tried-and-true-reliability-versus-utility"><span>Tried and true reliability versus utility</span></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="N49opwHV76RM3BfKvL8REa" name="iPhone duo edit 2" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/N49opwHV76RM3BfKvL8REa-1920-80.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>Obviously, the iPhone Duo introduces a leap in everyday utility that most iPhone users aren’t accustomed to, especially anyone who creates content on the go. Having a folding form factor transforms how I shoot: I can prop it up like a built-in tripod, use the exterior display as a high-res viewfinder for better selfies, and record vlogs while keeping myself framed properly in the shot. That versatility unlocks creative angles I simply can’t get with standard slabs.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZM8ZjrWEbcUw7SrepyDeBM" name="Apple Event — September 9 11-56 screenshot" alt="iPhone 18 Pro in Burgundy in hand at Apple Surprise and Shine" src="https://cdn.mos.cms.futurecdn.net/ZM8ZjrWEbcUw7SrepyDeBM-1920-80.png" 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: Apple)</span></figcaption></figure><p>Yet, after spending years testing and living with rival foldables, the Duo’s mechanical hinge still gives me pause when it comes to long-term durability. Apple’s engineering looks convincing, but anything with moving parts remains a genuine concern.</p><p>In contrast, the iPhone 18 Pro and iPhone 18 Pro Max stick to the familiar playbook. They feature rigid enclosures, proven water resistance, and toughened glass surfaces that have repeatedly demonstrated they can take real-world abuse without cracking under pressure. The Duo certainly wins on novelty and specialized utility, but the Pros offer the kind of rock-solid durability that doesn’t require you to constantly baby your device.</p><h2 class="article-body__section" id="section-clever-camera-utility-versus-pro-photography"><span>Clever camera utility versus Pro photography</span></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="SoAi2j7o9Dqs6v288A4cEa" name="iPhone Duo edit 3" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/SoAi2j7o9Dqs6v288A4cEa-1920-80.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've always been a big fan of the utility and convenience offered by foldable phones, and the iPhone Duo is no exception. It’s incredibly useful to have that external display for better-framed selfies or to show a subject what the final shot will look like, and its 48MP main camera is practically identical to what you’ll find on the Pros. Since that's the workhorse sensor I rely on most, I’m confident it can handle almost any challenging lighting condition. However, the lack of a dedicated telephoto lens on the Duo stings.</p><p>Beyond hardware, I can’t overstate how much software elevates the shooting experience. Not only do the iPhone 18 Pro and 18 Pro Max share the same triple-camera system — complete with a 48MP main sensor featuring a variable aperture — but they also get treated to Apple's full suite of advanced creative tools.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HhGRiHZ8d4hXRLpaxyqFEH" name="Apple Event — September 9 25-43 screenshot" alt="Pro Controls on iPhone 18 Pro" src="https://cdn.mos.cms.futurecdn.net/HhGRiHZ8d4hXRLpaxyqFEH-1920-80.png" 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: Apple)</span></figcaption></figure><p>From Pro Controls for manual adjustments and Spatial photo/video capture to LOG video recording and uncompressed ProRAW photos, these are pro-grade features you simply won't get on the Duo.</p><h2 class="article-body__section" id="section-same-apple-intelligence-two-totally-different-workflows"><span>Same Apple Intelligence, two totally different workflows</span></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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.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>Under the hood, all three phones run the new A20 Pro chip to handle demanding tasks with ease. Whether you pick up the iPhone 18 Pro, Pro Max, or the Duo, you also get the exact same suite of Apple Intelligence and Siri AI features. You won’t miss out on any core capabilities by choosing a traditional slab over the foldable.</p><p>Where the software experience dramatically diverges, however, is screen-space utility. The iPhone Duo transforms <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a> into an expansive workspace that the Pros simply can’t match. Thanks to dynamic app scaling and true side-by-side multitasking, the Duo lets you effortlessly run two apps at once.</p><p>On the iPhone 18 Pro and Pro Max, multitasking is still limited to a single-app flow where you’re forced to minimize one app to interact with another. If your daily routine revolves around juggling multiple workflows simultaneously, the Duo’s software depth provides an undeniable advantage.</p><h2 class="article-body__section" id="section-apple-indicates-which-one-has-the-long-battery-life"><span>Apple indicates which one has the long battery life</span></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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sAFnnQsMDkhrRiPhTeYah9" name="iphone-18-pro-model-unselect-gallery-1-202609" alt="iphone 18 pro and pro max side by side" src="https://cdn.mos.cms.futurecdn.net/sAFnnQsMDkhrRiPhTeYah9-1920-80.webp" 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: Apple)</span></figcaption></figure><p>Without putting them through proper benchmark testing, it’s hard to say definitively which of the three will offer the greatest battery endurance. Even though Apple doesn’t officially disclose battery capacities, Apple's spec sheet reveals that the iPhone 18 Pro Max will remain the undisputed champion. It’s rated for an astonishing 45 hours of video playback, easily outpacing the smaller iPhone 18 Pro’s respectable 36 hours.</p><p>Because it features two displays, the iPhone Duo’s endurance varies depending on which screen you use most. When folded, its outer display offers 44 hours of playback — nearly on par with the Pro Max. But the moment you unfold it to reveal the larger 7.6-inch main screen, battery life takes a noticeable hit, dropping to 31 hours of local playback.</p><h2 class="article-body__section" id="section-it-s-a-tough-call"><span>It's a tough call</span></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:1960px;"><p class="vanilla-image-block" style="padding-top:71.43%;"><img id="9ev3U6oVqLNtW76xrqJLDe" name="Apple-iPhone-18-Pro-color-lineup-260909_big.jpg.large_2x" alt="iPhone 18 pro max" src="https://cdn.mos.cms.futurecdn.net/9ev3U6oVqLNtW76xrqJLDe-1920-80.jpg" mos="" align="middle" fullscreen="" width="1960" height="1400" 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>Ultimately, deciding between these three flagships comes down to what you value most: pocketable ergonomics, maximum endurance, or multitasking. The iPhone Duo undeniably adds an exciting layer of utility by turning a compact phone into a canvas for side-by-side apps and hands-free shooting, but that versatility comes with glaring camera compromises. Despite its steep price, the Duo drops the dedicated telephoto lens and misses out on the Pro line's new mechanical variable-aperture system and all the other tools like Pro Controls.</p><p>That's why I still recommend the iPhone 18 Pro Max for now as the smartest buy. At just $100 more than the standard iPhone 18 Pro, it easily justifies the modest bump with an expansive display and longer battery life. Then again, it'll likely change once they're put through the Tom's Guide testing.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eGbxVX"></div>                            </div>                            <script src="https://kwizly.com/embed/eGbxVX.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/best-picks/best-apple-watch">The best Apple Watch you can buy right now</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-needs-these-3-features-to-compete-with-the-likes-of-the-garmin-fenix-9">Apple Watch Ultra 4 needs these 3 features to compete with the likes of the Garmin Fenix 9</a></li><li><a href="https://www.tomsguide.com/phones/live/apple-surprise-and-shine-live-iphone-ultra-iphone-18-pro-max-apple-watch-series-12-and-all-the-latest-news">Apple September event live blog</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=iPhones&rows=4&view_mode=savings_squad&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=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');                    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);          const showHeaderDetails = params.get('show_header_details') !== 'false';          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' && showHeaderDetails) ? '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, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta: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 finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        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.getRowsLimit();                    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 siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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=${siteParam}&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 siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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 = this.decodeHTML(description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim());                summaryTitle = this.decodeHTML(summaryTitle);                                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.getFilteredDeals().slice(0, this.displayLimit), 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');                    url.searchParams.append('rows', this.getRowsLimit().toString());          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.getFilteredDeals().slice(0, this.displayLimit), 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 = this.getRowsLimit();          // 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.getFilteredDeals().slice(0, this.displayLimit), 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: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(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 finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \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)}" ${dataAttr} 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; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \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');            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 += this.getRowsLimit();              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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-duo-vs-iphone-18-pro-vs-iphone-18-pro-max-heres-the-one-i-recommend</link>
                                                                            <description>
                            <![CDATA[ Choosing between the iPhone Duo, iPhone 18 Pro, and iPhone 18 Pro Max is tough, but I break it all down to tell you which one is worth buying. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pK3KyRc9KU3iW5fyTWAqUa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DRnLLVmpQuzzengDjXNSQb-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 04:15:00 +0000</pubDate>                                                                                                                                <updated>Sat, 12 Sep 2026 12:20:06 +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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DRnLLVmpQuzzengDjXNSQb-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple / Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Duo vs. iPhone 18 Pro vs. iPhone 18 Pro Max.]]></media:description>                                                            <media:text><![CDATA[iPhone Duo vs. iPhone 18 Pro vs. iPhone 18 Pro Max.]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Duo vs. iPhone 18 Pro vs. iPhone 18 Pro Max.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DRnLLVmpQuzzengDjXNSQb-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Every year when Apple unveils its flagship lineup, people always ask me which one is worth their money. This year’s reveal at the <a href="https://www.tomsguide.com/phones/live/apple-surprise-and-shine-live-iphone-ultra-iphone-18-pro-max-apple-watch-series-12-and-all-the-latest-news">"Surprise and Shine" event</a> is no exception because Apple has completely upended the playbook by introducing its first-ever foldable, the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-is-official-price-release-date-specs-and-everything-you-need-to-know">iPhone Duo</a>.</p><p>While refining the hardware and software is no doubt a huge undertaking on Apple’s part, the company still needs to convince buyers that it’s worth the premium over its two other flagships: the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-iphone-18-pro-max-are-official-heres-what-you-need-to-know">iPhone 18 Pro and iPhone 18 Pro Max</a>. Deciding which flagship belongs in your pocket is a substantially tougher call, but I’m going to break down their specs, features, prices, and more to tell you which one truly deserves your money.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/2qNfOa5AuVU" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-iphone-duo-vs-iphone-18-pro-vs-iphone-18-pro-max-specifications"><span>iPhone Duo vs. iPhone 18 Pro vs. iPhone 18 Pro Max: Specifications</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>iPhone Duo</strong></p></th><th  ><p>iPhone 18 Pro</p></th><th  ><p>iPhone 18 Pro Max</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,999</p></td><td  ><p>$1,199</p></td><td  ><p>$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>7.6-inch Super Retina XDR (1,878 x 2,670)</p></td><td  ><p>6.3-inch Super Retina XDR display (2,622 x 1,206)</p></td><td  ><p>6.9-inch Super Retina XDR display (2,868 x 1,320)</p></td></tr><tr><td class="firstcol " ><p><strong>Outer Display</strong></p></td><td  ><p>5.4-inch Super Retina XDR (1,398 x 2,034)</p></td><td  ><p>N/A</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>A20 Pro</p></td><td  ><p>A20 Pro</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td><td  ><p>12GB</p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Front Cameras</strong></p></td><td  ><p>12MP Center Stage outer (ƒ/2.2), 1080p under-display FaceTime inner camera (f/1.8)</p></td><td  ><p>18MP Center Stage camera (f/1.9)</p></td><td  ><p>18MP Center Stage camera (f/1.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>48MP main (f/1.6), 48MP ultrawide (f/2.2)</p></td><td  ><p>48MP main with variable aperture (f/1.48, f/1.8, f/2.8, f/4), 48MP ultrawide (f/2.2), 48MP telephoto w/4x optical zoom (f/2.8)</p></td><td  ><p>48MP main with variable aperture (f/1.48, f/1.8, f/2.8, f/4), 48MP ultrawide (f/2.2), 48MP telephoto w/4x optical zoom (f/2.8)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life Video Playback</strong></p></td><td  ><p>Up to 44 hours when using the outer display, up to 31 hours when using the inner display</p></td><td  ><p>Up to 36 hours</p></td><td  ><p>Up to 45 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.48 x 4.64 x 0.21 inches open (164.6 x 117.8 x 5.2mm), 3.31 x 4.64 x 0.44 inches closed (84.1 x 117.8 x 11.3mm)</p></td><td  ><p>5.91 x 2.83 x 0.34 inches (150.0 x 71.9 x 8.75 mm)</p></td><td  ><p>6.43 x 3.07 x 0.34 inches (163.4 x 78.0 x 8.75 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.96 ounces (254 grams)</p></td><td  ><p>7.44 ounces (211 grams)</p></td><td  ><p>8.78 ounces (249 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP68</p></td><td  ><p>IP68</p></td><td  ><p>IP68</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Night Sky, Star White</p></td><td  ><p>Black, Silver, Glacier, Burgundy</p></td><td  ><p>Black, Silver, Glacier, Burgundy</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-price-does-matter"><span>Price does matter</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>256GB</strong></p></td><td  ><p><strong>2TB</strong></p></td><td  ><p><strong>Dollar Increase</strong></p></td><td  ><p><strong>Percentage Increase</strong></p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro</strong></p></td><td  ><p>$1,199</p></td><td  ><p>$2,399</p></td><td  ><p>$1,200</p></td><td  ><p>100.08%</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 18 Pro Max</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$2,499</p></td><td  ><p>$1,200</p></td><td  ><p>92.38%</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone Duo</strong></p></td><td  ><p>$1,999</p></td><td  ><p>$3,199</p></td><td  ><p>$1,200</p></td><td  ><p>60.03%</p></td></tr></tbody></table></div><p>Apple’s latest price adjustments certainly sting, with both traditional flagships seeing a $100 price hike across the board. That means the iPhone 18 Pro and 18 Pro Max will cost you more than in previous years, as starting prices climb to $1,199 for a 256GB iPhone 18 Pro and $1,299 for the equivalent iPhone 18 Pro Max. At the extreme end, you’re looking at paying $2,399 and $2,499 for the 2TB options on the Pro and Pro Max, respectively.</p><p>But despite their higher costs, placing those figures next to the iPhone Duo makes them look like outright bargains that will save you far more cash upfront. While I do applaud Apple for keeping the Duo’s base price competitive at $1,999 for 256GB, that’s still a massive $700 to $800 leap over the Pro models — and it quickly balloons to $3,199 for the 2TB version.</p><p>Interestingly, when I ran the numbers, Apple charges a flat $1,200 premium across the board to jump from 256GB to 2TB. On the iPhone 18 Pro, that upgrade literally doubles the phone's price — a massive 100% surge from $1,199 to $2,399. Meanwhile, it represents a 92% hike on the Pro Max and a 60% increase on the Duo.</p><p>Unless you genuinely need maximum local capacity, jumping all the way to 2TB is best justified on the Duo.</p><h2 class="article-body__section" id="section-tried-and-true-reliability-versus-utility"><span>Tried and true reliability versus utility</span></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="N49opwHV76RM3BfKvL8REa" name="iPhone duo edit 2" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/N49opwHV76RM3BfKvL8REa-1920-80.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>Obviously, the iPhone Duo introduces a leap in everyday utility that most iPhone users aren’t accustomed to, especially anyone who creates content on the go. Having a folding form factor transforms how I shoot: I can prop it up like a built-in tripod, use the exterior display as a high-res viewfinder for better selfies, and record vlogs while keeping myself framed properly in the shot. That versatility unlocks creative angles I simply can’t get with standard slabs.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZM8ZjrWEbcUw7SrepyDeBM" name="Apple Event — September 9 11-56 screenshot" alt="iPhone 18 Pro in Burgundy in hand at Apple Surprise and Shine" src="https://cdn.mos.cms.futurecdn.net/ZM8ZjrWEbcUw7SrepyDeBM-1920-80.png" 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: Apple)</span></figcaption></figure><p>Yet, after spending years testing and living with rival foldables, the Duo’s mechanical hinge still gives me pause when it comes to long-term durability. Apple’s engineering looks convincing, but anything with moving parts remains a genuine concern.</p><p>In contrast, the iPhone 18 Pro and iPhone 18 Pro Max stick to the familiar playbook. They feature rigid enclosures, proven water resistance, and toughened glass surfaces that have repeatedly demonstrated they can take real-world abuse without cracking under pressure. The Duo certainly wins on novelty and specialized utility, but the Pros offer the kind of rock-solid durability that doesn’t require you to constantly baby your device.</p><h2 class="article-body__section" id="section-clever-camera-utility-versus-pro-photography"><span>Clever camera utility versus Pro photography</span></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="SoAi2j7o9Dqs6v288A4cEa" name="iPhone Duo edit 3" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/SoAi2j7o9Dqs6v288A4cEa-1920-80.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've always been a big fan of the utility and convenience offered by foldable phones, and the iPhone Duo is no exception. It’s incredibly useful to have that external display for better-framed selfies or to show a subject what the final shot will look like, and its 48MP main camera is practically identical to what you’ll find on the Pros. Since that's the workhorse sensor I rely on most, I’m confident it can handle almost any challenging lighting condition. However, the lack of a dedicated telephoto lens on the Duo stings.</p><p>Beyond hardware, I can’t overstate how much software elevates the shooting experience. Not only do the iPhone 18 Pro and 18 Pro Max share the same triple-camera system — complete with a 48MP main sensor featuring a variable aperture — but they also get treated to Apple's full suite of advanced creative tools.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HhGRiHZ8d4hXRLpaxyqFEH" name="Apple Event — September 9 25-43 screenshot" alt="Pro Controls on iPhone 18 Pro" src="https://cdn.mos.cms.futurecdn.net/HhGRiHZ8d4hXRLpaxyqFEH-1920-80.png" 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: Apple)</span></figcaption></figure><p>From Pro Controls for manual adjustments and Spatial photo/video capture to LOG video recording and uncompressed ProRAW photos, these are pro-grade features you simply won't get on the Duo.</p><h2 class="article-body__section" id="section-same-apple-intelligence-two-totally-different-workflows"><span>Same Apple Intelligence, two totally different workflows</span></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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.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>Under the hood, all three phones run the new A20 Pro chip to handle demanding tasks with ease. Whether you pick up the iPhone 18 Pro, Pro Max, or the Duo, you also get the exact same suite of Apple Intelligence and Siri AI features. You won’t miss out on any core capabilities by choosing a traditional slab over the foldable.</p><p>Where the software experience dramatically diverges, however, is screen-space utility. The iPhone Duo transforms <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a> into an expansive workspace that the Pros simply can’t match. Thanks to dynamic app scaling and true side-by-side multitasking, the Duo lets you effortlessly run two apps at once.</p><p>On the iPhone 18 Pro and Pro Max, multitasking is still limited to a single-app flow where you’re forced to minimize one app to interact with another. If your daily routine revolves around juggling multiple workflows simultaneously, the Duo’s software depth provides an undeniable advantage.</p><h2 class="article-body__section" id="section-apple-indicates-which-one-has-the-long-battery-life"><span>Apple indicates which one has the long battery life</span></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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sAFnnQsMDkhrRiPhTeYah9" name="iphone-18-pro-model-unselect-gallery-1-202609" alt="iphone 18 pro and pro max side by side" src="https://cdn.mos.cms.futurecdn.net/sAFnnQsMDkhrRiPhTeYah9-1920-80.webp" 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: Apple)</span></figcaption></figure><p>Without putting them through proper benchmark testing, it’s hard to say definitively which of the three will offer the greatest battery endurance. Even though Apple doesn’t officially disclose battery capacities, Apple's spec sheet reveals that the iPhone 18 Pro Max will remain the undisputed champion. It’s rated for an astonishing 45 hours of video playback, easily outpacing the smaller iPhone 18 Pro’s respectable 36 hours.</p><p>Because it features two displays, the iPhone Duo’s endurance varies depending on which screen you use most. When folded, its outer display offers 44 hours of playback — nearly on par with the Pro Max. But the moment you unfold it to reveal the larger 7.6-inch main screen, battery life takes a noticeable hit, dropping to 31 hours of local playback.</p><h2 class="article-body__section" id="section-it-s-a-tough-call"><span>It's a tough call</span></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:1960px;"><p class="vanilla-image-block" style="padding-top:71.43%;"><img id="9ev3U6oVqLNtW76xrqJLDe" name="Apple-iPhone-18-Pro-color-lineup-260909_big.jpg.large_2x" alt="iPhone 18 pro max" src="https://cdn.mos.cms.futurecdn.net/9ev3U6oVqLNtW76xrqJLDe-1920-80.jpg" mos="" align="middle" fullscreen="" width="1960" height="1400" 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>Ultimately, deciding between these three flagships comes down to what you value most: pocketable ergonomics, maximum endurance, or multitasking. The iPhone Duo undeniably adds an exciting layer of utility by turning a compact phone into a canvas for side-by-side apps and hands-free shooting, but that versatility comes with glaring camera compromises. Despite its steep price, the Duo drops the dedicated telephoto lens and misses out on the Pro line's new mechanical variable-aperture system and all the other tools like Pro Controls.</p><p>That's why I still recommend the iPhone 18 Pro Max for now as the smartest buy. At just $100 more than the standard iPhone 18 Pro, it easily justifies the modest bump with an expansive display and longer battery life. Then again, it'll likely change once they're put through the Tom's Guide testing.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eGbxVX"></div>                            </div>                            <script src="https://kwizly.com/embed/eGbxVX.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/best-picks/best-apple-watch">The best Apple Watch you can buy right now</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-needs-these-3-features-to-compete-with-the-likes-of-the-garmin-fenix-9">Apple Watch Ultra 4 needs these 3 features to compete with the likes of the Garmin Fenix 9</a></li><li><a href="https://www.tomsguide.com/phones/live/apple-surprise-and-shine-live-iphone-ultra-iphone-18-pro-max-apple-watch-series-12-and-all-the-latest-news">Apple September event live blog</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=iPhones&rows=4&view_mode=savings_squad&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=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');                    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);          const showHeaderDetails = params.get('show_header_details') !== 'false';          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' && showHeaderDetails) ? '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, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta: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 finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        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.getRowsLimit();                    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 siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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=${siteParam}&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 siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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 = this.decodeHTML(description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim());                summaryTitle = this.decodeHTML(summaryTitle);                                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.getFilteredDeals().slice(0, this.displayLimit), 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');                    url.searchParams.append('rows', this.getRowsLimit().toString());          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.getFilteredDeals().slice(0, this.displayLimit), 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 = this.getRowsLimit();          // 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.getFilteredDeals().slice(0, this.displayLimit), 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: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(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 finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \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)}" ${dataAttr} 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; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \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');            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 += this.getRowsLimit();              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[ The 10 most influential games ever, according to ChatGPT, Gemini, Claude and Perplexity — and two of them couldn’t agree on No. 1 for National Video Games Day ]]></title>
                                                                                                <dc:content><![CDATA[ <p>To say that games have impacted my life in a major way would be the biggest understatement ever.</p><p>Discovering video games at a young age helped me find one of my favorite pastimes, led me to become a journalist and helped me interact with gaming & entertainment industry personalities I thought I’d never meet. For this year’s installment of National Video Games Day (a holiday meant to honor the legendary history, evolution and cultural impact of interactive media), I wanted to try something fun that combined my love for gaming and my newfound appreciation for AI.</p><p>I came to <a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-claude-and-perplexity-what-they-really-think-of-each-other-and-their-responses-revealed-their-biggest-strengths-and-weaknesses">ChatGPT, Gemini, Claude and Perplexity</a> with a simple request: “Give me your ranking of the 10 most influential video games of all time.” And after cataloging all their results, I came away with two thoughts: all four chatbots recognize the major trendsetters of the video game industry and two of them couldn’t agree on which game deserved to take the No. 1 spot.</p><p>Here’s what each chatbot delivered in response to my inquiry and even my own ranking of the 10 most influential video games of all time.</p><h2 id="where-these-four-chatbots-agreed-and-disagreed">Where these four chatbots agreed and disagreed</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="vpvcDoUr3fszkk8jhdKutL" name="shutterstock_2211833037-16x9" alt="pac man" src="https://cdn.mos.cms.futurecdn.net/vpvcDoUr3fszkk8jhdKutL-1920-80.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>All four chatbots wasted little time in proving their video game knowledge is stronger than I expected when they presented me with their personal ranking of the 10 most influential video games ever made:</p><ul><li><strong>ChatGPT: </strong><em>Super Mario Bros., Tetris, Doom, The Legend of Zelda, Grand Theft Auto III, Minecraft, World of Warcraft, Pong, Half-Life, and Wii Sports.</em></li><li><strong>Gemini: </strong><em>Pong, Super Mario Bros., Tetris, Doom, Street Fighter II: The World Warrior, Super Mario 64, Grand Theft Auto III, World of Warcraft, Minecraft, and Dark Souls.</em></li><li><strong>Claude: </strong><em>Doom, Super Mario Bros., Tetris, World of Warcraft, Minecraft, The Legend of Zelda, Half-Life, Pong, Street Fighter II, and Grand Theft Auto III.</em></li><li><strong>Perplexity: </strong><em>Pong, Super Mario Bros., Tetris, Doom, The Legend of Zelda, Street Fighter II: The World Warrior, Super Mario 64, Grand Theft Auto III, World of Warcraft, and Minecraft.</em></li></ul><p>What impressed me about ChatGPT’s acknowledgement of Super Mario Bros. as the most influential video game of all time was the factual reasons it used to back up its choice.</p><p>The chatbot noted that it practically revived the home-console gaming market after the crash of 1983, established the traditional conventions for 2D platformers that are still around to this day, produced arguably the most recognizable video game character of all time, helped cement the idea that gaming could deliver deeper experiences at home and showcased a textbook example of level design that teaches players what to do through gameplay.</p><p>Claude’s rationale for choosing Doom is as follows: <em>Defined the FPS genre, pioneered shareware distribution, and its modding scene (WAD files) kickstarted the entire user-generated-content movement in gaming.</em></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="jQw6C5Ws9jRFyJorsXHZTD" name="shutterstock_2507107843-16x9" alt="super mario bros" src="https://cdn.mos.cms.futurecdn.net/jQw6C5Ws9jRFyJorsXHZTD-1920-80.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>I also found it pretty wild how ChatGPT and Claude’s No. 1 picks were completely different from each other, while Gemini and Perplexity emerged with the same game for the top spot on their respective lists. Here’s the reasoning Gemini and Perplexity brought up to explain their decision to place Pong in the No. 1 position:</p><ul><li><strong>Gemini: </strong><em><strong>The Breakthrough: </strong></em><em>Proved commercial viability. Why It’s Essential: While not technically the first video game, Pong was the spark that established video games as a commercial industry. It proved that people would pay real money to play interactive digital games, launching arcade culture and home console gaming simultaneously.</em></li><li><strong>Perplexity: </strong><em>The essential commercial breakthrough. Pong made the video game legible to a mass public: two controls, one immediate competitive idea, and an arcade format that helped establish games as a viable entertainment business. Its simplicity became a template for accessible design.</em></li></ul><p>Alongside ChatGPT’s ranked selections for its most influential games, it also brought up a bunch of games it deemed “painful omissions” that would make its top 20 list if permitted to do so. </p><p>Those 10 other games included Spacewar!, Pac-Man, Street Fighter II, Pokémon Red/Blue, Final Fantasy VII, The Sims, Counter-Strike, Dark Souls, Fortnite and The Last of Us. Claude also had two honorable mentions of its own: Fortnite and EVE Online.</p><p>As for my ranking of the 10 most influential video games of all time, I went with Pong (it seems like I agree with Gemini and Perplexity), Pac-Man, Super Mario Bros., Tetris, The Legend of Zelda, Street Fighter II: The World Warrior, Doom, Virtua Fighter, Half-Life and Grand Theft Auto III.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Wl8k1W"></div>                            </div>                            <script src="https://kwizly.com/embed/Wl8k1W.js" async></script><h2 id="final-thoughts-4">Final thoughts</h2><p>I have to hand it to all four chatbots: they mentioned a strong selection of games that anyone who’s immersed in the hobby would mention on their list of the most influential titles in the still-thriving entertainment genre. Super Mario Bros., Pong and Doom all earned top billing among all four chatbots — all three games had a major impact on the gaming industry that captured millions of gamers’ attention and inspired plenty of iconic titles in their wake.</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/ai/i-used-ask-maps-in-google-maps-to-find-the-best-date-spots-in-my-city-and-the-recommendations-were-a-lot-better-than-i-expected" target="_blank"><strong>I tried Google’s new ‘Ask Maps’ feature for date night — it was shockingly good</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt-images-2-5-can-do-a-lot-more-than-you-think-7-fun-prompts-to-show-off-your-creative-side-with-2-of-my-favorites" target="_blank"><strong>I tested ChatGPT’s Images 2.5 — these 7 prompts show how much it leveled up</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/anthropic-modeled-what-ai-could-do-by-2030-the-economy-gets-32-percent-richer-while-workers-get-left-behind" target="_blank"><strong>Anthropic modeled what AI could do by 2030 — the economy gets 32% richer while workers get left behind</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/the-10-most-influential-games-ever-according-to-chatgpt-gemini-claude-and-perplexity-and-two-of-them-couldnt-agree-on-no-1-for-national-video-games-day</link>
                                                                            <description>
                            <![CDATA[ I asked four chatbots to rank the 10 most influential video games of all time for a very fitting holiday. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CcvbMcJLYPV4joRPGyjrJJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gkGgTYaLWMGP8y3R8KDSz8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gkGgTYaLWMGP8y3R8KDSz8-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[atari]]></media:description>                                                            <media:text><![CDATA[atari]]></media:text>
                                <media:title type="plain"><![CDATA[atari]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gkGgTYaLWMGP8y3R8KDSz8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>To say that games have impacted my life in a major way would be the biggest understatement ever.</p><p>Discovering video games at a young age helped me find one of my favorite pastimes, led me to become a journalist and helped me interact with gaming & entertainment industry personalities I thought I’d never meet. For this year’s installment of National Video Games Day (a holiday meant to honor the legendary history, evolution and cultural impact of interactive media), I wanted to try something fun that combined my love for gaming and my newfound appreciation for AI.</p><p>I came to <a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-claude-and-perplexity-what-they-really-think-of-each-other-and-their-responses-revealed-their-biggest-strengths-and-weaknesses">ChatGPT, Gemini, Claude and Perplexity</a> with a simple request: “Give me your ranking of the 10 most influential video games of all time.” And after cataloging all their results, I came away with two thoughts: all four chatbots recognize the major trendsetters of the video game industry and two of them couldn’t agree on which game deserved to take the No. 1 spot.</p><p>Here’s what each chatbot delivered in response to my inquiry and even my own ranking of the 10 most influential video games of all time.</p><h2 id="where-these-four-chatbots-agreed-and-disagreed">Where these four chatbots agreed and disagreed</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="vpvcDoUr3fszkk8jhdKutL" name="shutterstock_2211833037-16x9" alt="pac man" src="https://cdn.mos.cms.futurecdn.net/vpvcDoUr3fszkk8jhdKutL-1920-80.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>All four chatbots wasted little time in proving their video game knowledge is stronger than I expected when they presented me with their personal ranking of the 10 most influential video games ever made:</p><ul><li><strong>ChatGPT: </strong><em>Super Mario Bros., Tetris, Doom, The Legend of Zelda, Grand Theft Auto III, Minecraft, World of Warcraft, Pong, Half-Life, and Wii Sports.</em></li><li><strong>Gemini: </strong><em>Pong, Super Mario Bros., Tetris, Doom, Street Fighter II: The World Warrior, Super Mario 64, Grand Theft Auto III, World of Warcraft, Minecraft, and Dark Souls.</em></li><li><strong>Claude: </strong><em>Doom, Super Mario Bros., Tetris, World of Warcraft, Minecraft, The Legend of Zelda, Half-Life, Pong, Street Fighter II, and Grand Theft Auto III.</em></li><li><strong>Perplexity: </strong><em>Pong, Super Mario Bros., Tetris, Doom, The Legend of Zelda, Street Fighter II: The World Warrior, Super Mario 64, Grand Theft Auto III, World of Warcraft, and Minecraft.</em></li></ul><p>What impressed me about ChatGPT’s acknowledgement of Super Mario Bros. as the most influential video game of all time was the factual reasons it used to back up its choice.</p><p>The chatbot noted that it practically revived the home-console gaming market after the crash of 1983, established the traditional conventions for 2D platformers that are still around to this day, produced arguably the most recognizable video game character of all time, helped cement the idea that gaming could deliver deeper experiences at home and showcased a textbook example of level design that teaches players what to do through gameplay.</p><p>Claude’s rationale for choosing Doom is as follows: <em>Defined the FPS genre, pioneered shareware distribution, and its modding scene (WAD files) kickstarted the entire user-generated-content movement in gaming.</em></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="jQw6C5Ws9jRFyJorsXHZTD" name="shutterstock_2507107843-16x9" alt="super mario bros" src="https://cdn.mos.cms.futurecdn.net/jQw6C5Ws9jRFyJorsXHZTD-1920-80.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>I also found it pretty wild how ChatGPT and Claude’s No. 1 picks were completely different from each other, while Gemini and Perplexity emerged with the same game for the top spot on their respective lists. Here’s the reasoning Gemini and Perplexity brought up to explain their decision to place Pong in the No. 1 position:</p><ul><li><strong>Gemini: </strong><em><strong>The Breakthrough: </strong></em><em>Proved commercial viability. Why It’s Essential: While not technically the first video game, Pong was the spark that established video games as a commercial industry. It proved that people would pay real money to play interactive digital games, launching arcade culture and home console gaming simultaneously.</em></li><li><strong>Perplexity: </strong><em>The essential commercial breakthrough. Pong made the video game legible to a mass public: two controls, one immediate competitive idea, and an arcade format that helped establish games as a viable entertainment business. Its simplicity became a template for accessible design.</em></li></ul><p>Alongside ChatGPT’s ranked selections for its most influential games, it also brought up a bunch of games it deemed “painful omissions” that would make its top 20 list if permitted to do so. </p><p>Those 10 other games included Spacewar!, Pac-Man, Street Fighter II, Pokémon Red/Blue, Final Fantasy VII, The Sims, Counter-Strike, Dark Souls, Fortnite and The Last of Us. Claude also had two honorable mentions of its own: Fortnite and EVE Online.</p><p>As for my ranking of the 10 most influential video games of all time, I went with Pong (it seems like I agree with Gemini and Perplexity), Pac-Man, Super Mario Bros., Tetris, The Legend of Zelda, Street Fighter II: The World Warrior, Doom, Virtua Fighter, Half-Life and Grand Theft Auto III.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Wl8k1W"></div>                            </div>                            <script src="https://kwizly.com/embed/Wl8k1W.js" async></script><h2 id="final-thoughts-4">Final thoughts</h2><p>I have to hand it to all four chatbots: they mentioned a strong selection of games that anyone who’s immersed in the hobby would mention on their list of the most influential titles in the still-thriving entertainment genre. Super Mario Bros., Pong and Doom all earned top billing among all four chatbots — all three games had a major impact on the gaming industry that captured millions of gamers’ attention and inspired plenty of iconic titles in their wake.</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/ai/i-used-ask-maps-in-google-maps-to-find-the-best-date-spots-in-my-city-and-the-recommendations-were-a-lot-better-than-i-expected" target="_blank"><strong>I tried Google’s new ‘Ask Maps’ feature for date night — it was shockingly good</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/chatgpt-images-2-5-can-do-a-lot-more-than-you-think-7-fun-prompts-to-show-off-your-creative-side-with-2-of-my-favorites" target="_blank"><strong>I tested ChatGPT’s Images 2.5 — these 7 prompts show how much it leveled up</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/anthropic-modeled-what-ai-could-do-by-2030-the-economy-gets-32-percent-richer-while-workers-get-left-behind" target="_blank"><strong>Anthropic modeled what AI could do by 2030 — the economy gets 32% richer while workers get left behind</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I asked experts if it was okay to hang my garden lights over a joint fence — here's what they say ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With summer drawing to a close, this also means the start of darker evenings. And I love nothing better than placing string lights in my backyard to add warmth and a cozy ambience to the outdoor space.</p><p>But while I adore the ease and aesthetic of draping such lights across my fencing, this could potentially violate line regulations and boundary fence rules. What’s more, you might need to ask permission from your neighbors if you have joint ownership of a fence.</p><p>To avoid a potential neighborhood fallout, I asked legal experts what the ‘rules’ are when it comes to line regulations and proper etiquette to keep in mind. So before you decorate your fences for fall, here's what the pros recommend.   </p><h3 class="article-body__section" id="section-is-it-ok-to-hang-string-lights-over-a-boundary-fence"><span>Is it ok to hang string lights over a boundary fence?</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="PZLt8X8PuRSCwgjkpyZQ4m" name="String lights in yard" alt="String lights in backyard" src="https://cdn.mos.cms.futurecdn.net/PZLt8X8PuRSCwgjkpyZQ4m-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">String lights in backyard </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The general answer is <strong>yes</strong>, but this entirely depends on who owns the fence, (which we often assume incorrectly), state property law, local zoning ordinances, and your HOA (if you live in a community with one). </p><p>However, the rule of thumb is if it's jointly owned, you both share responsibility for the fence. “The actual rule is outlined in <a href="https://codes.findlaw.com/ca/civil-code/civ-sect-841/" target="_blank">California's Good Neighbor Fence Law (Civil Code § 841)</a>,” states Edward Susolik, CEO & President of <a href="http://www.callahan-law.com" target="_blank">Callahan & Blaine, PC</a>.</p><p>“In short, if the fence is built on the property boundary line, then both neighbors benefit from the fence and are also required to share the responsibility and costs. But if the fence is only on one side of the property line, it actually belongs to the property owner.”</p><p>Although hanging string lights over a fence would seem minor, compared to <a href="https://www.tomsguide.com/home/gardening/is-it-ok-to-cut-my-neighbors-overhanging-bushes-i-asked-the-experts-to-find-out-if-im-within-my-rights">cutting neighbors’ overhanging trees</a>, homeowners could risk legal liability by attaching anything to a shared fence without their neighbor’s permission. </p><p>“In my experience, hanging some lights isn't the first issue when a dispute arises,” adds Susolik. “It's always when one neighbor assumes the fence is theirs to decorate when it legally isn't."</p><div><blockquote><p>“Should a neighbor attach lights or any other items to your fence, you have the right to demand removal.”</p><p>Edward Susolik, CEO of Callahan & Blaine</p></blockquote></div><p>“If your fence sits entirely within your side of the property line, neighbors cannot attach anything to it without your permission. Should a neighbor attach lights or any other items to your fence, you have the right to demand removal.”</p><p>In addition, consider which direction your bulbs will be facing — up or down? Experts advise pointing lightbulbs downwards so that it lights up only your space and do not spill up and glare over the adjoining fence. </p><p>What’s more, it’s suggested to use soft, clear lights (not colorful, flashing lights) to minimize any complaints. </p><p>Fortunately, not everything has to result in tricky legal battles. A friendly chat with the person next door is usually the best place to start.</p><h3 class="article-body__section" id="section-politely-ask-your-neighbor"><span>Politely ask your neighbor</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:2973px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="ryFbQVS6JVUccwFryKRsVS" name="shutterstock_2200812425" alt="Neighbors speaking over the garden fence" src="https://cdn.mos.cms.futurecdn.net/ryFbQVS6JVUccwFryKRsVS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2973" height="1672" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Neighbors speaking over garden fence </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Similar to the task of <a href="https://www.tomsguide.com/home/outdoors/i-asked-experts-if-i-can-paint-my-side-of-my-neighbors-fence-heres-what-they-say">painting shared fences</a> or even <a href="https://www.tomsguide.com/home/outdoors/can-i-have-a-fire-pit-in-my-backyard-i-asked-experts-for-the-laws-and-etiquette-you-should-know-about">using a fire pit</a>, it’s always courteous to speak with your neighbor beforehand. </p><p>“Since you both own the fence, and ergo have equal rights on it, they also have a say in what happens to the fence,” agrees Stacy Kemp Ferrari, Founder and Managing Partner at Kemp Law Group. </p><p>“Even if it's something as harmless as hanging a few lines of fairy lights, the safest (and courteous) thing to do is to let them know.”  </p><p>But what’s the best practice if you’re not on friendly or first-name terms with them? Experts recommend following a conversation with a written agreement to avoid any misunderstandings. </p><p>“Ensure all agreements with your neighbors are in writing,” advises Susolik.  “Often, it can take something as simple as a text message to clarify what exactly is being attached, when it's coming down, and that it won't cause permanent damage.</p><p>“Also be sure to check any HOA rules and local ordinances, as some impose restrictions that no private agreement between neighbors can override.”</p><p>Essentially, the key thing is good communication — even if you may think it’s just harmless string lights being hung. Ultimately, this could save you the bother of legal conflicts to navigate.  </p><p>If in doubt, however, simply ensure that when installing string lights, they stay on your side of the property line/fence (along with any hooks or mounting hardware).  </p><p>So if you want to avoid any neighborhood wars, be sure to keep these rules in mind.</p><p>Also, if you still want to maintain a level of privacy, check out these <a href="https://www.tomsguide.com/how-to/7-plants-to-create-more-privacy-in-your-backyard">7 plants will create more privacy in your backyard</a><a href="https://www.tomsguide.com/how-to/5-ways-to-maintain-your-wooden-fence">.</a> </p><div class="product"><a data-dimension112="ea132ade-ac6d-11f1-ad4b-07eb55e12ef0" data-action="Deal Block" data-label="Chromatic Outdoor String Lights" data-dimension48="Chromatic Outdoor String Lights" data-dimension25="$239" href="https://www.amazon.com/Govee-Outdoor-Chromatic-Waterproof-compatible/dp/B0FX2S38JR?th=1" 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:100.00%;"><img id="8sotpp3XMWfBMEiRNBZace" name="Chromatic Outdoor String Lights" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8sotpp3XMWfBMEiRNBZace-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Govee-Outdoor-Chromatic-Waterproof-compatible/dp/B0FX2S38JR?th=1" target="_blank" rel="nofollow" data-dimension112="ea132ade-ac6d-11f1-ad4b-07eb55e12ef0" data-action="Deal Block" data-label="Chromatic Outdoor String Lights" data-dimension48="Chromatic Outdoor String Lights" data-dimension25="$239">Chromatic Outdoor String Lights: was $299 now $239</a></strong><br>Instead of copying traditional bulbs, Govee’s new smart string lights use a unique dual-layer design to pack an entire rainbow of color into every single bulb. This 65.6-foot strand features 54 individual RGB LEDs per bulb, making them punchy and bright enough to completely cut through midday sun glare at an afternoon BBQ. <a class="view-deal button" href="https://www.amazon.com/Govee-Outdoor-Chromatic-Waterproof-compatible/dp/B0FX2S38JR?th=1" target="_blank" rel="nofollow" data-dimension112="ea132ade-ac6d-11f1-ad4b-07eb55e12ef0" data-action="Deal Block" data-label="Chromatic Outdoor String Lights" data-dimension48="Chromatic Outdoor String Lights" data-dimension25="$239">View Deal</a></p></div><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/how-to/5-rude-habits-your-neighbors-hate">5 rude habits your neighbors hate</a></li><li><a href="https://www.tomsguide.com/home/gardeners-urged-to-spray-patios-and-paths-with-vinegar-until-november-and-its-not-as-strange-as-it-sounds">Gardeners urged to spray patios and paths with vinegar until November — and it’s not as strange as it sounds</a></li><li><a href="https://www.tomsguide.com/how-to/7-plants-to-create-more-privacy-in-your-backyard">These 7 plants will create more privacy in your backyard </a></li></ul><div data-widget-type="review" data-model-name="Felco 6 Elite"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/home/i-asked-experts-if-it-was-okay-to-hang-my-garden-lights-over-a-joint-fence-heres-what-they-say</link>
                                                                            <description>
                            <![CDATA[ Before you hang up your cozy backyard lights this season, check out these ‘neighborly’ rules first. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JR3LkC8jA8SsukdqJYQx2K</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/k43RJ6AR5bNZvSbkmKWBT4-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 09:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 11 Sep 2026 11:58:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/k43RJ6AR5bNZvSbkmKWBT4-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                        <media:description><![CDATA[&lt;p&gt;Solar Lights&lt;/p&gt;]]></media:description>                                                            <media:text><![CDATA[Solar Lights]]></media:text>
                                <media:title type="plain"><![CDATA[Solar Lights]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/k43RJ6AR5bNZvSbkmKWBT4-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With summer drawing to a close, this also means the start of darker evenings. And I love nothing better than placing string lights in my backyard to add warmth and a cozy ambience to the outdoor space.</p><p>But while I adore the ease and aesthetic of draping such lights across my fencing, this could potentially violate line regulations and boundary fence rules. What’s more, you might need to ask permission from your neighbors if you have joint ownership of a fence.</p><p>To avoid a potential neighborhood fallout, I asked legal experts what the ‘rules’ are when it comes to line regulations and proper etiquette to keep in mind. So before you decorate your fences for fall, here's what the pros recommend.   </p><h3 class="article-body__section" id="section-is-it-ok-to-hang-string-lights-over-a-boundary-fence"><span>Is it ok to hang string lights over a boundary fence?</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="PZLt8X8PuRSCwgjkpyZQ4m" name="String lights in yard" alt="String lights in backyard" src="https://cdn.mos.cms.futurecdn.net/PZLt8X8PuRSCwgjkpyZQ4m-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">String lights in backyard </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>The general answer is <strong>yes</strong>, but this entirely depends on who owns the fence, (which we often assume incorrectly), state property law, local zoning ordinances, and your HOA (if you live in a community with one). </p><p>However, the rule of thumb is if it's jointly owned, you both share responsibility for the fence. “The actual rule is outlined in <a href="https://codes.findlaw.com/ca/civil-code/civ-sect-841/" target="_blank">California's Good Neighbor Fence Law (Civil Code § 841)</a>,” states Edward Susolik, CEO & President of <a href="http://www.callahan-law.com" target="_blank">Callahan & Blaine, PC</a>.</p><p>“In short, if the fence is built on the property boundary line, then both neighbors benefit from the fence and are also required to share the responsibility and costs. But if the fence is only on one side of the property line, it actually belongs to the property owner.”</p><p>Although hanging string lights over a fence would seem minor, compared to <a href="https://www.tomsguide.com/home/gardening/is-it-ok-to-cut-my-neighbors-overhanging-bushes-i-asked-the-experts-to-find-out-if-im-within-my-rights">cutting neighbors’ overhanging trees</a>, homeowners could risk legal liability by attaching anything to a shared fence without their neighbor’s permission. </p><p>“In my experience, hanging some lights isn't the first issue when a dispute arises,” adds Susolik. “It's always when one neighbor assumes the fence is theirs to decorate when it legally isn't."</p><div><blockquote><p>“Should a neighbor attach lights or any other items to your fence, you have the right to demand removal.”</p><p>Edward Susolik, CEO of Callahan & Blaine</p></blockquote></div><p>“If your fence sits entirely within your side of the property line, neighbors cannot attach anything to it without your permission. Should a neighbor attach lights or any other items to your fence, you have the right to demand removal.”</p><p>In addition, consider which direction your bulbs will be facing — up or down? Experts advise pointing lightbulbs downwards so that it lights up only your space and do not spill up and glare over the adjoining fence. </p><p>What’s more, it’s suggested to use soft, clear lights (not colorful, flashing lights) to minimize any complaints. </p><p>Fortunately, not everything has to result in tricky legal battles. A friendly chat with the person next door is usually the best place to start.</p><h3 class="article-body__section" id="section-politely-ask-your-neighbor"><span>Politely ask your neighbor</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:2973px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="ryFbQVS6JVUccwFryKRsVS" name="shutterstock_2200812425" alt="Neighbors speaking over the garden fence" src="https://cdn.mos.cms.futurecdn.net/ryFbQVS6JVUccwFryKRsVS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2973" height="1672" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Neighbors speaking over garden fence </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Similar to the task of <a href="https://www.tomsguide.com/home/outdoors/i-asked-experts-if-i-can-paint-my-side-of-my-neighbors-fence-heres-what-they-say">painting shared fences</a> or even <a href="https://www.tomsguide.com/home/outdoors/can-i-have-a-fire-pit-in-my-backyard-i-asked-experts-for-the-laws-and-etiquette-you-should-know-about">using a fire pit</a>, it’s always courteous to speak with your neighbor beforehand. </p><p>“Since you both own the fence, and ergo have equal rights on it, they also have a say in what happens to the fence,” agrees Stacy Kemp Ferrari, Founder and Managing Partner at Kemp Law Group. </p><p>“Even if it's something as harmless as hanging a few lines of fairy lights, the safest (and courteous) thing to do is to let them know.”  </p><p>But what’s the best practice if you’re not on friendly or first-name terms with them? Experts recommend following a conversation with a written agreement to avoid any misunderstandings. </p><p>“Ensure all agreements with your neighbors are in writing,” advises Susolik.  “Often, it can take something as simple as a text message to clarify what exactly is being attached, when it's coming down, and that it won't cause permanent damage.</p><p>“Also be sure to check any HOA rules and local ordinances, as some impose restrictions that no private agreement between neighbors can override.”</p><p>Essentially, the key thing is good communication — even if you may think it’s just harmless string lights being hung. Ultimately, this could save you the bother of legal conflicts to navigate.  </p><p>If in doubt, however, simply ensure that when installing string lights, they stay on your side of the property line/fence (along with any hooks or mounting hardware).  </p><p>So if you want to avoid any neighborhood wars, be sure to keep these rules in mind.</p><p>Also, if you still want to maintain a level of privacy, check out these <a href="https://www.tomsguide.com/how-to/7-plants-to-create-more-privacy-in-your-backyard">7 plants will create more privacy in your backyard</a><a href="https://www.tomsguide.com/how-to/5-ways-to-maintain-your-wooden-fence">.</a> </p><div class="product"><a data-dimension112="ea132ade-ac6d-11f1-ad4b-07eb55e12ef0" data-action="Deal Block" data-label="Chromatic Outdoor String Lights" data-dimension48="Chromatic Outdoor String Lights" data-dimension25="$239" href="https://www.amazon.com/Govee-Outdoor-Chromatic-Waterproof-compatible/dp/B0FX2S38JR?th=1" 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:100.00%;"><img id="8sotpp3XMWfBMEiRNBZace" name="Chromatic Outdoor String Lights" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8sotpp3XMWfBMEiRNBZace-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Govee-Outdoor-Chromatic-Waterproof-compatible/dp/B0FX2S38JR?th=1" target="_blank" rel="nofollow" data-dimension112="ea132ade-ac6d-11f1-ad4b-07eb55e12ef0" data-action="Deal Block" data-label="Chromatic Outdoor String Lights" data-dimension48="Chromatic Outdoor String Lights" data-dimension25="$239">Chromatic Outdoor String Lights: was $299 now $239</a></strong><br>Instead of copying traditional bulbs, Govee’s new smart string lights use a unique dual-layer design to pack an entire rainbow of color into every single bulb. This 65.6-foot strand features 54 individual RGB LEDs per bulb, making them punchy and bright enough to completely cut through midday sun glare at an afternoon BBQ. <a class="view-deal button" href="https://www.amazon.com/Govee-Outdoor-Chromatic-Waterproof-compatible/dp/B0FX2S38JR?th=1" target="_blank" rel="nofollow" data-dimension112="ea132ade-ac6d-11f1-ad4b-07eb55e12ef0" data-action="Deal Block" data-label="Chromatic Outdoor String Lights" data-dimension48="Chromatic Outdoor String Lights" data-dimension25="$239">View Deal</a></p></div><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/how-to/5-rude-habits-your-neighbors-hate">5 rude habits your neighbors hate</a></li><li><a href="https://www.tomsguide.com/home/gardeners-urged-to-spray-patios-and-paths-with-vinegar-until-november-and-its-not-as-strange-as-it-sounds">Gardeners urged to spray patios and paths with vinegar until November — and it’s not as strange as it sounds</a></li><li><a href="https://www.tomsguide.com/how-to/7-plants-to-create-more-privacy-in-your-backyard">These 7 plants will create more privacy in your backyard </a></li></ul><div data-widget-type="review" data-model-name="Felco 6 Elite"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ All the new audio features on Apple Watch explained ]]></title>
                                                                                                <dc:content><![CDATA[ <p>One of the big revelations at yesterday's <a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news">Apple event</a> was the new Siri AI features, and in particular, what these features mean for the new <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12">Apple Watch Series 12</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4">Apple Watch Ultra 4</a>. The two new watches have built-in microphones and can now automatically detect music playing in the background and silently take notes on your conversations throughout the day to give you a recap. </p><p>Let's dive into all the new audio features coming to Apple Watch: </p><h3 class="article-body__section" id="section-sound-recognition"><span>Sound recognition </span></h3><p>Arguably the most helpful feature — especially for anyone hard of hearing or deaf — is the sound recognition feature. This allows your watch to detect important sounds like sirens, alarms, and doorbells and alert you, even if you don’t have your iPhone nearby. </p><h3 class="article-body__section" id="section-automatic-music-recognition"><span>Automatic music recognition </span></h3><p>If you’ve ever tried to Shazam a song and not been fast enough to catch it, this feature is for you. Music recognition automatically detects the song playing in the background and displays the name of the artist and the title in the Smart Stack. </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ksjEAsDzPnVz4PFiyS54Rj" name="Apple Watch Ultra 4" alt="Apple Watch Ultra 4" src="https://cdn.mos.cms.futurecdn.net/ksjEAsDzPnVz4PFiyS54Rj-1920-80.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: Future)</span></figcaption></figure><h3 class="article-body__section" id="section-live-rewind"><span>Live Rewind </span></h3><p>Live Rewind allows you to double click on the Digital Crown and receive a transcript of what was said in the last 15 seconds. It’s designed to allow you to catch something you missed in a conversation, or to save yourself from awkwardness when you immediately forget your colleague’s name. Once recalled, you can ask Siri for more information, or save it to the Siri app. </p><p>When you press the Digital Crown for this feature, a chime will sound, even if your watch is on silent or you’re wearing headphones. Apple says this is to alert those nearby that you are using the feature.</p><h3 class="article-body__section" id="section-siri-recap"><span>Siri Recap </span></h3><p>Finally, when turned on, Siri recap will take notes of your conversations throughout the day and create Apple Intelligence-generated summaries you can use later. Summaries auto-delete after seven days if you haven’t saved them and you can set Siri recap to only record in certain locations, like at work, or during particular times of the day. </p><p>If all of this sounds like something you’d rather not use, Apple have stressed that each Audio Intelligence feature is automatically disabled on the watch: you have to opt-in to the ones you want to use. </p><p>The company also stressed that any data collected using Live Rewind or Siri Recap will be encrypted — you won’t be able to see who said what, and it doesn’t store voice recordings. Siri Recaps will also omit potentially harmful content, such as language promoting self-harm or hateful speech, and sensitive information, such as financial data.</p><p>These features will be available later in the year, and we’ll be sure to test them and bring you our verdict.</p><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/we-asked-368-people-what-they-want-from-the-apple-watch-ultra-4-heres-the-resounding-answer-and-its-not-ai">We asked 368 people what they want from the Apple Watch Ultra 4. Here’s the resounding answer (and it’s not AI)</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12">Apple Watch Series 12 hands-on: A new heart rate sensor and a readiness score (at last)</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-is-official-all-the-upgrades-explained">Apple Watch Ultra 4 is official: All the upgrades explained</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/smartwatches/all-the-new-audio-features-on-apple-watch-explained</link>
                                                                            <description>
                            <![CDATA[ Here's everything you need to know about the new audio features coming to the Apple Watch ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">se5wrxwDWrpuo8PK5wuXz4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/W5QaBdWA6ZqoxGfUz3gDu4-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/W5QaBdWA6ZqoxGfUz3gDu4-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple Watch Series 12]]></media:description>                                                            <media:text><![CDATA[Apple Watch Series 12]]></media:text>
                                <media:title type="plain"><![CDATA[Apple Watch Series 12]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/W5QaBdWA6ZqoxGfUz3gDu4-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>One of the big revelations at yesterday's <a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news">Apple event</a> was the new Siri AI features, and in particular, what these features mean for the new <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12">Apple Watch Series 12</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4">Apple Watch Ultra 4</a>. The two new watches have built-in microphones and can now automatically detect music playing in the background and silently take notes on your conversations throughout the day to give you a recap. </p><p>Let's dive into all the new audio features coming to Apple Watch: </p><h3 class="article-body__section" id="section-sound-recognition"><span>Sound recognition </span></h3><p>Arguably the most helpful feature — especially for anyone hard of hearing or deaf — is the sound recognition feature. This allows your watch to detect important sounds like sirens, alarms, and doorbells and alert you, even if you don’t have your iPhone nearby. </p><h3 class="article-body__section" id="section-automatic-music-recognition"><span>Automatic music recognition </span></h3><p>If you’ve ever tried to Shazam a song and not been fast enough to catch it, this feature is for you. Music recognition automatically detects the song playing in the background and displays the name of the artist and the title in the Smart Stack. </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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ksjEAsDzPnVz4PFiyS54Rj" name="Apple Watch Ultra 4" alt="Apple Watch Ultra 4" src="https://cdn.mos.cms.futurecdn.net/ksjEAsDzPnVz4PFiyS54Rj-1920-80.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: Future)</span></figcaption></figure><h3 class="article-body__section" id="section-live-rewind"><span>Live Rewind </span></h3><p>Live Rewind allows you to double click on the Digital Crown and receive a transcript of what was said in the last 15 seconds. It’s designed to allow you to catch something you missed in a conversation, or to save yourself from awkwardness when you immediately forget your colleague’s name. Once recalled, you can ask Siri for more information, or save it to the Siri app. </p><p>When you press the Digital Crown for this feature, a chime will sound, even if your watch is on silent or you’re wearing headphones. Apple says this is to alert those nearby that you are using the feature.</p><h3 class="article-body__section" id="section-siri-recap"><span>Siri Recap </span></h3><p>Finally, when turned on, Siri recap will take notes of your conversations throughout the day and create Apple Intelligence-generated summaries you can use later. Summaries auto-delete after seven days if you haven’t saved them and you can set Siri recap to only record in certain locations, like at work, or during particular times of the day. </p><p>If all of this sounds like something you’d rather not use, Apple have stressed that each Audio Intelligence feature is automatically disabled on the watch: you have to opt-in to the ones you want to use. </p><p>The company also stressed that any data collected using Live Rewind or Siri Recap will be encrypted — you won’t be able to see who said what, and it doesn’t store voice recordings. Siri Recaps will also omit potentially harmful content, such as language promoting self-harm or hateful speech, and sensitive information, such as financial data.</p><p>These features will be available later in the year, and we’ll be sure to test them and bring you our verdict.</p><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/we-asked-368-people-what-they-want-from-the-apple-watch-ultra-4-heres-the-resounding-answer-and-its-not-ai">We asked 368 people what they want from the Apple Watch Ultra 4. Here’s the resounding answer (and it’s not AI)</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12">Apple Watch Series 12 hands-on: A new heart rate sensor and a readiness score (at last)</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-is-official-all-the-upgrades-explained">Apple Watch Ultra 4 is official: All the upgrades explained</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ You don't need time or equipment — relieve tight hips in 60 seconds with this 3-move mobility routine ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I would encourage any of my clients to build a sustainable, consistent mobility routine into their weekly exercise program, but it doesn't always need to be 30 minutes or longer for the benefits to show. You can benefit from instant relief using this 60-second "hip release" reset, consisting of just three moves and a lot of love for stiff hips.</p><p>This is perfect for anyone who needs to stand up after hours spent at a desk or behind a laptop, and it can take as little as 60 seconds, or more if you have the time.</p><p>One of the <a href="https://www.tomsguide.com/best-picks/best-yoga-mats">best yoga mats</a> is recommended, and that's all. You could do it from anywhere, including joining me by finding some space while abroad, and below, I show you exactly how to follow, plus the benefits. </p><h2 id="watch-3-move-hip-mobility-release">Watch: 3-move hip mobility release</h2><p>Trying to <a href="https://www.tomsguide.com/wellness/workouts/use-this-10-minute-mobility-routine-to-boost-your-flexibility-and-improve-posture-no-equipment-needed">improve mobility and flexibility </a>and strengthen your body using your body weight will help you move better and with more freedom.</p><p>Later in life, you'll be thankful for strong bones, muscles and ligaments that help you maintain an active lifestyle, and a consistent, progressive routine will help you do just that.</p><p><em>If you experience pain at any time, stop and rest. If you're working with an injury or health condition, I recommend consulting your physician or a yoga instructor before starting these exercises.</em></p><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/DdDqlKSIuq4/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><ul><li><strong>"World's Greatest Stretch": </strong>Step your left leg into a low lunge with your back knee supported on the mat. Raise your left arm toward the ceiling and twist gently to open your chest, shoulder and hip, then drop your elbow toward your ankle. Bind your left arm under your left leg, with your hand just outside the left foot. Return to center, repeat for reps, then switch sides.<strong> Why? </strong>This move stretches your hips, opens your chest and shoulders and even gently mobilizes the spine.</li><li><strong>Downward dog to knee curl: </strong>Start in a downdog position with your butt lifted, heels drawn down toward the mat and shoulders pulled down away from your ears. Ripple forward into a high plank and curl one knee toward your chest. Pause, then return to downdog and switch legs. <strong>Why?</strong> Your hips work to help lift your leg, so strengthening them is vital if you enjoy walking and running. Knee curls also strengthen your core muscles, which are vital for protecting your spine and pelvis.</li><li><strong>Hip rolls: </strong>Start on your hands and knees with your shoulders stacked over your wrists. You can place a prop like a yoga block next to you, but you don't need one. Roll your hips by drawing your leg in circles around the block in both directions. Switch sides. <strong>Why? </strong>Hip rolls move your hips through rotation, building range of motion. Using a block is useful for testing your range. Try to keep your weight even between your left and right sides without leaning to one side to assist the movement. Working the left and right sides independently is also great for identifying and fixing any imbalances.</li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><p>Just 20 seconds of each of these moves is a great start, but spend longer on them if you want or need to. </p><p><strong>Unilateral work </strong>is great for working on both sides of your body without your stronger muscles taking over. I like to include unilateral movements during every session if I can.</p><p><strong>Rotational work </strong>is ideal if you want to increase overall range of motion, but remember to externally and internally rotate the hips, working in both directions to target the stabilizing muscles and joints properly.</p><p><strong>Knee lifts and core activation </strong>strengthen your hips, which is great if you sit for long periods. Weak, underused hips contribute heavily to back pain over time. Squeeze your glutes, pull your knee forward and slightly curl your spine by pressing through your hands to create space beneath your body. </p><p>For someone new to exercise, build up slowly and spend a few breaths on each move per side.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEq7ae"></div>                            </div>                            <script src="https://kwizly.com/embed/eEq7ae.js" async></script><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank"><strong>I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/workouts/according-to-a-personal-trainer-this-exercise-is-100-times-more-effective-than-crunches-i-tried-it-and-was-humbled" target="_blank"><strong>According to a personal trainer, this exercise is 100 times more effective than crunches. I tried it and was humbled</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-over-50-to-be-mobile-3-low-impact-moves-that-build-more-stability-than-a-30-minute-walk" target="_blank"><strong>I teach people over 50 to be mobile: 3 low-impact moves that build more stability than a 30-minute walk</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/workouts/you-dont-need-time-or-equipment-relieve-tight-hips-in-60-seconds-with-this-3-move-mobility-routine</link>
                                                                            <description>
                            <![CDATA[ This is a low-impact hip mobility routine to build strength and range of motion in your lower body. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">a8NixQpfcdZWH5dWB3V8N</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/W8oaBCbZrQaz53jGUjHfBW-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 06:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 11 Sep 2026 11:36:49 +0000</updated>
                                                                                                                                            <category><![CDATA[Workouts]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                <author><![CDATA[ sam.hopes@futurenet.com (Sam Hopes) ]]></author>                    <dc:creator><![CDATA[ Sam Hopes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jZ88qJqvjWaCXXv3qvUQPA-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Sam Hopes is a level 3 qualified trainer, a level 2 Reiki practitioner and a fitness editor at Tom&#039;s Guide. She is also currently undertaking her Yoga For Athletes training course. Sam has written for various fitness brands and websites over the years and has experience across brands at Future, such as &lt;a href=&quot;https://www.livescience.com/author/sam-hopes&quot;&gt;Live Science&lt;/a&gt;,&lt;a href=&quot;https://www.fitandwell.com/author/sam-hopes&quot;&gt; Fit&amp;amp;Well&lt;/a&gt;,&lt;a href=&quot;https://www.coachweb.com/author/sam-hopes&quot;&gt; Coach&lt;/a&gt;, and T3. &lt;/p&gt;&lt;p&gt;Having worked with fitness studios like F45 and Virgin Active and trained both group and 1:1, Sam now primarily teaches outdoor bootcamps, bodyweight, and kettlebells. She also coaches mobility and flexibility classes several times a week and believes that true strength comes from a holistic approach to training your body. &lt;/p&gt;&lt;p&gt;Sam has completed two mixed doubles Hyrox competitions in London and the Netherlands and finished her first doubles attempt in 1:11.&lt;/p&gt;&lt;p&gt;In her spare time, she enjoys CrossFit, hot yoga, Pilates and running and can be found perfecting her handstand walks and handstand push-ups in the gym whenever she has the chance to be upside down. At work, she can be found testing the latest in fitness technology and wearables, anything yoga and CrossFit-related and has a keen interest in nutrition, mindfulness, sleep and recovery.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/W8oaBCbZrQaz53jGUjHfBW-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a woman doing a hip mobility test]]></media:description>                                                            <media:text><![CDATA[a woman doing a hip mobility test]]></media:text>
                                <media:title type="plain"><![CDATA[a woman doing a hip mobility test]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/W8oaBCbZrQaz53jGUjHfBW-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I would encourage any of my clients to build a sustainable, consistent mobility routine into their weekly exercise program, but it doesn't always need to be 30 minutes or longer for the benefits to show. You can benefit from instant relief using this 60-second "hip release" reset, consisting of just three moves and a lot of love for stiff hips.</p><p>This is perfect for anyone who needs to stand up after hours spent at a desk or behind a laptop, and it can take as little as 60 seconds, or more if you have the time.</p><p>One of the <a href="https://www.tomsguide.com/best-picks/best-yoga-mats">best yoga mats</a> is recommended, and that's all. You could do it from anywhere, including joining me by finding some space while abroad, and below, I show you exactly how to follow, plus the benefits. </p><h2 id="watch-3-move-hip-mobility-release">Watch: 3-move hip mobility release</h2><p>Trying to <a href="https://www.tomsguide.com/wellness/workouts/use-this-10-minute-mobility-routine-to-boost-your-flexibility-and-improve-posture-no-equipment-needed">improve mobility and flexibility </a>and strengthen your body using your body weight will help you move better and with more freedom.</p><p>Later in life, you'll be thankful for strong bones, muscles and ligaments that help you maintain an active lifestyle, and a consistent, progressive routine will help you do just that.</p><p><em>If you experience pain at any time, stop and rest. If you're working with an injury or health condition, I recommend consulting your physician or a yoga instructor before starting these exercises.</em></p><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/DdDqlKSIuq4/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><ul><li><strong>"World's Greatest Stretch": </strong>Step your left leg into a low lunge with your back knee supported on the mat. Raise your left arm toward the ceiling and twist gently to open your chest, shoulder and hip, then drop your elbow toward your ankle. Bind your left arm under your left leg, with your hand just outside the left foot. Return to center, repeat for reps, then switch sides.<strong> Why? </strong>This move stretches your hips, opens your chest and shoulders and even gently mobilizes the spine.</li><li><strong>Downward dog to knee curl: </strong>Start in a downdog position with your butt lifted, heels drawn down toward the mat and shoulders pulled down away from your ears. Ripple forward into a high plank and curl one knee toward your chest. Pause, then return to downdog and switch legs. <strong>Why?</strong> Your hips work to help lift your leg, so strengthening them is vital if you enjoy walking and running. Knee curls also strengthen your core muscles, which are vital for protecting your spine and pelvis.</li><li><strong>Hip rolls: </strong>Start on your hands and knees with your shoulders stacked over your wrists. You can place a prop like a yoga block next to you, but you don't need one. Roll your hips by drawing your leg in circles around the block in both directions. Switch sides. <strong>Why? </strong>Hip rolls move your hips through rotation, building range of motion. Using a block is useful for testing your range. Try to keep your weight even between your left and right sides without leaning to one side to assist the movement. Working the left and right sides independently is also great for identifying and fixing any imbalances.</li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><p>Just 20 seconds of each of these moves is a great start, but spend longer on them if you want or need to. </p><p><strong>Unilateral work </strong>is great for working on both sides of your body without your stronger muscles taking over. I like to include unilateral movements during every session if I can.</p><p><strong>Rotational work </strong>is ideal if you want to increase overall range of motion, but remember to externally and internally rotate the hips, working in both directions to target the stabilizing muscles and joints properly.</p><p><strong>Knee lifts and core activation </strong>strengthen your hips, which is great if you sit for long periods. Weak, underused hips contribute heavily to back pain over time. Squeeze your glutes, pull your knee forward and slightly curl your spine by pressing through your hands to create space beneath your body. </p><p>For someone new to exercise, build up slowly and spend a few breaths on each move per side.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEq7ae"></div>                            </div>                            <script src="https://kwizly.com/embed/eEq7ae.js" async></script><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank"><strong>I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/workouts/according-to-a-personal-trainer-this-exercise-is-100-times-more-effective-than-crunches-i-tried-it-and-was-humbled" target="_blank"><strong>According to a personal trainer, this exercise is 100 times more effective than crunches. I tried it and was humbled</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/wellness/workouts/i-teach-people-over-50-to-be-mobile-3-low-impact-moves-that-build-more-stability-than-a-30-minute-walk" target="_blank"><strong>I teach people over 50 to be mobile: 3 low-impact moves that build more stability than a 30-minute walk</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I stopped reading the fine print myself after discovering this overlooked ChatGPT trick ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I have a confession: when it comes to long, technical documents like manuals or white papers, I'm probably not reading every word. Don't get me wrong, I do care about the information in the documents and really need to know about my insurance policies and subscription terms, but I simply don't have the time to bury myself in hours of reading. <br><br>It's no secret that <a href="https://www.tomsguide.com/ai/i-tried-the-best-chatgpt-productivity-apps-these-5-are-actually-worth-your-time">ChatGPT can summarize long documents</a>, but recently I started using it differently. Instead of asking the chatbot to tell me what a document says, I ask it to extract the same information from multiple documents first — and only then compare them.<br><br>This is a small change but it makes ChatGPT infinitely more helpful for getting down to the fine print. I've been doing it recently and and there's one extra instruction I now add that makes the results much easier to trust.</p><h2 id="don-39-t-ask-chatgpt-which-option-is-better">Don't ask ChatGPT which option is better </h2><p>My first instinct used to be uploading two documents and asking something like:</p><p><em>"Which of these is better?"</em></p><p>That's easy, but it's also giving ChatGPT far too much freedom. "Better" could mean cheaper, more comprehensive, more flexible or whatever the model decides matters most. Now, I make chatGPT do the boring work for me. </p><p><strong>I upload both PDFs and use this prompt: </strong><em>Read both documents independently before comparing them.</em></p><p><em>For each document, extract the total cost, deductibles or additional charges, coverage or services included, exclusions, cancellation terms, renewal terms and any conditions that could significantly increase what I pay.</em></p><p><em>Cite the page number for every detail you extract. If something isn't explicitly stated in the document, write "Not found" rather than inferring or guessing.</em></p><p><em>Once you've completed the extraction, create a side-by-side comparison table showing the differences between the two documents.</em></p><p><em>Finally, identify five differences or unclear terms I should investigate before making a decision. Do not tell me which option to choose.</em></p><h2 id="the-overlooked-trick-is-39-extract-first-compare-second-39">The overlooked trick is 'extract first, compare second'</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3LCbYduv8L2Ntai279oBjP" name="fine print" alt="fine print" src="https://cdn.mos.cms.futurecdn.net/3LCbYduv8L2Ntai279oBjP-1920-80.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: Getty Images/Anastassia Anufrieva)</span></figcaption></figure><p>With my prompt, I'm not asking ChatGPT to make the decision for me. <strong>I'm asking it to make the information easier for me to evaluate.</strong></p><p>When you ask ChatGPT to summarize two long documents and compare them simultaneously, you're essentially asking it to decide what's important as it goes.</p><p>Instead, this prompt breaks the job into stages. First, ChatGPT has to examine each document separately and pull out the same categories of information. Only after that's finished does it compare those results.</p><p>Suddenly, instead of bouncing between two PDFs looking for whether one policy has a different deductible or one subscription has an early cancellation fee, I'm staring at two columns.</p><p>And differences are much harder to miss.</p><p><strong>I added one more rule:</strong> <em>show me where you found it by citing the page number for every detail. </em></p><p>I've learned the hard way that<a href="https://www.tomsguide.com/ai/chatgpt-congratulated-me-for-being-pregnant-it-was-dead-wrong"> ChatGPT can make mistakes</a>. It can misinterpret a clause, overlook something buried in a table or occasionally sound confident about information that isn't actually there. Page references give me a shortcut for checking its work.</p><p>If ChatGPT tells me Option A has a $500 deductible while Option B has a $1,000 deductible, I don't have to trust it blindly or reread 60 pages. I can jump directly to the pages it cites and verify those two numbers myself.</p><p>I'd much rather have ChatGPT tell me it couldn't locate a cancellation policy than confidently fill in the blank.</p><h2 id="real-world-use-cases-for-this-prompt">Real-world use cases for this prompt</h2><p>I typically use this prompt for very technical things like changing wireless providers or insurance companies, but once I started thinking about the technique as structured comparison rather than summarization, I realized how many annoying decisions fit the same pattern.</p><p>You could use this hack for apartment leases to compare deposits, fees, renewal clauses and restrictions. Streaming plans to break down monthly cost, <a href="https://www.tomsguide.com/ai/your-ai-subscription-is-about-to-look-very-different-heres-what-to-expect-in-the-next-year">AI subscription plans</a>, or even travel packages to check for what's included, refund policies and restrictions.</p><p>You can even modify the categories in the prompt depending on what you're comparing.</p><p>The important part stays the same: <strong>extract > cite > compare > flag what's missing.</strong></p><h2 id="bottom-line-3">Bottom line </h2><p>I'm not going back to reading 60 pages side by side. There are documents I would never trust an AI to interpret without checking the original, particularly when money, legal obligations or insurance coverage are involved.</p><p>But that's also why I like this approach because I'm really not asking ChatGPT to replace my human judgement. I'm using it to point me toward the handful of pages where my judgment is actually needed.</p><p>Instead of reading two 30-page documents line by line and hoping I notice every meaningful difference, I can start with a structured comparison, investigate anything unusual and verify the details that could affect my decision.</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/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family">AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</a></li><li><a href="https://www.tomsguide.com/ai/meta-just-launched-an-ai-that-can-actually-run-your-life-online-heres-what-muse-can-do">Meta just launched an AI that can actually run your life online — here's what Muse can do</a></li><li><a href="https://www.tomsguide.com/ai/gemini-just-got-a-floating-bubble-multitasking-upgrade-thats-a-game-changer-on-android-phones-heres-how-to-use-it">Gemini just got a 'floating bubble' multitasking upgrade that's a game changer on Android phones — here's how to use it</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/chatgpt/i-stopped-reading-the-fine-print-myself-after-discovering-this-overlooked-chatgpt-trick</link>
                                                                            <description>
                            <![CDATA[ I stopped reading pages of fine print myself. This simple ChatGPT trick compares long documents, finds key differences and shows you exactly where to look. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kkkVbxowZZaTg4NXQuXxHb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/WXKXgL7Rg8Qxd5Ut4zP7Y4-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 05:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 11 Sep 2026 08:32:15 +0000</updated>
                                                                                                                                            <category><![CDATA[ChatGPT]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/WXKXgL7Rg8Qxd5Ut4zP7Y4-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images/Vitaly Gariev]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[reading fine print]]></media:description>                                                            <media:text><![CDATA[reading fine print]]></media:text>
                                <media:title type="plain"><![CDATA[reading fine print]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/WXKXgL7Rg8Qxd5Ut4zP7Y4-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I have a confession: when it comes to long, technical documents like manuals or white papers, I'm probably not reading every word. Don't get me wrong, I do care about the information in the documents and really need to know about my insurance policies and subscription terms, but I simply don't have the time to bury myself in hours of reading. <br><br>It's no secret that <a href="https://www.tomsguide.com/ai/i-tried-the-best-chatgpt-productivity-apps-these-5-are-actually-worth-your-time">ChatGPT can summarize long documents</a>, but recently I started using it differently. Instead of asking the chatbot to tell me what a document says, I ask it to extract the same information from multiple documents first — and only then compare them.<br><br>This is a small change but it makes ChatGPT infinitely more helpful for getting down to the fine print. I've been doing it recently and and there's one extra instruction I now add that makes the results much easier to trust.</p><h2 id="don-39-t-ask-chatgpt-which-option-is-better">Don't ask ChatGPT which option is better </h2><p>My first instinct used to be uploading two documents and asking something like:</p><p><em>"Which of these is better?"</em></p><p>That's easy, but it's also giving ChatGPT far too much freedom. "Better" could mean cheaper, more comprehensive, more flexible or whatever the model decides matters most. Now, I make chatGPT do the boring work for me. </p><p><strong>I upload both PDFs and use this prompt: </strong><em>Read both documents independently before comparing them.</em></p><p><em>For each document, extract the total cost, deductibles or additional charges, coverage or services included, exclusions, cancellation terms, renewal terms and any conditions that could significantly increase what I pay.</em></p><p><em>Cite the page number for every detail you extract. If something isn't explicitly stated in the document, write "Not found" rather than inferring or guessing.</em></p><p><em>Once you've completed the extraction, create a side-by-side comparison table showing the differences between the two documents.</em></p><p><em>Finally, identify five differences or unclear terms I should investigate before making a decision. Do not tell me which option to choose.</em></p><h2 id="the-overlooked-trick-is-39-extract-first-compare-second-39">The overlooked trick is 'extract first, compare second'</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3LCbYduv8L2Ntai279oBjP" name="fine print" alt="fine print" src="https://cdn.mos.cms.futurecdn.net/3LCbYduv8L2Ntai279oBjP-1920-80.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: Getty Images/Anastassia Anufrieva)</span></figcaption></figure><p>With my prompt, I'm not asking ChatGPT to make the decision for me. <strong>I'm asking it to make the information easier for me to evaluate.</strong></p><p>When you ask ChatGPT to summarize two long documents and compare them simultaneously, you're essentially asking it to decide what's important as it goes.</p><p>Instead, this prompt breaks the job into stages. First, ChatGPT has to examine each document separately and pull out the same categories of information. Only after that's finished does it compare those results.</p><p>Suddenly, instead of bouncing between two PDFs looking for whether one policy has a different deductible or one subscription has an early cancellation fee, I'm staring at two columns.</p><p>And differences are much harder to miss.</p><p><strong>I added one more rule:</strong> <em>show me where you found it by citing the page number for every detail. </em></p><p>I've learned the hard way that<a href="https://www.tomsguide.com/ai/chatgpt-congratulated-me-for-being-pregnant-it-was-dead-wrong"> ChatGPT can make mistakes</a>. It can misinterpret a clause, overlook something buried in a table or occasionally sound confident about information that isn't actually there. Page references give me a shortcut for checking its work.</p><p>If ChatGPT tells me Option A has a $500 deductible while Option B has a $1,000 deductible, I don't have to trust it blindly or reread 60 pages. I can jump directly to the pages it cites and verify those two numbers myself.</p><p>I'd much rather have ChatGPT tell me it couldn't locate a cancellation policy than confidently fill in the blank.</p><h2 id="real-world-use-cases-for-this-prompt">Real-world use cases for this prompt</h2><p>I typically use this prompt for very technical things like changing wireless providers or insurance companies, but once I started thinking about the technique as structured comparison rather than summarization, I realized how many annoying decisions fit the same pattern.</p><p>You could use this hack for apartment leases to compare deposits, fees, renewal clauses and restrictions. Streaming plans to break down monthly cost, <a href="https://www.tomsguide.com/ai/your-ai-subscription-is-about-to-look-very-different-heres-what-to-expect-in-the-next-year">AI subscription plans</a>, or even travel packages to check for what's included, refund policies and restrictions.</p><p>You can even modify the categories in the prompt depending on what you're comparing.</p><p>The important part stays the same: <strong>extract > cite > compare > flag what's missing.</strong></p><h2 id="bottom-line-3">Bottom line </h2><p>I'm not going back to reading 60 pages side by side. There are documents I would never trust an AI to interpret without checking the original, particularly when money, legal obligations or insurance coverage are involved.</p><p>But that's also why I like this approach because I'm really not asking ChatGPT to replace my human judgement. I'm using it to point me toward the handful of pages where my judgment is actually needed.</p><p>Instead of reading two 30-page documents line by line and hoping I notice every meaningful difference, I can start with a structured comparison, investigate anything unusual and verify the details that could affect my decision.</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/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family">AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</a></li><li><a href="https://www.tomsguide.com/ai/meta-just-launched-an-ai-that-can-actually-run-your-life-online-heres-what-muse-can-do">Meta just launched an AI that can actually run your life online — here's what Muse can do</a></li><li><a href="https://www.tomsguide.com/ai/gemini-just-got-a-floating-bubble-multitasking-upgrade-thats-a-game-changer-on-android-phones-heres-how-to-use-it">Gemini just got a 'floating bubble' multitasking upgrade that's a game changer on Android phones — here's how to use it</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple's $1,999 gamble — analysts react to the new iPhone Duo foldable ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There’s no doubt about who the star of <a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news">Apple’s September 9 launch event</a> turned out to be. With new <a href="https://www.tomsguide.com/computing/macbooks/i-interviewed-john-ternus-right-before-he-was-named-apple-ceo-heres-the-5-quotes-that-stand-out-to-me">CEO John Ternus</a> reviving the company’s trademark “One More Thing…” announcement to show off the new <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-is-official-price-release-date-specs-and-everything-you-need-to-know">iPhone Duo</a>, analysts are agreed that Apple’s first attempt at a foldable phone is definitely one to watch.</p><p>Ben Wood, chief analyst at CCS Insight, said the Duo brings “a distinctive new design to the iPhone lineup.” In a research note released after the Apple event, IDC senior research director Nabila Popal said she was “almost certain [the Duo] will convert even the biggest critics of foldables.” And Michael Gartenberg, an analyst and former Apple marketing director, noted the foldable phone’s October release will open up a new opportunity for the company.</p><p>Arriving in stores October 23, the iPhone Duo is a passport-sized device that unfolds to reveal a 7.6-inch main display. Unlike some of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> already on the market, the Duo offers a wider layout and Apple Pencil support to go with the kind of features — a powerful A20 Pro system-on-chip and <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a> software support — that you’d expect from one of Apple’s phones. It also happens to be most significant addition to the iPhone lineup since the <a href="https://www.tomsguide.com/us/iphone-x,review-4800.html">iPhone X</a> introduced a new look to Apple’s offerings back in 2017.</p><div><blockquote><p>Despite being late to market compared to Samsung and Google, Apple has delivered a solid first generation of foldables.</p><p>Michael Gartenberg</p></blockquote></div><p>“While the new [iPhone 18] Pro devices are mostly incremental, the iPhone Duo takes Apple into new territory,” Gartenberg said. “Despite being late to market compared to Samsung and Google, Apple has delivered a solid first generation of foldables.”</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/2qNfOa5AuVU" allowfullscreen></iframe></div></div><h2 id="iphone-duo-what-impressed-analysts">iPhone Duo: What impressed analysts</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="K4dYCSX4YtJxxvZCenRip9" name="iphone duo display" alt="iPhone Duo hands on display" src="https://cdn.mos.cms.futurecdn.net/K4dYCSX4YtJxxvZCenRip9-1920-80.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>While the iPhone Duo has only appeared in an Apple keynote and, briefly, in a hands-on area following its debut, the phone has made a strong first impression with people who’ve seen it. And there are several aspects surrounding the Duo that are winning early raves.</p><p>Start with the screen, which Tom’s Guide Global Editor in Chief Mark Spoonauer described as “breathtaking” in his <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo hands-on</a>. Netflix — which has been optimized for the Duo’s design — takes up the whole screen when you’re streaming movies. And Apple has managed to minimize the crease that can appear on folding displays to the point where you don’t even notice it.</p><p>“The iPhone Duo has clearly benefited from major advances in the quality and reliability of flexible displays,” said Wood, who notes that Apple, like Samsung with its <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> foldable, use a titanium plate beneath the display. But Wood notes there’s a key difference in the case of the Duo.</p><p>“A differentiator is the nano-texture finish on the display, previously featured on the MacBook Pro and Studio Display,” he added. “This will improve readability, particularly in bright light, and give the touch screen a smooth finish for finger gestures.”</p><p>Durability is always a concern among shoppers when it comes to foldable phones, even more so than it is with more conventional handsets. With foldables, you have two screens to worry about, not just one, and there’s also the hinge that handles opening and closing the device to keep in mind.</p><p>To that end, Apple is using grade 5 titanium for the iPhone Duo’s frame while Ceramic Shield 2 protects the front of the phone. (The back of the Duo uses an earlier version of Ceramic Shield.) IDC’s Popal calls the Duo “a solid device that looks and feels premium,” while noting that Apple’s foldable offers an IP68 rating for water and dust resistance. In contrast, the Galaxy Z Fold 8 can withstand a plunge into water, but it isn’t dust resistant like Apple’s foldable.</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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.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>Software also looks to be a big selling point for the iPhone Duo, highlighted by Apple redesigning its apps to take advantage of the foldable design. App controls and the dock on the home screen now live on the side of the display for easier access. In addition to Netflix, Zoom and Slack have been optimized for the Duo, with Wood expecting other app makers to follow suit after the phone launches in October.</p><p>“Unsurprisingly, the software on the iPhone Duo looks familiar and intuitive, with gesture-based navigation that makes it easy to do things like placing apps side by side,” Wood said. “Subtle features such as a screen transition as you flip the device open look very Apple-esque.”</p><h2 id="iphone-duo-price-is-a-concern">iPhone Duo: Price is a concern</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:2144px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4QQN7JtKkmsE7V6tNMwe2M" name="Apple iPhone Duo hands on-2" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/4QQN7JtKkmsE7V6tNMwe2M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2144" height="1206" 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>Still, a few things stand between the iPhone Duo and world domination, and the biggest one happens to be the cost of the phone. With a starting price of $1,999, this is the most expensive iPhone Apple sells — that’s even $300 more than what you’d pay for a <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">13-inch iPad Pro</a> with cellular connectivity.</p><p>“The price point will obviously keep things out of reach for some, but that's what financing and carrier incentives are for,” said Avi Greengart, president of Techsponential.</p><div><blockquote><p>The price point will obviously keep things out of reach for some, but that's what financing and carrier incentives are for</p><p>Avi Greengart</p></blockquote></div><p>Michael Gartenberg agreed: “Pricing is expensive, but very much in line with other vendors. A good deal will depend on carriers offering significant subsidies or how many users will pay $2,000-plus on a device over time with Apple's new installment plan.”</p><p>Ahead of iPhone Duo preorders starting on October 16, Apple lets you pay off the phone in 24 monthly installments of $83.29. Leasing the Duo through the Apple Upgrade program lowers the monthly payment to $57.99 (though you wouldn’t own the phone at the end of your lease agreement unless you paid the remaining balance). Those prices are before device trade-ins which figure to lower the size of the monthly payment even further.</p><h2 id="iphone-duo-taking-on-the-galaxy-z-fold-8">iPhone Duo: Taking on the Galaxy Z Fold 8</h2><p>Any iPhone Duo analysis is going to invite comparisons to the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> — and to a lesser extent the more expensive <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a> — that Samsung released earlier this year. “Samsung has a price advantage, but not enough of one that it's likely to be a major factor,” Greengart said.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Apple iPhone Duo</strong></p></td><td  ><p><strong>Samsung Galaxy Z Fold 8</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$1,999</p></td><td  ><p>$1,899</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>7.6 inches</p></td><td  ><p>7.6 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Outer display</strong></p></td><td  ><p>5.4 inches</p></td><td  ><p>5.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>12GB</p></td><td  ><p>12GB, 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>256GB, 512GB, 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>48MP wide 48MP ultrawide</p></td><td  ><p>50MP wide, 50MP ultrawide</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Cameras</strong></p></td><td  ><p>24MP (main), 24MP (cover)</p></td><td  ><p>10MP (main), 10MP (cover)</p></td></tr><tr><td class="firstcol " ><p><strong>Size (opened)</strong></p></td><td  ><p>164.6 x 117.8 x 5.2mm (6.5 x 4.6 x 0.21 inches)</p></td><td  ><p>161.4 x 123.9 x 4.5 mm (6.4 x 4.9 x 0.18 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Size (closed)</strong></p></td><td  ><p>84.1 x 117.8 x 11.3mm (3.3 x 4.7 x 0.44 inches)</p></td><td  ><p>123.9 x 81.9 x 9.7 mm (4.88 × 3.22 × 0.38 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>254 grams (8.95 ounces)</p></td><td  ><p>201 grams (7.09 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>Software</strong></p></td><td  ><p>iOS 27</p></td><td  ><p>Android 17 (One UI 9)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Night Sky, Star White</p></td><td  ><p>Lavender, Graphite, Cream, Pistachio (online)</p></td></tr></tbody></table></div><p>Samsung has been at this a while, having released the first Fold back in 2019. That’s given Samsung a head start in not only building a market for foldable devices, but also fine-tuning its own product. The new Fold 8, for example, offers a more pocketable design than past offerings with improved battery life and a less noticeable crease than before.</p><p>In fact, at 9.7mm when closed and 205 grams, the Galaxy Z Fold 8 is thinner and lighter than the iPhone Duo, which measures at 11.3mm and weighs 254 grams. Samsung’s phone also offers a RAM upgrade, face unlocking and a <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">desktop mode that lets you plug the Fold into a monitor and use it as a PC</a>. And as Greengart notes, the Galaxy Z Fold has an  $1,899 starting price compared to the iPhone Duo’s $1,999 cost.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2EK0e"></div>                            </div>                            <script src="https://kwizly.com/embed/W2EK0e.js" async></script><p>But Apple’s phone has a few advantages of its own, like the IP rating and Apple Pencil support. Other metric comparisons, like performance and battery life will have to wait until we get a chance to test Apple’s phone.</p><p>“Watching the keynote, it was easy to forget that surrounding these new products is the introduction of iOS 27,” Wood of CCS Insight said. “It's an important update, delivering major performance improvements and introducing the latest version of Apple Intelligence and Siri AI. These seem like a big step up from Apple’s earlier AI efforts, and based on my experience with the beta release, they're performing well.”</p><h2 id="iphone-duo-outlook">iPhone Duo outlook</h2><p>Foldable phones remains a small segment of the overall mobile market, though it’s growing — CCS Insight says that 25 million foldables sold in 2025, up 18% from the previous year. Wood anticipates growth this year and next, despite rising prices for memory and phone components. And the iPhone Duo’s arrival figures to be a big reason why.</p><p>“iPhone Duo is for anyone who has wanted a foldable but has not been willing to leave the iOS ecosystem, plus anyone who just wants a modern smartphone that opens up into a widescreen for watching content or multitasking,” Greengart said.</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/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"><strong>iPhone Duo hands-on: Apple nailed it — and just put everyone else on notice</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news"><strong>Apple Event recap — Hands-on with the iPhone Duo and all the big announcements</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/apples-just-extended-free-access-to-emergency-satellite-communication-for-another-year-its-the-third-time-this-has-happened"><strong>Apple's just extended free access to emergency satellite communication for another year — it's the third time this has happened</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/apples-usd1-999-gamble-analysts-react-to-the-new-iphone-duo-foldable</link>
                                                                            <description>
                            <![CDATA[ Analysts broadly praise the iPhone Duo for its refined hardware, crease-free display, and deep software integration, but there's also concern. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nXhksdQEmQkjPqMV3ckaFf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Mdj8kozN6J8WNXPhazFQFa-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 04:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 11 Sep 2026 13:03:11 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Philip Michaels ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LBUqkHQCeeRgqR9Mz69X75-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Mdj8kozN6J8WNXPhazFQFa-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Duo]]></media:description>                                                            <media:text><![CDATA[iPhone Duo]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Duo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Mdj8kozN6J8WNXPhazFQFa-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s no doubt about who the star of <a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news">Apple’s September 9 launch event</a> turned out to be. With new <a href="https://www.tomsguide.com/computing/macbooks/i-interviewed-john-ternus-right-before-he-was-named-apple-ceo-heres-the-5-quotes-that-stand-out-to-me">CEO John Ternus</a> reviving the company’s trademark “One More Thing…” announcement to show off the new <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-is-official-price-release-date-specs-and-everything-you-need-to-know">iPhone Duo</a>, analysts are agreed that Apple’s first attempt at a foldable phone is definitely one to watch.</p><p>Ben Wood, chief analyst at CCS Insight, said the Duo brings “a distinctive new design to the iPhone lineup.” In a research note released after the Apple event, IDC senior research director Nabila Popal said she was “almost certain [the Duo] will convert even the biggest critics of foldables.” And Michael Gartenberg, an analyst and former Apple marketing director, noted the foldable phone’s October release will open up a new opportunity for the company.</p><p>Arriving in stores October 23, the iPhone Duo is a passport-sized device that unfolds to reveal a 7.6-inch main display. Unlike some of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> already on the market, the Duo offers a wider layout and Apple Pencil support to go with the kind of features — a powerful A20 Pro system-on-chip and <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a> software support — that you’d expect from one of Apple’s phones. It also happens to be most significant addition to the iPhone lineup since the <a href="https://www.tomsguide.com/us/iphone-x,review-4800.html">iPhone X</a> introduced a new look to Apple’s offerings back in 2017.</p><div><blockquote><p>Despite being late to market compared to Samsung and Google, Apple has delivered a solid first generation of foldables.</p><p>Michael Gartenberg</p></blockquote></div><p>“While the new [iPhone 18] Pro devices are mostly incremental, the iPhone Duo takes Apple into new territory,” Gartenberg said. “Despite being late to market compared to Samsung and Google, Apple has delivered a solid first generation of foldables.”</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/2qNfOa5AuVU" allowfullscreen></iframe></div></div><h2 id="iphone-duo-what-impressed-analysts">iPhone Duo: What impressed analysts</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="K4dYCSX4YtJxxvZCenRip9" name="iphone duo display" alt="iPhone Duo hands on display" src="https://cdn.mos.cms.futurecdn.net/K4dYCSX4YtJxxvZCenRip9-1920-80.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>While the iPhone Duo has only appeared in an Apple keynote and, briefly, in a hands-on area following its debut, the phone has made a strong first impression with people who’ve seen it. And there are several aspects surrounding the Duo that are winning early raves.</p><p>Start with the screen, which Tom’s Guide Global Editor in Chief Mark Spoonauer described as “breathtaking” in his <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo hands-on</a>. Netflix — which has been optimized for the Duo’s design — takes up the whole screen when you’re streaming movies. And Apple has managed to minimize the crease that can appear on folding displays to the point where you don’t even notice it.</p><p>“The iPhone Duo has clearly benefited from major advances in the quality and reliability of flexible displays,” said Wood, who notes that Apple, like Samsung with its <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> foldable, use a titanium plate beneath the display. But Wood notes there’s a key difference in the case of the Duo.</p><p>“A differentiator is the nano-texture finish on the display, previously featured on the MacBook Pro and Studio Display,” he added. “This will improve readability, particularly in bright light, and give the touch screen a smooth finish for finger gestures.”</p><p>Durability is always a concern among shoppers when it comes to foldable phones, even more so than it is with more conventional handsets. With foldables, you have two screens to worry about, not just one, and there’s also the hinge that handles opening and closing the device to keep in mind.</p><p>To that end, Apple is using grade 5 titanium for the iPhone Duo’s frame while Ceramic Shield 2 protects the front of the phone. (The back of the Duo uses an earlier version of Ceramic Shield.) IDC’s Popal calls the Duo “a solid device that looks and feels premium,” while noting that Apple’s foldable offers an IP68 rating for water and dust resistance. In contrast, the Galaxy Z Fold 8 can withstand a plunge into water, but it isn’t dust resistant like Apple’s foldable.</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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.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>Software also looks to be a big selling point for the iPhone Duo, highlighted by Apple redesigning its apps to take advantage of the foldable design. App controls and the dock on the home screen now live on the side of the display for easier access. In addition to Netflix, Zoom and Slack have been optimized for the Duo, with Wood expecting other app makers to follow suit after the phone launches in October.</p><p>“Unsurprisingly, the software on the iPhone Duo looks familiar and intuitive, with gesture-based navigation that makes it easy to do things like placing apps side by side,” Wood said. “Subtle features such as a screen transition as you flip the device open look very Apple-esque.”</p><h2 id="iphone-duo-price-is-a-concern">iPhone Duo: Price is a concern</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:2144px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4QQN7JtKkmsE7V6tNMwe2M" name="Apple iPhone Duo hands on-2" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/4QQN7JtKkmsE7V6tNMwe2M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2144" height="1206" 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>Still, a few things stand between the iPhone Duo and world domination, and the biggest one happens to be the cost of the phone. With a starting price of $1,999, this is the most expensive iPhone Apple sells — that’s even $300 more than what you’d pay for a <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">13-inch iPad Pro</a> with cellular connectivity.</p><p>“The price point will obviously keep things out of reach for some, but that's what financing and carrier incentives are for,” said Avi Greengart, president of Techsponential.</p><div><blockquote><p>The price point will obviously keep things out of reach for some, but that's what financing and carrier incentives are for</p><p>Avi Greengart</p></blockquote></div><p>Michael Gartenberg agreed: “Pricing is expensive, but very much in line with other vendors. A good deal will depend on carriers offering significant subsidies or how many users will pay $2,000-plus on a device over time with Apple's new installment plan.”</p><p>Ahead of iPhone Duo preorders starting on October 16, Apple lets you pay off the phone in 24 monthly installments of $83.29. Leasing the Duo through the Apple Upgrade program lowers the monthly payment to $57.99 (though you wouldn’t own the phone at the end of your lease agreement unless you paid the remaining balance). Those prices are before device trade-ins which figure to lower the size of the monthly payment even further.</p><h2 id="iphone-duo-taking-on-the-galaxy-z-fold-8">iPhone Duo: Taking on the Galaxy Z Fold 8</h2><p>Any iPhone Duo analysis is going to invite comparisons to the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> — and to a lesser extent the more expensive <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a> — that Samsung released earlier this year. “Samsung has a price advantage, but not enough of one that it's likely to be a major factor,” Greengart said.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Apple iPhone Duo</strong></p></td><td  ><p><strong>Samsung Galaxy Z Fold 8</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$1,999</p></td><td  ><p>$1,899</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>7.6 inches</p></td><td  ><p>7.6 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Outer display</strong></p></td><td  ><p>5.4 inches</p></td><td  ><p>5.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>12GB</p></td><td  ><p>12GB, 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB, 2TB</p></td><td  ><p>256GB, 512GB, 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>48MP wide 48MP ultrawide</p></td><td  ><p>50MP wide, 50MP ultrawide</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Cameras</strong></p></td><td  ><p>24MP (main), 24MP (cover)</p></td><td  ><p>10MP (main), 10MP (cover)</p></td></tr><tr><td class="firstcol " ><p><strong>Size (opened)</strong></p></td><td  ><p>164.6 x 117.8 x 5.2mm (6.5 x 4.6 x 0.21 inches)</p></td><td  ><p>161.4 x 123.9 x 4.5 mm (6.4 x 4.9 x 0.18 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Size (closed)</strong></p></td><td  ><p>84.1 x 117.8 x 11.3mm (3.3 x 4.7 x 0.44 inches)</p></td><td  ><p>123.9 x 81.9 x 9.7 mm (4.88 × 3.22 × 0.38 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>254 grams (8.95 ounces)</p></td><td  ><p>201 grams (7.09 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>Software</strong></p></td><td  ><p>iOS 27</p></td><td  ><p>Android 17 (One UI 9)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Night Sky, Star White</p></td><td  ><p>Lavender, Graphite, Cream, Pistachio (online)</p></td></tr></tbody></table></div><p>Samsung has been at this a while, having released the first Fold back in 2019. That’s given Samsung a head start in not only building a market for foldable devices, but also fine-tuning its own product. The new Fold 8, for example, offers a more pocketable design than past offerings with improved battery life and a less noticeable crease than before.</p><p>In fact, at 9.7mm when closed and 205 grams, the Galaxy Z Fold 8 is thinner and lighter than the iPhone Duo, which measures at 11.3mm and weighs 254 grams. Samsung’s phone also offers a RAM upgrade, face unlocking and a <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">desktop mode that lets you plug the Fold into a monitor and use it as a PC</a>. And as Greengart notes, the Galaxy Z Fold has an  $1,899 starting price compared to the iPhone Duo’s $1,999 cost.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2EK0e"></div>                            </div>                            <script src="https://kwizly.com/embed/W2EK0e.js" async></script><p>But Apple’s phone has a few advantages of its own, like the IP rating and Apple Pencil support. Other metric comparisons, like performance and battery life will have to wait until we get a chance to test Apple’s phone.</p><p>“Watching the keynote, it was easy to forget that surrounding these new products is the introduction of iOS 27,” Wood of CCS Insight said. “It's an important update, delivering major performance improvements and introducing the latest version of Apple Intelligence and Siri AI. These seem like a big step up from Apple’s earlier AI efforts, and based on my experience with the beta release, they're performing well.”</p><h2 id="iphone-duo-outlook">iPhone Duo outlook</h2><p>Foldable phones remains a small segment of the overall mobile market, though it’s growing — CCS Insight says that 25 million foldables sold in 2025, up 18% from the previous year. Wood anticipates growth this year and next, despite rising prices for memory and phone components. And the iPhone Duo’s arrival figures to be a big reason why.</p><p>“iPhone Duo is for anyone who has wanted a foldable but has not been willing to leave the iOS ecosystem, plus anyone who just wants a modern smartphone that opens up into a widescreen for watching content or multitasking,” Greengart said.</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/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"><strong>iPhone Duo hands-on: Apple nailed it — and just put everyone else on notice</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news"><strong>Apple Event recap — Hands-on with the iPhone Duo and all the big announcements</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/apples-just-extended-free-access-to-emergency-satellite-communication-for-another-year-its-the-third-time-this-has-happened"><strong>Apple's just extended free access to emergency satellite communication for another year — it's the third time this has happened</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I interviewed Apple CEO John Ternus on the making of the iPhone Duo — here's what made him say 'yes, that's it' ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Apple’s first <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">foldable phone</a> is finally coming in the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a>, and like most other Apple products, the company is famously late entering a new category. Yup, Samsung, Google, Huawei and others have been making foldables for several years, but Apple is adamant that it’s not chasing the Android competition.</p><p>While the iPhone Duo has a passport-style design like the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, in a lot of ways the phones couldn’t be more different. The Duo completely reimagines <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a> for the foldable form factor; it has Apple Pencil support and IP68 durability; and Apple is making a huge push to have lots of apps optimized for the Duo’s big 7.6-inch screen before the phone goes on sale in October.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/uJKt432tWM4" allowfullscreen></iframe></div></div><p>Along with TechRadar’s Lance Ulanoff, I sat down with Apple CEO John Ternus and senior vice president of worldwide marketing Greg ‘Joz’ Joswiak, and they stressed that Apple is making something truly unique.</p><p>“I think for us, it's always about when do we feel like we have a product idea that meets our bar for quality and durability but also design?” Ternus said. “What I think is particularly amazing about the Duo is that it's such a good example of hardware and software coming together to make something really special.”</p><p>That’s exactly what I wanted to dig into with Ternus and Joz: What really makes the iPhone Duo special in a sea of foldables? </p><h2 id="iphone-duo-the-a-ha-moment-for-apple-s-ceo">iPhone Duo: The ‘a-ha’ moment for Apple’s CEO</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:1802px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="ENFN2u4hpSYiQYfbA6WbcL" name="Apple iPhone Duo hands on-4" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/ENFN2u4hpSYiQYfbA6WbcL-1920-80.jpg" mos="" align="middle" fullscreen="" width="1802" height="1014" 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 of the things that struck me most during my <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"><u>hands-on time with the iPhone Duo</u></a> is that you can barely see the crease. And that’s thanks in large part to Apple’s nano-texture display. </p><p>The technology first appeared on the Mac Studio Display but has since migrated to the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a> and <a href="https://www.tomsguide.com/computing/macbooks/the-new-macbook-pro-m4-is-a-game-changer-for-how-i-work-and-it-has-nothing-to-do-with-apple-intelligence">MacBook Pro</a>.</p><p>This nano-texture finish is designed to reduce glare and reflections, and the matte surface minimizes crease visibility. I also couldn’t feel the crease when using the Duo.</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:2560px;"><p class="vanilla-image-block" style="padding-top:33.28%;"><img id="5aML3J8mGVPRkeFAPUmS85" name="Apple-feature-PQ_Ternus2" alt="Apple CEO John Ternus" src="https://cdn.mos.cms.futurecdn.net/5aML3J8mGVPRkeFAPUmS85-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="852" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Getty)</span></figcaption></figure><p>When Ternus saw this technology in action for the first time on Apple’s foldable prototype, he was convinced it was the right direction.</p><p>“It was like, ‘yes, that's it.’ ‘This is what I want. And then once we have that, then it's like okay, how do we go make it happen and make it real?’</p><p>Ternus shared that Apple came up with a new way of making the nano-texture display so that it’s optimized for a polymer surface instead of glass. </p><p>“I think what you've seen out there are all these just kind of cheap feeling plastic surfaces that don't feel good to the touch,” Ternus said. They're kind of wavy wrinkly, and the nano texture just wipes that all out. It's beautifully flat. It feels amazing to touch, and it's incredibly durable.”</p><h2 id="iphone-duo-vs-android-foldables">iPhone Duo vs Android 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fd7Kxymcum9UffZNVnDaJg" name="Apple iPhone Duo hands on-5" alt="Apple's John Ternus and Greg Joswiak sit down with Tom's Guide to discuss the new Apple iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/fd7Kxymcum9UffZNVnDaJg-1920-80.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="caption-text">Apple's John Ternus and Greg Joswiak sit down with Tom's Guide to discuss the new iPhone Duo foldable </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As impressive as Android foldable phones have become over the past few years, especially in terms of sheer thinness and lightness, the Android ecosystem is still pretty fragmented when it comes to apps.</p><p>For example, Slack just looks like a blown-up phone app on Android foldables, and pulling up comments on Instagram just covers the content. I don’t get the sense that this is going to be the case with the iPhone Duo.</p><p>Apple has been working behind the scenes with developers to optimize their apps for the iPhone Duo’s cover and main displays. This includes Netflix, Slack and Zoom.</p><p>“What we saw others doing wasn't particularly inspiring,” said Joz. “Our history has never been to rush into something with something half baked.”</p><p>So what does a fully baked iPhone Duo look like? </p><p>This includes a redesigned software experience that moves the main controls to the right edge of the screen so that they’re easier to reach. And this is for both displays.</p><p>“It turns out to be an incredibly intuitive control system, because it's there under your right thumb when it's closed,” said Ternus. “You open it up, it's there under your right thumb again. So I think that's one of the biggest things with iOS is you're going to have two screens. How do you make sure that it feels continuous?”</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:2560px;"><p class="vanilla-image-block" style="padding-top:33.28%;"><img id="iXqvqh7cBFZZUNNvPKcLRT" name="Apple-feature-PQ_Joz1" alt="Quote from Apple VP Greg Joswiak" src="https://cdn.mos.cms.futurecdn.net/iXqvqh7cBFZZUNNvPKcLRT-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="852" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Getty)</span></figcaption></figure><p>I asked explicitly about whether the October 23 release date for the iPhone Duo will help ensure Apple has enough optimized apps for launch. And Joz likened the launch to the original iPad.</p><p>“That’s why we went so out of our way with iPad development, both internally and with our third parties,” Joz said. “We didn't want the iPad to feel like a big phone and that's again exactly what Android tablets felt like. And the same thing applies here.”</p><h2 id="iphone-stylus-breaking-apple-s-rules">iPhone + stylus = breaking Apple’s rules?</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:2297px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g8hRHytY7NFuF8mBGUagyL" name="Apple iPhone Duo hands on" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/g8hRHytY7NFuF8mBGUagyL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2297" height="1292" 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>Steve Jobs famously said that “if you see a stylus, they blew it’ in reference to smartphones. But that was 2007. </p><p>So is Apple breaking its own rules by offering Apple Pencil support in the iPhone Duo? Not really. Because it’s an iPhone and iPad in one device.</p><p>“I’ve never really thought of it as a rule,” Ternus said. “We started with iPad. There was no Apple Pencil, right? But then there's things you can do with a pencil on that larger screen that are really powerful and capable. And I think we saw that opportunity here. </p><p>“You don't need a pencil, but I think some people are going to like it, and it's going to be fun.”</p><h2 id="the-2-000-question">The $2,000 question</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:2144px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4QQN7JtKkmsE7V6tNMwe2M" name="Apple iPhone Duo hands on-2" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/4QQN7JtKkmsE7V6tNMwe2M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2144" height="1206" 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>With a starting price of $1,999, the iPhone Duo is by far the most expensive iPhone ever, so I wanted to know how Apple is going to justify the premium.</p><p>“We're always focused on building cool things that people love, but also are a really good value,” Ternus said. “And (the iPhone Duo) is an incredibly complex and well-engineered device. Yes, it's more expensive than the other phones, but we think it's a great value.”</p><p>At the same time, the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">iPhone 18 Pro and iPhone 18 Pro Max</a> have also gone up in price by $100 each. But Apple insists that the new Pro phones deliver. This includes a new variable aperture camera, faster <a href="https://www.tomsguide.com/phones/iphones/apple-a20-pro-chip-why-its-such-a-big-deal-for-the-iphone-ultra-and-iphone-18-pro-max">A20 Pro chip</a> (that’s also in the iPhone Duo), bigger vapor chamber and even longer battery life.</p><p>“I look at those products as, ‘Man, how do you really feed an iPhone 17 Pro steroids and take not just an incremental improvement in each of these areas but massive year-on-year improvements,” Jozwiak asks.</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:2560px;"><p class="vanilla-image-block" style="padding-top:33.28%;"><img id="uLUGrvsxWyUBSMPaVJVpQT" name="Apple-feature-PQ_Ternus1" alt="Quote from Apple CEO John Ternus" src="https://cdn.mos.cms.futurecdn.net/uLUGrvsxWyUBSMPaVJVpQT-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="852" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Getty)</span></figcaption></figure><p>Ultimately, though, all eyes will be on the Duo because it’s the shiny new thing. And it’s the experiences that it enables that Apple is hoping will get foldable phone doubters off the fence. For example, the Smart Take camera mode lets you prop up the Duo and is intelligent enough to snap photos when everyone is in position in a group shot — no timer required.</p><p>“The beauty of Apple is its hardware, software, and services,” Ternus said. “What I love is when all of these things come together and interact and create an experience that is just bigger than the sum of its parts.”</p><p><strong>NEXT: Watch part 2 of our interview with Turnus and Joz on TechRadar.</strong></p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/HWg75OAmJLc" allowfullscreen></iframe></div></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo</link>
                                                                            <description>
                            <![CDATA[ I spoke with Apple CEO John Ternus and SVP of worldwide marketing Greg ‘Joz’ Joswiak about the iPhone Duo and what Apple is doing to stand out in a sea of established Android foldables. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Bdp4Yc4gTZq4KFyiETLJN5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/QnvxRM3sKN53UTet25jkZS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 21:40:52 +0000</pubDate>                                                                                                                                <updated>Sat, 12 Sep 2026 19:38: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-320-70.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;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. &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. &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>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/QnvxRM3sKN53UTet25jkZS-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple executives John Ternus and Greg Joswiak]]></media:description>                                                            <media:text><![CDATA[Apple executives John Ternus and Greg Joswiak]]></media:text>
                                <media:title type="plain"><![CDATA[Apple executives John Ternus and Greg Joswiak]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/QnvxRM3sKN53UTet25jkZS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple’s first <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">foldable phone</a> is finally coming in the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a>, and like most other Apple products, the company is famously late entering a new category. Yup, Samsung, Google, Huawei and others have been making foldables for several years, but Apple is adamant that it’s not chasing the Android competition.</p><p>While the iPhone Duo has a passport-style design like the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, in a lot of ways the phones couldn’t be more different. The Duo completely reimagines <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a> for the foldable form factor; it has Apple Pencil support and IP68 durability; and Apple is making a huge push to have lots of apps optimized for the Duo’s big 7.6-inch screen before the phone goes on sale in October.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/uJKt432tWM4" allowfullscreen></iframe></div></div><p>Along with TechRadar’s Lance Ulanoff, I sat down with Apple CEO John Ternus and senior vice president of worldwide marketing Greg ‘Joz’ Joswiak, and they stressed that Apple is making something truly unique.</p><p>“I think for us, it's always about when do we feel like we have a product idea that meets our bar for quality and durability but also design?” Ternus said. “What I think is particularly amazing about the Duo is that it's such a good example of hardware and software coming together to make something really special.”</p><p>That’s exactly what I wanted to dig into with Ternus and Joz: What really makes the iPhone Duo special in a sea of foldables? </p><h2 id="iphone-duo-the-a-ha-moment-for-apple-s-ceo">iPhone Duo: The ‘a-ha’ moment for Apple’s CEO</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:1802px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="ENFN2u4hpSYiQYfbA6WbcL" name="Apple iPhone Duo hands on-4" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/ENFN2u4hpSYiQYfbA6WbcL-1920-80.jpg" mos="" align="middle" fullscreen="" width="1802" height="1014" 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 of the things that struck me most during my <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"><u>hands-on time with the iPhone Duo</u></a> is that you can barely see the crease. And that’s thanks in large part to Apple’s nano-texture display. </p><p>The technology first appeared on the Mac Studio Display but has since migrated to the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a> and <a href="https://www.tomsguide.com/computing/macbooks/the-new-macbook-pro-m4-is-a-game-changer-for-how-i-work-and-it-has-nothing-to-do-with-apple-intelligence">MacBook Pro</a>.</p><p>This nano-texture finish is designed to reduce glare and reflections, and the matte surface minimizes crease visibility. I also couldn’t feel the crease when using the Duo.</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:2560px;"><p class="vanilla-image-block" style="padding-top:33.28%;"><img id="5aML3J8mGVPRkeFAPUmS85" name="Apple-feature-PQ_Ternus2" alt="Apple CEO John Ternus" src="https://cdn.mos.cms.futurecdn.net/5aML3J8mGVPRkeFAPUmS85-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="852" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Getty)</span></figcaption></figure><p>When Ternus saw this technology in action for the first time on Apple’s foldable prototype, he was convinced it was the right direction.</p><p>“It was like, ‘yes, that's it.’ ‘This is what I want. And then once we have that, then it's like okay, how do we go make it happen and make it real?’</p><p>Ternus shared that Apple came up with a new way of making the nano-texture display so that it’s optimized for a polymer surface instead of glass. </p><p>“I think what you've seen out there are all these just kind of cheap feeling plastic surfaces that don't feel good to the touch,” Ternus said. They're kind of wavy wrinkly, and the nano texture just wipes that all out. It's beautifully flat. It feels amazing to touch, and it's incredibly durable.”</p><h2 id="iphone-duo-vs-android-foldables">iPhone Duo vs Android 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fd7Kxymcum9UffZNVnDaJg" name="Apple iPhone Duo hands on-5" alt="Apple's John Ternus and Greg Joswiak sit down with Tom's Guide to discuss the new Apple iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/fd7Kxymcum9UffZNVnDaJg-1920-80.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="caption-text">Apple's John Ternus and Greg Joswiak sit down with Tom's Guide to discuss the new iPhone Duo foldable </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As impressive as Android foldable phones have become over the past few years, especially in terms of sheer thinness and lightness, the Android ecosystem is still pretty fragmented when it comes to apps.</p><p>For example, Slack just looks like a blown-up phone app on Android foldables, and pulling up comments on Instagram just covers the content. I don’t get the sense that this is going to be the case with the iPhone Duo.</p><p>Apple has been working behind the scenes with developers to optimize their apps for the iPhone Duo’s cover and main displays. This includes Netflix, Slack and Zoom.</p><p>“What we saw others doing wasn't particularly inspiring,” said Joz. “Our history has never been to rush into something with something half baked.”</p><p>So what does a fully baked iPhone Duo look like? </p><p>This includes a redesigned software experience that moves the main controls to the right edge of the screen so that they’re easier to reach. And this is for both displays.</p><p>“It turns out to be an incredibly intuitive control system, because it's there under your right thumb when it's closed,” said Ternus. “You open it up, it's there under your right thumb again. So I think that's one of the biggest things with iOS is you're going to have two screens. How do you make sure that it feels continuous?”</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:2560px;"><p class="vanilla-image-block" style="padding-top:33.28%;"><img id="iXqvqh7cBFZZUNNvPKcLRT" name="Apple-feature-PQ_Joz1" alt="Quote from Apple VP Greg Joswiak" src="https://cdn.mos.cms.futurecdn.net/iXqvqh7cBFZZUNNvPKcLRT-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="852" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Getty)</span></figcaption></figure><p>I asked explicitly about whether the October 23 release date for the iPhone Duo will help ensure Apple has enough optimized apps for launch. And Joz likened the launch to the original iPad.</p><p>“That’s why we went so out of our way with iPad development, both internally and with our third parties,” Joz said. “We didn't want the iPad to feel like a big phone and that's again exactly what Android tablets felt like. And the same thing applies here.”</p><h2 id="iphone-stylus-breaking-apple-s-rules">iPhone + stylus = breaking Apple’s rules?</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:2297px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g8hRHytY7NFuF8mBGUagyL" name="Apple iPhone Duo hands on" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/g8hRHytY7NFuF8mBGUagyL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2297" height="1292" 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>Steve Jobs famously said that “if you see a stylus, they blew it’ in reference to smartphones. But that was 2007. </p><p>So is Apple breaking its own rules by offering Apple Pencil support in the iPhone Duo? Not really. Because it’s an iPhone and iPad in one device.</p><p>“I’ve never really thought of it as a rule,” Ternus said. “We started with iPad. There was no Apple Pencil, right? But then there's things you can do with a pencil on that larger screen that are really powerful and capable. And I think we saw that opportunity here. </p><p>“You don't need a pencil, but I think some people are going to like it, and it's going to be fun.”</p><h2 id="the-2-000-question">The $2,000 question</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:2144px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4QQN7JtKkmsE7V6tNMwe2M" name="Apple iPhone Duo hands on-2" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/4QQN7JtKkmsE7V6tNMwe2M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2144" height="1206" 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>With a starting price of $1,999, the iPhone Duo is by far the most expensive iPhone ever, so I wanted to know how Apple is going to justify the premium.</p><p>“We're always focused on building cool things that people love, but also are a really good value,” Ternus said. “And (the iPhone Duo) is an incredibly complex and well-engineered device. Yes, it's more expensive than the other phones, but we think it's a great value.”</p><p>At the same time, the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike">iPhone 18 Pro and iPhone 18 Pro Max</a> have also gone up in price by $100 each. But Apple insists that the new Pro phones deliver. This includes a new variable aperture camera, faster <a href="https://www.tomsguide.com/phones/iphones/apple-a20-pro-chip-why-its-such-a-big-deal-for-the-iphone-ultra-and-iphone-18-pro-max">A20 Pro chip</a> (that’s also in the iPhone Duo), bigger vapor chamber and even longer battery life.</p><p>“I look at those products as, ‘Man, how do you really feed an iPhone 17 Pro steroids and take not just an incremental improvement in each of these areas but massive year-on-year improvements,” Jozwiak asks.</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:2560px;"><p class="vanilla-image-block" style="padding-top:33.28%;"><img id="uLUGrvsxWyUBSMPaVJVpQT" name="Apple-feature-PQ_Ternus1" alt="Quote from Apple CEO John Ternus" src="https://cdn.mos.cms.futurecdn.net/uLUGrvsxWyUBSMPaVJVpQT-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="852" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Getty)</span></figcaption></figure><p>Ultimately, though, all eyes will be on the Duo because it’s the shiny new thing. And it’s the experiences that it enables that Apple is hoping will get foldable phone doubters off the fence. For example, the Smart Take camera mode lets you prop up the Duo and is intelligent enough to snap photos when everyone is in position in a group shot — no timer required.</p><p>“The beauty of Apple is its hardware, software, and services,” Ternus said. “What I love is when all of these things come together and interact and create an experience that is just bigger than the sum of its parts.”</p><p><strong>NEXT: Watch part 2 of our interview with Turnus and Joz on TechRadar.</strong></p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/HWg75OAmJLc" allowfullscreen></iframe></div></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm a personal trainer: Try this 3-move workout to build a strong core and reduce back pain after 50 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Sometimes we mistake high intensity for direct results, but you don't need to blast your core with HIIT workouts and repetitive sit-ups and crunches to build a strong and stable core. Consistency, progressive overload, the right exercises and managing overall body fat levels as you get older will get you results in the gym.</p><p>But what are those exercises? Well, there's no one-size-fits-all approach, but as a trainer, I find compound exercises (multi-muscle moves) are effective for achieving overload, and I like to keep things as low-impact as possible while switching up equipment. </p><p>Recently, I designed this three-move core workout to build a strong, stable, injury-resistant core while targeting multiple muscle groups in your core network responsible for supporting your pelvis and spine.</p><p>Below, I show you how to do three of the best low-impact exercises for functional strength and stability. One of the<a href="https://www.tomsguide.com/best-picks/best-yoga-mats"> best yoga mats</a> is useful to have.</p><p><em>If you experience pain at any time, stop and rest. If you're working with an injury or health condition, or you're currently pregnant or postnatal, I recommend seeking advice before starting these exercises.</em></p><h2 id="watch-3-low-impact-moves-to-try-anywhere">Watch: 3 low-impact moves to try anywhere</h2><p>These strengthening exercises load the muscles to work through resistance. The result? A stronger core. Add weight when you feel comfortable with the moves.</p><p><strong>The routine:</strong> 50 seconds on, 10 seconds off, 5 rounds. Add or reduce rounds depending on your ability.</p><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/DdBGIkpoqHI/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><ul><li><strong>Up and overs: </strong>Sit with your legs extended in front of you and place a block slightly to one side. Place your hands by your hips for extra support or behind your head for an extra challenge. Engage your core and draw your navel in, keeping your chest proud and back straight. With control, lift your legs up and over the blocks, then back again. Slightly rotate as you move up and over the block or weight, engaging your waist.</li><li><strong>Plank-downward dog taps</strong>: Start in a high plank position with your shoulders stacked over your wrists and your butt aligned with your shoulders. Keep your core engaged and navel drawn in. Lift your hips up and back into a downward dog, then tap one hand to the opposite ankle. Come back to plank, then repeat on the other side.</li><li><strong>Hollow hold leg raises</strong>: Lie on your back and extend your arms and legs. Engage your core, then slowly raise your arms and legs into the air to create a banana shape with your body. Keep your chin tucked, try to peel your shoulders away from the mat, point your toes and tuck your pelvis slightly under. Avoid arching your lower back. Hold the position and breathe toward your stomach. Once you feel ready, begin slowly lifting and lowering your legs without touching the ground.</li></ul><h2 id="what-are-the-benefits-4">What are the benefits?</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:6048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HCR5YvfinR9zDhhzfAs9Bh" name="workout 2_shutterstock_2458594235" alt="a senior woman smiling on a workout mat" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:622,l:0,cw:6048,ch:3402,q:80/HCR5YvfinR9zDhhzfAs9Bh.jpg" mos="" align="middle" fullscreen="" width="6048" height="4024" 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>Each of these exercises brings something slightly different to the table. </p><p><strong>The up-and-over exercise</strong> is brilliant for targeting your obliques, deeper core muscles like the transverse abdominis (a belt of stabilizing muscle), abs and hip flexors. As you lift and lower your legs, your core must work hard to help move, along with your hips, without hurting your back. Rotational motion is an effective way to strengthen your waist, which will help your body resist unwanted motion and impact. Try to avoid your hips completely taking over the exercise.</p><p><strong>Plank and downward dog tapping</strong> provide a full-body workout, hitting the arms, shoulders, chest, upper back, posterior chain (back of the body), core and hips. As you lift up and back, notice the stretch while the plank builds strength using isometric muscular contraction. Tapping improves balance and stability and forces your body to resist unwanted rotation while gently engaging the obliques.</p><p><strong>Hollow holds with leg raises </strong>are one of my favorite exercises to train core stability. Again, isometric contraction means strengthening while remaining low-impact on the spine, as you focus on holding tension without arching your back and while maintaining your breath. When you feel comfortable, leg raises are a great addition for targeting the hips and the deeper belt of core muscles.</p><div><blockquote><p>Each of these exercises brings something slightly different to the table. </p></blockquote></div><p>Really control these movements and make the most of them, rather than rushing. Play around by adding weights or equipment. I usually add dumbbells, but if this damages the quality of your reps, stick to using your bodyweight. You have plenty of time to progress through the exercises as you get stronger.</p><p>Focus on finding length through your spine rather than hunching, and keep your chest proud. Any time your hands are behind your head or next to your hips, try to knit both shoulder blades together to help open your chest and activate the mid and upper back.</p><p>Give these a try, and let us know how you get on in the comments.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ONKRJX"></div>                            </div>                            <script src="https://kwizly.com/embed/ONKRJX.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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank">I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/im-a-personal-trainer-who-works-with-clients-aged-65-daily-here-are-the-2-exercises-i-always-recommend-when-it-comes-to-building-mobility-and-balance" target="_blank">I’m a personal trainer who works with clients aged 65+ daily. Here are the 2 exercises I always recommend when it comes to building mobility and balance</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/a-pilates-instructor-shares-a-6-move-routine-for-over-60s-to-build-balance-mobility-and-functional-core-strength" target="_blank">A Pilates instructor shares a 6-move routine for over-60s to build balance, mobility and functional core strength</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/workouts/im-a-personal-trainer-try-this-3-move-workout-to-build-a-strong-core-and-reduce-back-pain-after-50</link>
                                                                            <description>
                            <![CDATA[ These three moves are low-impact and build a strong core without hurting your back; a personal trainer shares how to do them. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">eZ3QPwDRwzdvFo42QJREXK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UuodHaz6cTmjujHVJHcUS5-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Workouts]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                <author><![CDATA[ sam.hopes@futurenet.com (Sam Hopes) ]]></author>                    <dc:creator><![CDATA[ Sam Hopes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jZ88qJqvjWaCXXv3qvUQPA-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Sam Hopes is a level 3 qualified trainer, a level 2 Reiki practitioner and a fitness editor at Tom&#039;s Guide. She is also currently undertaking her Yoga For Athletes training course. Sam has written for various fitness brands and websites over the years and has experience across brands at Future, such as &lt;a href=&quot;https://www.livescience.com/author/sam-hopes&quot;&gt;Live Science&lt;/a&gt;,&lt;a href=&quot;https://www.fitandwell.com/author/sam-hopes&quot;&gt; Fit&amp;amp;Well&lt;/a&gt;,&lt;a href=&quot;https://www.coachweb.com/author/sam-hopes&quot;&gt; Coach&lt;/a&gt;, and T3. &lt;/p&gt;&lt;p&gt;Having worked with fitness studios like F45 and Virgin Active and trained both group and 1:1, Sam now primarily teaches outdoor bootcamps, bodyweight, and kettlebells. She also coaches mobility and flexibility classes several times a week and believes that true strength comes from a holistic approach to training your body. &lt;/p&gt;&lt;p&gt;Sam has completed two mixed doubles Hyrox competitions in London and the Netherlands and finished her first doubles attempt in 1:11.&lt;/p&gt;&lt;p&gt;In her spare time, she enjoys CrossFit, hot yoga, Pilates and running and can be found perfecting her handstand walks and handstand push-ups in the gym whenever she has the chance to be upside down. At work, she can be found testing the latest in fitness technology and wearables, anything yoga and CrossFit-related and has a keen interest in nutrition, mindfulness, sleep and recovery.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UuodHaz6cTmjujHVJHcUS5-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a middle aged woman with strong abs]]></media:description>                                                            <media:text><![CDATA[a middle aged woman with strong abs]]></media:text>
                                <media:title type="plain"><![CDATA[a middle aged woman with strong abs]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UuodHaz6cTmjujHVJHcUS5-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Sometimes we mistake high intensity for direct results, but you don't need to blast your core with HIIT workouts and repetitive sit-ups and crunches to build a strong and stable core. Consistency, progressive overload, the right exercises and managing overall body fat levels as you get older will get you results in the gym.</p><p>But what are those exercises? Well, there's no one-size-fits-all approach, but as a trainer, I find compound exercises (multi-muscle moves) are effective for achieving overload, and I like to keep things as low-impact as possible while switching up equipment. </p><p>Recently, I designed this three-move core workout to build a strong, stable, injury-resistant core while targeting multiple muscle groups in your core network responsible for supporting your pelvis and spine.</p><p>Below, I show you how to do three of the best low-impact exercises for functional strength and stability. One of the<a href="https://www.tomsguide.com/best-picks/best-yoga-mats"> best yoga mats</a> is useful to have.</p><p><em>If you experience pain at any time, stop and rest. If you're working with an injury or health condition, or you're currently pregnant or postnatal, I recommend seeking advice before starting these exercises.</em></p><h2 id="watch-3-low-impact-moves-to-try-anywhere">Watch: 3 low-impact moves to try anywhere</h2><p>These strengthening exercises load the muscles to work through resistance. The result? A stronger core. Add weight when you feel comfortable with the moves.</p><p><strong>The routine:</strong> 50 seconds on, 10 seconds off, 5 rounds. Add or reduce rounds depending on your ability.</p><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/DdBGIkpoqHI/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by </p></blockquote></div><ul><li><strong>Up and overs: </strong>Sit with your legs extended in front of you and place a block slightly to one side. Place your hands by your hips for extra support or behind your head for an extra challenge. Engage your core and draw your navel in, keeping your chest proud and back straight. With control, lift your legs up and over the blocks, then back again. Slightly rotate as you move up and over the block or weight, engaging your waist.</li><li><strong>Plank-downward dog taps</strong>: Start in a high plank position with your shoulders stacked over your wrists and your butt aligned with your shoulders. Keep your core engaged and navel drawn in. Lift your hips up and back into a downward dog, then tap one hand to the opposite ankle. Come back to plank, then repeat on the other side.</li><li><strong>Hollow hold leg raises</strong>: Lie on your back and extend your arms and legs. Engage your core, then slowly raise your arms and legs into the air to create a banana shape with your body. Keep your chin tucked, try to peel your shoulders away from the mat, point your toes and tuck your pelvis slightly under. Avoid arching your lower back. Hold the position and breathe toward your stomach. Once you feel ready, begin slowly lifting and lowering your legs without touching the ground.</li></ul><h2 id="what-are-the-benefits-4">What are the benefits?</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:6048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HCR5YvfinR9zDhhzfAs9Bh" name="workout 2_shutterstock_2458594235" alt="a senior woman smiling on a workout mat" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:622,l:0,cw:6048,ch:3402,q:80/HCR5YvfinR9zDhhzfAs9Bh.jpg" mos="" align="middle" fullscreen="" width="6048" height="4024" 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>Each of these exercises brings something slightly different to the table. </p><p><strong>The up-and-over exercise</strong> is brilliant for targeting your obliques, deeper core muscles like the transverse abdominis (a belt of stabilizing muscle), abs and hip flexors. As you lift and lower your legs, your core must work hard to help move, along with your hips, without hurting your back. Rotational motion is an effective way to strengthen your waist, which will help your body resist unwanted motion and impact. Try to avoid your hips completely taking over the exercise.</p><p><strong>Plank and downward dog tapping</strong> provide a full-body workout, hitting the arms, shoulders, chest, upper back, posterior chain (back of the body), core and hips. As you lift up and back, notice the stretch while the plank builds strength using isometric muscular contraction. Tapping improves balance and stability and forces your body to resist unwanted rotation while gently engaging the obliques.</p><p><strong>Hollow holds with leg raises </strong>are one of my favorite exercises to train core stability. Again, isometric contraction means strengthening while remaining low-impact on the spine, as you focus on holding tension without arching your back and while maintaining your breath. When you feel comfortable, leg raises are a great addition for targeting the hips and the deeper belt of core muscles.</p><div><blockquote><p>Each of these exercises brings something slightly different to the table. </p></blockquote></div><p>Really control these movements and make the most of them, rather than rushing. Play around by adding weights or equipment. I usually add dumbbells, but if this damages the quality of your reps, stick to using your bodyweight. You have plenty of time to progress through the exercises as you get stronger.</p><p>Focus on finding length through your spine rather than hunching, and keep your chest proud. Any time your hands are behind your head or next to your hips, try to knit both shoulder blades together to help open your chest and activate the mid and upper back.</p><p>Give these a try, and let us know how you get on in the comments.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="vGnNDN" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ONKRJX"></div>                            </div>                            <script src="https://kwizly.com/embed/ONKRJX.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/wellness/workouts/i-teach-people-how-to-be-more-mobile-3-low-impact-back-and-shoulder-moves-that-build-stability-and-strength-after-40" target="_blank">I teach people how to be more mobile: 3 low-impact back and shoulder moves that build stability and strength after 40</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/im-a-personal-trainer-who-works-with-clients-aged-65-daily-here-are-the-2-exercises-i-always-recommend-when-it-comes-to-building-mobility-and-balance" target="_blank">I’m a personal trainer who works with clients aged 65+ daily. Here are the 2 exercises I always recommend when it comes to building mobility and balance</a></li><li><a href="https://www.tomsguide.com/wellness/workouts/a-pilates-instructor-shares-a-6-move-routine-for-over-60s-to-build-balance-mobility-and-functional-core-strength" target="_blank">A Pilates instructor shares a 6-move routine for over-60s to build balance, mobility and functional core strength</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I thought my pillow was fine until I tried this 30-second test to see if it needs replacing ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For me, a good night's sleep lays the foundation for a productive work day. But lately, I've been tossing and turning at night and my sleep quality has taken a direct hit. I had a hunch my <a href="https://www.tomsguide.com/best-picks/best-pillow">pillow</a> might have something to do it, so I decided to perform a simple test that instantly tells you whether your pillow needs replacing or not.</p><p>Sure enough, my pillow failed this basic 30-second test. </p><p>A pillow that has lost its support and shape will force you to wake up multiple times a night to replump and reshape it. Long-term, a pillow that has lost its support can throw your neck out of alignment, causing morning aches and pains and poor posture.</p><p>Here's what the 30-second test involves, how to perform it yourself, and what the results mean for your pillow and the <a href="https://www.tomsguide.com/wellness/sleep/sleep-quality--matters-more-than-quantity-says-new-study">quality of your sleep</a>.</p><h2 class="article-body__section" id="section-the-30-second-test-explained"><span>The 30-second test explained</span></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:2016px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WtZfrEbF7cJNNGeXPBK8PD" name="30 second pillow test" alt="Folding the pillow in half to check its level of support" src="https://cdn.mos.cms.futurecdn.net/WtZfrEbF7cJNNGeXPBK8PD-1920-80.jpg" mos="" align="middle" fullscreen="" width="2016" height="1134" 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 30-second pillow test is a simple way to find out if your pillow is supportive enough to hold your head, neck and shoulders in alignment with your spine while you sleep. </p><p>A pillow with an even fill distribution and good support will not fold easily. Instead it will snap back fast. This pillow is good for sleeping.</p><p>An unsupportive pillow, on the other hand, will not only fold, but also take time to spring back to its original position. This pillow needs replacing asap.</p><h2 id="how-to-perform-the-30-second-pillow-test">How to perform the 30-second pillow test</h2><ul><li>Remove the pillowcase or any other protectors.</li><li>Lay the pillow flat on a hard surface.</li><li>Fold it completely in half and hold it closed for 30 seconds.</li><li>Now release the pillow</li><li>If it stays folded or springs back sluggishly, the support has gone and your pillow is no longer fit for purpose.</li><li>If it snaps instantly back into shape, it’s still good for sleeping on.</li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEYwAe"></div>                            </div>                            <script src="https://kwizly.com/embed/eEYwAe.js" async></script><h2 class="article-body__section" id="section-why-my-pillow-failed-the-30-second-test"><span>Why my pillow failed the 30-second test</span></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:2016px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CMHbRg7VX9pyLLT6SiR8V7" name="30 second pillow test" alt="Folding a pillow in half to check its support" src="https://cdn.mos.cms.futurecdn.net/CMHbRg7VX9pyLLT6SiR8V7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2016" height="1134" 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>After several nights of broken sleep, I figured that it's time to put my pillow to the test. For reference, my microfiber pillow is over two years old and has overall lost its initial plushness. I laid it out on a flat surface and folded it in half. To my surprise, my pillow folded almost too easily, like a book. </p><p>Unlike newer supportive pillows, which instantly snap back, mine took longer to return to its original position. On further inspection, I figured that the filling inside was bunched up and uneven, giving a still-folded effect right in the middle. This made me realize that it's high time to <a href="https://www.tomsguide.com/wellness/mattresses/this-is-how-often-should-you-change-your-pillow-according-to-an-expert">replace it with another</a>. </p><h2 id="why-unsupportive-pillows-need-replacing">Why unsupportive pillows need replacing</h2><p>A sagging or unsupportive pillow compromises your <a href="https://www.tomsguide.com/wellness/sleep/sleep-positions">spinal alignment</a>. </p><p>In order to correct your posture, your neck ends up bending unnaturally, straining the muscles— the major reason behind <a href="https://www.tomsguide.com/mattresses/why-do-i-wake-with-neck-pain-every-morning-i-asked-a-chiropractor-to-help-with-my-sleep-woes">morning neck pain</a>. </p><p>It can also lead to frequent wake-ups and tossing and turning, as it happened in my case, where I was constantly trying to find the right sleeping position. </p><p>If you're someone who already <a href="https://www.tomsguide.com/mattresses/pillows-bedding/how-to-choose-a-pillow-for-snoring">struggles with snoring</a>, sleeping on an unsupportive pillow can also make your symptoms worse. </p><h2 class="article-body__section" id="section-other-signs-your-pillow-needs-replacing"><span>Other signs your pillow needs replacing</span></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:2121px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GSBgMf89ymWocNHTNkjkYW" name="Yellow stains on pillow and mattress.jpg" alt="Yellow stains on pillow and mattress" src="https://cdn.mos.cms.futurecdn.net/GSBgMf89ymWocNHTNkjkYW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2121" height="1193" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>While experts recommend changing your pillow every one to two years, you can do it sooner if you notice any of these secondary indicators. </p><p><strong>Clumping up of the filling is a strong indicator of a lack of support.</strong> Pillows with poor support can lead to those random <a href="https://www.tomsguide.com/wellness/sleep/stress-was-waking-me-up-at-3-a-m-until-two-of-the-worlds-best-sleep-doctors-shared-5-fast-fixes-to-lower-my-cortisol-at-night">3 a.m. wake-ups</a> because your head and neck fall out of alignment, and you wake to replump the pillow.</p><p><strong>Another common sign is the </strong><a href="https://www.tomsguide.com/wellness/mattresses/yellow-stains-on-mattress-and-pillow-causes-and-how-to-get-them-out"><strong>yellowing of your pillow</strong></a><strong>.</strong> This is due to a buildup of your sweat, body oils, drool and dead skin cells, which seeps through the pillowcase. Over time, this can create the perfect breeding ground for <a href="https://www.tomsguide.com/wellness/mattresses/how-to-get-rid-of-dust-mites-from-your-mattress-pillows-and-bedding">dust mites and bacteria</a>, even resulting in a musty, bad smell. </p><p>And no, <a href="https://www.tomsguide.com/how-to/how-to-wash-a-pillow">washing your pillow</a> might not solve the problem, especially if you've been using it for a long time. </p><p><strong>A constant need to re-fluff or plump your pillow</strong> also shows that it is not fit to provide you with the required comfort. </p><h2 class="article-body__section" id="section-what-to-look-for-in-a-new-pillow"><span>What to look for in a new pillow</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/9LPAY8n9jZBWeVKTYFzMGD-1920-80.jpg" alt="Woman sleeping on a white pillow with a purple tag on a bed with a rattan headboard" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>As a professional bedding tester, I'm aware of the fact that finding a comfy pillow among a sea of options is tricky. </p><p>The key is to first understand what your sleeping position (side, back and stomach) is and then choosing the right <a href="https://www.tomsguide.com/mattresses/pillows-bedding/pillow-loft">pillow loft</a> to support it. </p><p>Pillow loft is basically the height of your headrest. Lying on a pillow too low or too high for your sleeping position, once again, puts your neck muscles and spinal alignment at risk. This is why it's important to choose the <a href="https://www.tomsguide.com/wellness/mattresses/how-to-choose-the-right-pillow-for-your-sleep-position">right pillow for your sleeping position</a>. </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="NeRpvtMekMCKg2QEXPpD8h" name="Pillow Testing" alt="Pillow Testing- a stack of pillows in TG Sleep Studio" src="https://cdn.mos.cms.futurecdn.net/NeRpvtMekMCKg2QEXPpD8h-1920-80.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: Future)</span></figcaption></figure><p><a href="https://www.tomsguide.com/wellness/sleep/experts-love-this-sleeping-position-for-preventing-back-pain-and-for-sleeping-through-the-night-heres-why-and-how-to-do-it">Side sleepers</a> require a high to mid-loft pillow (4 to 6 inches) which effectively bridges the gap between your ear and your <a href="https://www.tomsguide.com/mattresses/best-mattress">mattress</a>. </p><p><a href="https://www.tomsguide.com/wellness/sleep/how-to-sleep-on-your-back">Back sleepers</a> need a low-loft pillow which is high enough to support your head, but keeps your chin in a neutral position. </p><p><a href="https://www.tomsguide.com/wellness/sleep/whats-so-bad-about-stomach-sleeping-expert-dishes-the-dirt-on-so-called-worst-sleeping-position-ever">Stomach sleeping</a> is the least recommended position, but if it's a force of habit, you need a low-loft, soft pillow, which prevents any further strain on your neck muscles. </p><p>If your priority is long-term durability and support, look for <a href="https://www.tomsguide.com/wellness/mattresses/what-are-pillows-made-of">pillows made of materials</a> like latex and high-quality memory foam, known to provide responsive comfort consistently. </p><p>Still confused? We've curated the <a href="https://www.tomsguide.com/best-picks/best-pillow">best pillows</a> guide, which includes options for every sleep position and concern. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Wnkd4O"></div>                            </div>                            <script src="https://kwizly.com/embed/Wnkd4O.js" async></script><h2 class="article-body__section" id="section-check-your-pillow-tonight"><span>Check your pillow tonight</span></h2><p>If you've been waking up several times during the night or struggling with morning neck pain, it's a good idea to check if your pillow is at fault. </p><p>All it takes is 30 seconds of your time. Simply fold your pillow, hold it for 30 seconds and observe how long it takes to return to its normal position. </p><p>This simple fold test can reveal if your pillow lacks the support you need to have an uninterrupted night's rest. </p><div data-model-name="Beckham Hotel Collection Gel Pillow,Nest Bedding Easy Breather Side Sleeper Pillow,Silentnight Anti-Allergy Pillow,Silentnight Airmax Pillow,Coop Home Goods Original Adjustable Pillow,Saatva Latex Pillow,Helix Sleep Talalay Latex Pillow,Leesa Pillow,Silentnight Firm Support Pillows,Emma Foam Pillow,Silentnight Cool Touch Pillow,Simba Hybrid Firm Pillow,Casper Pillow,Argos Home Supersoft Bounceback Firm Pillow,Dunelm Temperature Reactive Memory Foam Firm-Support Pillow" data-widget-type="multimodelreview" data-widget-title="Today's best prices on popular pillows"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/mattresses/pillows-bedding/i-thought-my-pillow-was-fine-until-i-tried-this-30-second-test-to-see-if-it-needs-replacing</link>
                                                                            <description>
                            <![CDATA[ This 30-second test revealed that my pillow was lacking the support I needed for a good night's sleep. Here's how to test your pillow and what the results mean... ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YjqmV5zvQ8h4jTTNGzc7em</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EsWowpHuqxiBUpFaRV8V53-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 10:45:00 +0000</pubDate>                                                                                                                                <updated>Thu, 10 Sep 2026 11:07:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Pillows & Bedding]]></category>
                                                    <category><![CDATA[Mattresses]]></category>
                                                                                                <author><![CDATA[ becky.george@futurenet.com (Becky George) ]]></author>                    <dc:creator><![CDATA[ Becky George ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/VaAvSCuMo9zff6r9TMZwQW-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EsWowpHuqxiBUpFaRV8V53-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tom&#039;s Guide bedding expert Becky George lies on her side on a new supportive pillow. On the right hand side she performs a 30-second fold test on her old pillow to see if it needs replacing]]></media:description>                                                            <media:text><![CDATA[Tom&#039;s Guide bedding expert Becky George lies on her side on a new supportive pillow. On the right hand side she performs a 30-second fold test on her old pillow to see if it needs replacing]]></media:text>
                                <media:title type="plain"><![CDATA[Tom&#039;s Guide bedding expert Becky George lies on her side on a new supportive pillow. On the right hand side she performs a 30-second fold test on her old pillow to see if it needs replacing]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EsWowpHuqxiBUpFaRV8V53-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For me, a good night's sleep lays the foundation for a productive work day. But lately, I've been tossing and turning at night and my sleep quality has taken a direct hit. I had a hunch my <a href="https://www.tomsguide.com/best-picks/best-pillow">pillow</a> might have something to do it, so I decided to perform a simple test that instantly tells you whether your pillow needs replacing or not.</p><p>Sure enough, my pillow failed this basic 30-second test. </p><p>A pillow that has lost its support and shape will force you to wake up multiple times a night to replump and reshape it. Long-term, a pillow that has lost its support can throw your neck out of alignment, causing morning aches and pains and poor posture.</p><p>Here's what the 30-second test involves, how to perform it yourself, and what the results mean for your pillow and the <a href="https://www.tomsguide.com/wellness/sleep/sleep-quality--matters-more-than-quantity-says-new-study">quality of your sleep</a>.</p><h2 class="article-body__section" id="section-the-30-second-test-explained"><span>The 30-second test explained</span></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:2016px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WtZfrEbF7cJNNGeXPBK8PD" name="30 second pillow test" alt="Folding the pillow in half to check its level of support" src="https://cdn.mos.cms.futurecdn.net/WtZfrEbF7cJNNGeXPBK8PD-1920-80.jpg" mos="" align="middle" fullscreen="" width="2016" height="1134" 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 30-second pillow test is a simple way to find out if your pillow is supportive enough to hold your head, neck and shoulders in alignment with your spine while you sleep. </p><p>A pillow with an even fill distribution and good support will not fold easily. Instead it will snap back fast. This pillow is good for sleeping.</p><p>An unsupportive pillow, on the other hand, will not only fold, but also take time to spring back to its original position. This pillow needs replacing asap.</p><h2 id="how-to-perform-the-30-second-pillow-test">How to perform the 30-second pillow test</h2><ul><li>Remove the pillowcase or any other protectors.</li><li>Lay the pillow flat on a hard surface.</li><li>Fold it completely in half and hold it closed for 30 seconds.</li><li>Now release the pillow</li><li>If it stays folded or springs back sluggishly, the support has gone and your pillow is no longer fit for purpose.</li><li>If it snaps instantly back into shape, it’s still good for sleeping on.</li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEYwAe"></div>                            </div>                            <script src="https://kwizly.com/embed/eEYwAe.js" async></script><h2 class="article-body__section" id="section-why-my-pillow-failed-the-30-second-test"><span>Why my pillow failed the 30-second test</span></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:2016px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CMHbRg7VX9pyLLT6SiR8V7" name="30 second pillow test" alt="Folding a pillow in half to check its support" src="https://cdn.mos.cms.futurecdn.net/CMHbRg7VX9pyLLT6SiR8V7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2016" height="1134" 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>After several nights of broken sleep, I figured that it's time to put my pillow to the test. For reference, my microfiber pillow is over two years old and has overall lost its initial plushness. I laid it out on a flat surface and folded it in half. To my surprise, my pillow folded almost too easily, like a book. </p><p>Unlike newer supportive pillows, which instantly snap back, mine took longer to return to its original position. On further inspection, I figured that the filling inside was bunched up and uneven, giving a still-folded effect right in the middle. This made me realize that it's high time to <a href="https://www.tomsguide.com/wellness/mattresses/this-is-how-often-should-you-change-your-pillow-according-to-an-expert">replace it with another</a>. </p><h2 id="why-unsupportive-pillows-need-replacing">Why unsupportive pillows need replacing</h2><p>A sagging or unsupportive pillow compromises your <a href="https://www.tomsguide.com/wellness/sleep/sleep-positions">spinal alignment</a>. </p><p>In order to correct your posture, your neck ends up bending unnaturally, straining the muscles— the major reason behind <a href="https://www.tomsguide.com/mattresses/why-do-i-wake-with-neck-pain-every-morning-i-asked-a-chiropractor-to-help-with-my-sleep-woes">morning neck pain</a>. </p><p>It can also lead to frequent wake-ups and tossing and turning, as it happened in my case, where I was constantly trying to find the right sleeping position. </p><p>If you're someone who already <a href="https://www.tomsguide.com/mattresses/pillows-bedding/how-to-choose-a-pillow-for-snoring">struggles with snoring</a>, sleeping on an unsupportive pillow can also make your symptoms worse. </p><h2 class="article-body__section" id="section-other-signs-your-pillow-needs-replacing"><span>Other signs your pillow needs replacing</span></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:2121px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GSBgMf89ymWocNHTNkjkYW" name="Yellow stains on pillow and mattress.jpg" alt="Yellow stains on pillow and mattress" src="https://cdn.mos.cms.futurecdn.net/GSBgMf89ymWocNHTNkjkYW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2121" height="1193" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>While experts recommend changing your pillow every one to two years, you can do it sooner if you notice any of these secondary indicators. </p><p><strong>Clumping up of the filling is a strong indicator of a lack of support.</strong> Pillows with poor support can lead to those random <a href="https://www.tomsguide.com/wellness/sleep/stress-was-waking-me-up-at-3-a-m-until-two-of-the-worlds-best-sleep-doctors-shared-5-fast-fixes-to-lower-my-cortisol-at-night">3 a.m. wake-ups</a> because your head and neck fall out of alignment, and you wake to replump the pillow.</p><p><strong>Another common sign is the </strong><a href="https://www.tomsguide.com/wellness/mattresses/yellow-stains-on-mattress-and-pillow-causes-and-how-to-get-them-out"><strong>yellowing of your pillow</strong></a><strong>.</strong> This is due to a buildup of your sweat, body oils, drool and dead skin cells, which seeps through the pillowcase. Over time, this can create the perfect breeding ground for <a href="https://www.tomsguide.com/wellness/mattresses/how-to-get-rid-of-dust-mites-from-your-mattress-pillows-and-bedding">dust mites and bacteria</a>, even resulting in a musty, bad smell. </p><p>And no, <a href="https://www.tomsguide.com/how-to/how-to-wash-a-pillow">washing your pillow</a> might not solve the problem, especially if you've been using it for a long time. </p><p><strong>A constant need to re-fluff or plump your pillow</strong> also shows that it is not fit to provide you with the required comfort. </p><h2 class="article-body__section" id="section-what-to-look-for-in-a-new-pillow"><span>What to look for in a new pillow</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/9LPAY8n9jZBWeVKTYFzMGD-1920-80.jpg" alt="Woman sleeping on a white pillow with a purple tag on a bed with a rattan headboard" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>As a professional bedding tester, I'm aware of the fact that finding a comfy pillow among a sea of options is tricky. </p><p>The key is to first understand what your sleeping position (side, back and stomach) is and then choosing the right <a href="https://www.tomsguide.com/mattresses/pillows-bedding/pillow-loft">pillow loft</a> to support it. </p><p>Pillow loft is basically the height of your headrest. Lying on a pillow too low or too high for your sleeping position, once again, puts your neck muscles and spinal alignment at risk. This is why it's important to choose the <a href="https://www.tomsguide.com/wellness/mattresses/how-to-choose-the-right-pillow-for-your-sleep-position">right pillow for your sleeping position</a>. </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="NeRpvtMekMCKg2QEXPpD8h" name="Pillow Testing" alt="Pillow Testing- a stack of pillows in TG Sleep Studio" src="https://cdn.mos.cms.futurecdn.net/NeRpvtMekMCKg2QEXPpD8h-1920-80.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: Future)</span></figcaption></figure><p><a href="https://www.tomsguide.com/wellness/sleep/experts-love-this-sleeping-position-for-preventing-back-pain-and-for-sleeping-through-the-night-heres-why-and-how-to-do-it">Side sleepers</a> require a high to mid-loft pillow (4 to 6 inches) which effectively bridges the gap between your ear and your <a href="https://www.tomsguide.com/mattresses/best-mattress">mattress</a>. </p><p><a href="https://www.tomsguide.com/wellness/sleep/how-to-sleep-on-your-back">Back sleepers</a> need a low-loft pillow which is high enough to support your head, but keeps your chin in a neutral position. </p><p><a href="https://www.tomsguide.com/wellness/sleep/whats-so-bad-about-stomach-sleeping-expert-dishes-the-dirt-on-so-called-worst-sleeping-position-ever">Stomach sleeping</a> is the least recommended position, but if it's a force of habit, you need a low-loft, soft pillow, which prevents any further strain on your neck muscles. </p><p>If your priority is long-term durability and support, look for <a href="https://www.tomsguide.com/wellness/mattresses/what-are-pillows-made-of">pillows made of materials</a> like latex and high-quality memory foam, known to provide responsive comfort consistently. </p><p>Still confused? We've curated the <a href="https://www.tomsguide.com/best-picks/best-pillow">best pillows</a> guide, which includes options for every sleep position and concern. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Wnkd4O"></div>                            </div>                            <script src="https://kwizly.com/embed/Wnkd4O.js" async></script><h2 class="article-body__section" id="section-check-your-pillow-tonight"><span>Check your pillow tonight</span></h2><p>If you've been waking up several times during the night or struggling with morning neck pain, it's a good idea to check if your pillow is at fault. </p><p>All it takes is 30 seconds of your time. Simply fold your pillow, hold it for 30 seconds and observe how long it takes to return to its normal position. </p><p>This simple fold test can reveal if your pillow lacks the support you need to have an uninterrupted night's rest. </p><div data-model-name="Beckham Hotel Collection Gel Pillow,Nest Bedding Easy Breather Side Sleeper Pillow,Silentnight Anti-Allergy Pillow,Silentnight Airmax Pillow,Coop Home Goods Original Adjustable Pillow,Saatva Latex Pillow,Helix Sleep Talalay Latex Pillow,Leesa Pillow,Silentnight Firm Support Pillows,Emma Foam Pillow,Silentnight Cool Touch Pillow,Simba Hybrid Firm Pillow,Casper Pillow,Argos Home Supersoft Bounceback Firm Pillow,Dunelm Temperature Reactive Memory Foam Firm-Support Pillow" data-widget-type="multimodelreview" data-widget-title="Today's best prices on popular pillows"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Gary Oldman on 'Slow Horses' season 6: New and familiar faces to expect, including the return of Olivia Cooke ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><a data-analytics-id="inline-link" href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far"><strong>Read our "Slow Horses" season 6 review</strong></a></li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p>"Slow Horses" season 6 is coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> next week. But ahead of its September 16 premiere on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service,</a> I got a chance to sit in on a virtual press conference with the show's star (and probably the only person guaranteed to survive a given season), Sir Gary Oldman.</p><p>It was an enlightening exchange, not least of all because any conversation with Sir Gary is likely to be enlightening. But over the course of a half-hour, the legendary actor discussed what separates him from the odorous spymaster he plays on TV, what it's like to work with Olivia Cooke, Jack Lowden and the rest of the Slough House crew, and why it's so important to him that the show delivers a new season every year to its fans.</p><p>So, today, I wanted to bring you some of the more insightful comments from that conversation. Here's <strong>Gary Oldman on 'Slow Horses' season 6: New and familiar faces to expect, including the return of Olivia Cooke</strong>. And don't forget to check out our <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">spoiler-free review of "Slow Horses" season 6</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async></script><h2 id="gary-oldman-on-39-slow-horses-39-cast-39-it-39-s-like-a-big-family-39">Gary Oldman on 'Slow Horses' cast: 'It's like a big family'</h2><p>When asked if he missed playing Jackson Lamb, the head of Slough House in "Slow Horses," Gary Oldman quickly responded in a way seemingly uncharacteristic of the crotchety spy. He said it wasn't Lamb he missed, as much as it was all the people he gets to work with as Lamb each season.</p><div><blockquote><p>"As a new season gears up, and as my start date sort of nears, I get quite excited to think I'm going to get on the set again and see Saskia and see Jack, and Chris, and Aimee and Tom."</p><p>Sir Gary Oldman on the best part of playing Jackson Lamb</p></blockquote></div><p>"I tell you what I miss, really, in between the seasons," Oldman explained, "is I miss the sort of company and the camaraderie. The group of people that we've put together, with the cast and the crew over now six years, it's like a big family."</p><p>It seems the anticipation for these annual family reunions starts building quickly too. "As a new season gears up, and as my start date sort of nears, I get quite excited to think I'm going to get on the set again and see Saskia [Reeves] and see Jack [Lowden], and Chris [Chung], and Aimee [-Ffion Edwards] and Tom [Brooke]," he continued. "I think that that's been one of the things that has made it [filming] as enjoyable as it is over such a long period of time."</p><h2 id="39-we-were-thrilled-when-we-heard-that-sid-baker-was-coming-back-39">'We were thrilled when we heard that Sid Baker was coming back'</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:1501px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="oGCXbPaWCcwJ5HNqag9QAD" name="Slow_Horses_Photo_060302" alt="Olivia Cooke in "Slow Horses" season 6 on Apple TV" src="https://cdn.mos.cms.futurecdn.net/oGCXbPaWCcwJ5HNqag9QAD-1920-80.png" mos="" align="middle" fullscreen="" width="1501" height="844" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>In season 1 of "Slow Horses," Olivia Cooke quickly became a fan favorite as agent Sidonie "Sid" Baker. So it was quite shocking when, at the end of the season, she was shot in the head and presumed dead.</p><div><blockquote><p>"We loved Olivia. And thought she was so good in season one. So we were thrilled when we heard that Sid Baker was coming back." </p><p>Sir Gary Oldman on working with Olivia Cooke again</p></blockquote></div><p>Even more shocking was her sudden return in season 6. Not least of all because now she has her hands full with "House of the Dragon." According to Oldman, it seems like her return wasn't necessarily always in the cards.</p><p>"Well, for the longest time, we thought that Sid [Cooke] was dead," explains Oldman. "Then there were these rumors that she was coming back and that she wasn't dead, and we so we never really we never really knew for sure."</p><p>Things became more cemented, though, when Sid reappeared in Mick Herron's "Slough House" books. That's a creative decision Oldman seems to have no complaints about.</p><p>"We loved Olivia," Oldman continued, "and thought she was so good in season one. So we were thrilled when we heard that Sid Baker was coming back." </p><p>It seems that his character, Jackson Lamb, would have been thrilled too. "Lamb always had great—he had great respect for Sid," Oldman explained. "He thought Sid was a really good agent. In fact, she was, as you, as we know now, a plant. She was not a reject. She was put there specifically. So yeah, Lamb thinks that she's a good agent."</p><h2 id="on-newcomer-lenny-rush-39-he-39-s-an-interesting-challenge-for-jackson-lamb-39">On newcomer Lenny Rush: 'He's an interesting challenge for Jackson Lamb'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mZbJxpYHLuI" allowfullscreen></iframe></div></div><p>There, as always, are a few new faces to this season of "Slow Horses." But one of the most intriguing additions to the cast is Lenny Rush. The 17-year-old actor is a familiar face to British audiences, but an unknown to American audiences. He also represents a first for the show, as he'll be the first minor to play a major role in the spy thriller series.</p><div><blockquote><p>"I think he [Lamb] has respect because he [Rush] can give as good as he gets. So he's an interesting challenge for Jackson Lamb."</p><p>Sir Gary Oldman on working with newcomer Lenny Rush</p></blockquote></div><p>So, naturally, people had questions about his role in the upcoming season. Oldman, for his part, seemed to suggest that, despite his age, Rush can hang with these old washed up spie just fine.</p><p>"Well, he's really the key to unraveling all of this," Oldman explained. "Jackson Lamb, you know, being the great sort of detective that he is, realizes that he's [Rush] really may be the key to unlock all of this, but he's got no time for the snivelling old kid [Oldman lets out a laugh at this point]." </p><p>"So they have a very interesting combative relationship," Oldman continued. But I think he [Lamb] has respect because he [Rush] can give as good as he gets. So he's an interesting challenge for Jackson Lamb."</p><p>Having seen the season myself, Oldman frankly might be underselling the dynamic his character has with Rush on screen. So tune into the "Slow Horses" season 6 premiere to see these new and familiar faces back on your TV screen once more.</p><p><em></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></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/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-sept-7-13-2026">5 best new Netflix movies and shows to stream this week (Sept. 7-13)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/this-denzel-washington-and-russell-crowe-crime-drama-is-still-great-19-years-later-and-you-can-stream-it-for-free">This Denzel Washington and Russell Crowe crime drama is still great 19 years later — and you can stream it for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/gary-oldman-on-slow-horses-season-6-new-and-familiar-faces-to-expect-including-the-return-of-olivia-cooke</link>
                                                                            <description>
                            <![CDATA[ Sir Gary Oldman discusses new and familiar faces to expect in 'Slow Horses' season 6, including the return of Olivia Cooke, the arrival of Lenny Rush and more ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5Gn7p9Gf9mJkKjr6LAYR6b</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Uvxwz3K9QYbJTNeFcS6HtD-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/Uvxwz3K9QYbJTNeFcS6HtD-1920-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(L-R) Sir Gary Oldman and Olivia Cooke in &quot;Slow Horses&quot; season 6 on Apple TV]]></media:description>                                                            <media:text><![CDATA[(L-R) Sir Gary Oldman and Olivia Cooke in &quot;Slow Horses&quot; season 6 on Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[(L-R) Sir Gary Oldman and Olivia Cooke in &quot;Slow Horses&quot; season 6 on Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Uvxwz3K9QYbJTNeFcS6HtD-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><a data-analytics-id="inline-link" href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far"><strong>Read our "Slow Horses" season 6 review</strong></a></li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p>"Slow Horses" season 6 is coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> next week. But ahead of its September 16 premiere on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service,</a> I got a chance to sit in on a virtual press conference with the show's star (and probably the only person guaranteed to survive a given season), Sir Gary Oldman.</p><p>It was an enlightening exchange, not least of all because any conversation with Sir Gary is likely to be enlightening. But over the course of a half-hour, the legendary actor discussed what separates him from the odorous spymaster he plays on TV, what it's like to work with Olivia Cooke, Jack Lowden and the rest of the Slough House crew, and why it's so important to him that the show delivers a new season every year to its fans.</p><p>So, today, I wanted to bring you some of the more insightful comments from that conversation. Here's <strong>Gary Oldman on 'Slow Horses' season 6: New and familiar faces to expect, including the return of Olivia Cooke</strong>. And don't forget to check out our <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">spoiler-free review of "Slow Horses" season 6</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async></script><h2 id="gary-oldman-on-39-slow-horses-39-cast-39-it-39-s-like-a-big-family-39">Gary Oldman on 'Slow Horses' cast: 'It's like a big family'</h2><p>When asked if he missed playing Jackson Lamb, the head of Slough House in "Slow Horses," Gary Oldman quickly responded in a way seemingly uncharacteristic of the crotchety spy. He said it wasn't Lamb he missed, as much as it was all the people he gets to work with as Lamb each season.</p><div><blockquote><p>"As a new season gears up, and as my start date sort of nears, I get quite excited to think I'm going to get on the set again and see Saskia and see Jack, and Chris, and Aimee and Tom."</p><p>Sir Gary Oldman on the best part of playing Jackson Lamb</p></blockquote></div><p>"I tell you what I miss, really, in between the seasons," Oldman explained, "is I miss the sort of company and the camaraderie. The group of people that we've put together, with the cast and the crew over now six years, it's like a big family."</p><p>It seems the anticipation for these annual family reunions starts building quickly too. "As a new season gears up, and as my start date sort of nears, I get quite excited to think I'm going to get on the set again and see Saskia [Reeves] and see Jack [Lowden], and Chris [Chung], and Aimee [-Ffion Edwards] and Tom [Brooke]," he continued. "I think that that's been one of the things that has made it [filming] as enjoyable as it is over such a long period of time."</p><h2 id="39-we-were-thrilled-when-we-heard-that-sid-baker-was-coming-back-39">'We were thrilled when we heard that Sid Baker was coming back'</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:1501px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="oGCXbPaWCcwJ5HNqag9QAD" name="Slow_Horses_Photo_060302" alt="Olivia Cooke in "Slow Horses" season 6 on Apple TV" src="https://cdn.mos.cms.futurecdn.net/oGCXbPaWCcwJ5HNqag9QAD-1920-80.png" mos="" align="middle" fullscreen="" width="1501" height="844" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>In season 1 of "Slow Horses," Olivia Cooke quickly became a fan favorite as agent Sidonie "Sid" Baker. So it was quite shocking when, at the end of the season, she was shot in the head and presumed dead.</p><div><blockquote><p>"We loved Olivia. And thought she was so good in season one. So we were thrilled when we heard that Sid Baker was coming back." </p><p>Sir Gary Oldman on working with Olivia Cooke again</p></blockquote></div><p>Even more shocking was her sudden return in season 6. Not least of all because now she has her hands full with "House of the Dragon." According to Oldman, it seems like her return wasn't necessarily always in the cards.</p><p>"Well, for the longest time, we thought that Sid [Cooke] was dead," explains Oldman. "Then there were these rumors that she was coming back and that she wasn't dead, and we so we never really we never really knew for sure."</p><p>Things became more cemented, though, when Sid reappeared in Mick Herron's "Slough House" books. That's a creative decision Oldman seems to have no complaints about.</p><p>"We loved Olivia," Oldman continued, "and thought she was so good in season one. So we were thrilled when we heard that Sid Baker was coming back." </p><p>It seems that his character, Jackson Lamb, would have been thrilled too. "Lamb always had great—he had great respect for Sid," Oldman explained. "He thought Sid was a really good agent. In fact, she was, as you, as we know now, a plant. She was not a reject. She was put there specifically. So yeah, Lamb thinks that she's a good agent."</p><h2 id="on-newcomer-lenny-rush-39-he-39-s-an-interesting-challenge-for-jackson-lamb-39">On newcomer Lenny Rush: 'He's an interesting challenge for Jackson Lamb'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mZbJxpYHLuI" allowfullscreen></iframe></div></div><p>There, as always, are a few new faces to this season of "Slow Horses." But one of the most intriguing additions to the cast is Lenny Rush. The 17-year-old actor is a familiar face to British audiences, but an unknown to American audiences. He also represents a first for the show, as he'll be the first minor to play a major role in the spy thriller series.</p><div><blockquote><p>"I think he [Lamb] has respect because he [Rush] can give as good as he gets. So he's an interesting challenge for Jackson Lamb."</p><p>Sir Gary Oldman on working with newcomer Lenny Rush</p></blockquote></div><p>So, naturally, people had questions about his role in the upcoming season. Oldman, for his part, seemed to suggest that, despite his age, Rush can hang with these old washed up spie just fine.</p><p>"Well, he's really the key to unraveling all of this," Oldman explained. "Jackson Lamb, you know, being the great sort of detective that he is, realizes that he's [Rush] really may be the key to unlock all of this, but he's got no time for the snivelling old kid [Oldman lets out a laugh at this point]." </p><p>"So they have a very interesting combative relationship," Oldman continued. But I think he [Lamb] has respect because he [Rush] can give as good as he gets. So he's an interesting challenge for Jackson Lamb."</p><p>Having seen the season myself, Oldman frankly might be underselling the dynamic his character has with Rush on screen. So tune into the "Slow Horses" season 6 premiere to see these new and familiar faces back on your TV screen once more.</p><p><em></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></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/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-sept-7-13-2026">5 best new Netflix movies and shows to stream this week (Sept. 7-13)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/this-denzel-washington-and-russell-crowe-crime-drama-is-still-great-19-years-later-and-you-can-stream-it-for-free">This Denzel Washington and Russell Crowe crime drama is still great 19 years later — and you can stream it for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget sit-ups — the dying turtle is my new favorite core exercise, here’s how to do it ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/how-to/how-to-do-a-deadbug">dead bug</a> is a great core exercise that builds both strength and endurance in your midsection while being approachable to most fitness levels. It’s a hard move to improve on, in fact, but it turns out the best way to upgrade a dead bug is to move onto bigger creatures.</p><p>I’d never heard of the dying turtle until a few weeks ago, when I did the move as part of attempting a <a href="https://www.tomsguide.com/wellness/workouts/i-tried-a-pro-runners-12-minute-core-workout-heres-what-happened">pro runner’s 12-minute core workout</a>. While I love turtles and the idea of them dying fills me with sadness, I immediately marked the exercise down as one to include in future workouts. It's also known as the dead bug press, which is a slightly less horrifying name.</p><p>That’s because it builds on the benefits of the dead bug by making the move more challenging. As an obsessive runner I’m always looking for moves that boost core endurance, which helps me to maintain my running form deep into long events like marathons, and if they work one side of the body at a time then all the better.</p><p>The dying turtle fits the bill perfectly, and I think it’s an especially good core move for runners and other sportspeople as a result, but really almost anyone can benefit from adding it to their training routine.</p><h3 class="article-body__section" id="section-how-to-do-the-dying-turtle"><span> How to do the dying turtle</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/eJREbBDjNSU" allowfullscreen></iframe></div></div><p>The dying turtle is a floor that you do while lying on your back, so if you might want to roll out one of the<a href="https://www.tomsguide.com/best-picks/best-yoga-mats"> best yoga mats</a> to do it. In the video above you can see it demonstrated by Brian Kinslow, Doctor of Physical Therapy at Evolve Flagstaff.</p><ol start="1"><li>Lie back on the floor and press your lower back into the floor — think about pulling your belly into your spine to help with this, and keep your lower back on the floor throughout the move.</li><li>Bring your knees up into tabletop position and raise your arms above you.</li><li>Firmly push on your left knee with your right hand — resist this push with your knee so it stays in tabletop position.</li><li>Keep pushing as you lower your left arm behind you and extend your right leg out in front so both limbs are hovering just above the floor.</li><li>Bring both limbs back up, then lower them again. Do 5-10 reps on this side, then switch and do the same on the opposite side, or work to time, doing 20-30 seconds on each side.</li></ol><p>I found that pushing on one knee while you lower the opposite limbs really engages your core during the movement and forces you to hold a tough position while moving, making the dying turtle a great progression for those comfortable with dead bugs. </p><p>It’s important to keep your lower back imprinted on the floor throughout the move, so if you feel it starting to lift up, then you might need to shorten the reach of the arm and leg that you’re lowering.</p><h3 class="article-body__section" id="section-benefits-of-the-dying-turtle"><span>Benefits of the dying turtle</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:1615px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="dSpCX2AQLeTQqg24hNAqnC" name="heel touches 2.jpg" alt="Woman outdoors in sunshine in a sports bra with her abs on show" src="https://cdn.mos.cms.futurecdn.net/dSpCX2AQLeTQqg24hNAqnC-1920-80.jpg" mos="" align="middle" fullscreen="" width="1615" height="908" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty/jacoblund)</span></figcaption></figure><p>Like the dead bug, the dying turtle works pretty much all the muscles in your core, including the deep stabilizing muscles. The upper and lower abs are engaged by the move, as well as the obliques, and it also targets the hip flexors.</p><p>Along with strengthening the target muscles, it also helps to build endurance because you are holding the engaged position by pushing your hand into your knee while moving.</p><p>I find that the move also exhausts my core muscles much more quickly than just doing dead bugs, making it more time efficient — doing 20 seconds on each side is enough to get my muscles burning when doing the dying turtle.</p><p>The act of pushing on your knee also makes you engage more with the exercise in general I find, and it means I stay focused on pushing my lower back into the floor. With dead bugs I can get a bit complacent about this and fail to spot I've lifted my back up.</p><p>It is a more challenging move than the dead bug, but you can easily switch back to the dead bug from the dying turtle by releasing the pressure on your knee, so it's a move that I think anyone can try, so give it a go in your next core workout.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OoNbJW"></div>                            </div>                            <script src="https://kwizly.com/embed/OoNbJW.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/wellness/smartwatches/i-wear-an-apple-watch-every-single-day-and-i-never-knew-you-could-do-this">‘I wear an Apple Watch every single day, and I never knew you could do this.’</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-wear-an-apple-watch-every-day-and-this-is-the-free-app-i-use-all-of-the-time">I wear an Apple Watch every day, and this is the free app I use all of the time</a></li><li><a href="https://www.tomsguide.com/wellness/fitness/too-busy-to-work-out-i-added-thousands-of-steps-to-my-day-using-this-simple-trick">Forget running — I added thousands of steps to my day using this simple trick</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/wellness/workouts/forget-sit-ups-the-dying-turtle-is-my-new-favorite-core-exercise-heres-how-to-do-it</link>
                                                                            <description>
                            <![CDATA[ The dying turtle is a challenging progression on the dead bug exercise, and it’s a great way to build core strength and endurance. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">QSypMcx9crHXvSiXZikczW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oMGKWccN8Wg5zrK2GXcyG8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 10:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 10 Sep 2026 11:25:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Workouts]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nick Harris-Fry ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/J5Jjp49GUVjLZEbjEkTex-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick has been a journalist since 2012 and has spent most of that time writing about health and fitness for a variety of publications. Nick spent nine years working on the Coach magazine and website before moving to the fitness team at Tom’s Guide in 2024. Nick is a keen runner and also the founder of YouTube channel &lt;a href=&quot;https://www.youtube.com/channel/UCOBM9FasII4dKbyE_HKkbjw&quot;&gt;The Run Testers&lt;/a&gt;, which specialises in reviewing running shoes, watches, headphones and other gear.&lt;/p&gt;&lt;p&gt;Nick has covered all aspects of health and fitness throughout his career, interviewing experts and celebrities, trying fitness classes and running marathons, all in the name of providing readers with the information they need to get the most out of an active lifestyle.&lt;/p&gt;&lt;p&gt;Nick ran his first marathon in 2016 after six weeks of training for a magazine feature and subsequently became obsessed with the sport. He now has PBs of 2hr 25min for the marathon and 15min 30sec for 5K, and has run 16 marathons in total, as well as a 50-mile ultramarathon.&lt;/p&gt;&lt;p&gt;Nick runs 60-90 miles a week and races regularly with his club, which gives him a lot of opportunity to test out running gear: he has tested and reviewed hundreds of pairs of running shoes, as well as fitness trackers, running watches, sports headphones, treadmills, and all manner of other kit. Nick is also a qualified Run Leader in the UK.&lt;/p&gt;&lt;p&gt;Nick is an established expert in the health and fitness area and along with writing for several publications, including &lt;a href=&quot;https://www.livescience.com/author/nick-harris-fry&quot;&gt;Live Science&lt;/a&gt;, &lt;a href=&quot;https://www.expertreviews.co.uk/authors/nick-harris-fry&quot;&gt;Expert Reviews&lt;/a&gt;, &lt;a href=&quot;https://www.wareable.com/author/n.harris-fry&quot;&gt;Wareable&lt;/a&gt;, &lt;a href=&quot;https://www.coachweb.com/author/nick-harris-fry&quot;&gt;Coach&lt;/a&gt; and &lt;a href=&quot;https://www.getsweatgo.com/author/n.harrisfry&quot;&gt;Get Sweat Go&lt;/a&gt;, he has been quoted on &lt;a href=&quot;https://www.theguardian.com/thefilter/2024/oct/20/if-you-pay-more-than-4-youre-being-ripped-off-the-fair-price-for-14-everyday-items-from-cleaning-spray-to-olive-oil&quot;&gt;The Guardian&lt;/a&gt; and &lt;a href=&quot;https://www.independent.co.uk/life-style/health-and-families/london-marathon-2021-date-training-tips-summer-running-a9482486.html&quot;&gt;The Independent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Nick graduated from the University of York in 2010 with a degree in Politics, Philosophy and Economics and worked in the NHS for three years, during which time he completed his NCTJ Diploma in Journalism at News Associates in London. Before starting on Coach and moving into health and fitness, Nick worked as a football journalist and lived in Kathmandu, Nepal for two years.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/oMGKWccN8Wg5zrK2GXcyG8-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a woman doing a dead bug]]></media:description>                                                            <media:text><![CDATA[a woman doing a dead bug]]></media:text>
                                <media:title type="plain"><![CDATA[a woman doing a dead bug]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oMGKWccN8Wg5zrK2GXcyG8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/how-to/how-to-do-a-deadbug">dead bug</a> is a great core exercise that builds both strength and endurance in your midsection while being approachable to most fitness levels. It’s a hard move to improve on, in fact, but it turns out the best way to upgrade a dead bug is to move onto bigger creatures.</p><p>I’d never heard of the dying turtle until a few weeks ago, when I did the move as part of attempting a <a href="https://www.tomsguide.com/wellness/workouts/i-tried-a-pro-runners-12-minute-core-workout-heres-what-happened">pro runner’s 12-minute core workout</a>. While I love turtles and the idea of them dying fills me with sadness, I immediately marked the exercise down as one to include in future workouts. It's also known as the dead bug press, which is a slightly less horrifying name.</p><p>That’s because it builds on the benefits of the dead bug by making the move more challenging. As an obsessive runner I’m always looking for moves that boost core endurance, which helps me to maintain my running form deep into long events like marathons, and if they work one side of the body at a time then all the better.</p><p>The dying turtle fits the bill perfectly, and I think it’s an especially good core move for runners and other sportspeople as a result, but really almost anyone can benefit from adding it to their training routine.</p><h3 class="article-body__section" id="section-how-to-do-the-dying-turtle"><span> How to do the dying turtle</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/eJREbBDjNSU" allowfullscreen></iframe></div></div><p>The dying turtle is a floor that you do while lying on your back, so if you might want to roll out one of the<a href="https://www.tomsguide.com/best-picks/best-yoga-mats"> best yoga mats</a> to do it. In the video above you can see it demonstrated by Brian Kinslow, Doctor of Physical Therapy at Evolve Flagstaff.</p><ol start="1"><li>Lie back on the floor and press your lower back into the floor — think about pulling your belly into your spine to help with this, and keep your lower back on the floor throughout the move.</li><li>Bring your knees up into tabletop position and raise your arms above you.</li><li>Firmly push on your left knee with your right hand — resist this push with your knee so it stays in tabletop position.</li><li>Keep pushing as you lower your left arm behind you and extend your right leg out in front so both limbs are hovering just above the floor.</li><li>Bring both limbs back up, then lower them again. Do 5-10 reps on this side, then switch and do the same on the opposite side, or work to time, doing 20-30 seconds on each side.</li></ol><p>I found that pushing on one knee while you lower the opposite limbs really engages your core during the movement and forces you to hold a tough position while moving, making the dying turtle a great progression for those comfortable with dead bugs. </p><p>It’s important to keep your lower back imprinted on the floor throughout the move, so if you feel it starting to lift up, then you might need to shorten the reach of the arm and leg that you’re lowering.</p><h3 class="article-body__section" id="section-benefits-of-the-dying-turtle"><span>Benefits of the dying turtle</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:1615px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="dSpCX2AQLeTQqg24hNAqnC" name="heel touches 2.jpg" alt="Woman outdoors in sunshine in a sports bra with her abs on show" src="https://cdn.mos.cms.futurecdn.net/dSpCX2AQLeTQqg24hNAqnC-1920-80.jpg" mos="" align="middle" fullscreen="" width="1615" height="908" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty/jacoblund)</span></figcaption></figure><p>Like the dead bug, the dying turtle works pretty much all the muscles in your core, including the deep stabilizing muscles. The upper and lower abs are engaged by the move, as well as the obliques, and it also targets the hip flexors.</p><p>Along with strengthening the target muscles, it also helps to build endurance because you are holding the engaged position by pushing your hand into your knee while moving.</p><p>I find that the move also exhausts my core muscles much more quickly than just doing dead bugs, making it more time efficient — doing 20 seconds on each side is enough to get my muscles burning when doing the dying turtle.</p><p>The act of pushing on your knee also makes you engage more with the exercise in general I find, and it means I stay focused on pushing my lower back into the floor. With dead bugs I can get a bit complacent about this and fail to spot I've lifted my back up.</p><p>It is a more challenging move than the dead bug, but you can easily switch back to the dead bug from the dying turtle by releasing the pressure on your knee, so it's a move that I think anyone can try, so give it a go in your next core workout.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OoNbJW"></div>                            </div>                            <script src="https://kwizly.com/embed/OoNbJW.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/wellness/smartwatches/i-wear-an-apple-watch-every-single-day-and-i-never-knew-you-could-do-this">‘I wear an Apple Watch every single day, and I never knew you could do this.’</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-wear-an-apple-watch-every-day-and-this-is-the-free-app-i-use-all-of-the-time">I wear an Apple Watch every day, and this is the free app I use all of the time</a></li><li><a href="https://www.tomsguide.com/wellness/fitness/too-busy-to-work-out-i-added-thousands-of-steps-to-my-day-using-this-simple-trick">Forget running — I added thousands of steps to my day using this simple trick</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Movie lovers, can you name these '80s sci-fi horrors from just their main hero or heroine — from Ripley to MacReady? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Heavy rain coated the windows of my granny's house the night she let my brother and me watch "Gremlins" on VHS for the first time. It was Christmas, so the rainbow lights on the tree helped us feel braver than we were while watching this movie that was almost certainly too scary. She had an old fan heater on the upstairs landing that would sporadically clank and glow a little, making my imagination run wild that night. And I've loved the movie ever since.</p><p>The 1980s brought about all manner of scary sci-fi movies — some absurd, many thrilling, others haunting to this day. If you're a fellow movie lover, take my quiz below to see how many films from this genre you can name purely from the hero or heroine.</p><div style="min-height: 1300px;">                                <div class="kwizly-quiz kwizly-Xm8J8O"></div>                            </div>                            <script src="https://kwizly.com/embed/Xm8J8O.js" async></script><iframe title="How'd you do?" description="Too hard? Too easy? Let us know what you think in the comments." minimumCommentCount="0" class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>How did you do this time? Too hard? Too easy? Did I miss one of your favorites? Let us know in the comments below.</p><p>I hope I didn't scare you too much with some of the film stills from these classic '80s sci-fi horror movies — and that, perhaps, you might even have some fresh movie night inspiration. </p><p>Don't forget to register on our quizzes, games and polls platform, Kwizly, to save your score, reveal hints, and secure your spot on the competitive Tom's Guide leaderboard, and see the <a href="https://www.tomsguide.com/tag/polls">results of our polls</a> in real-time.</p><p>If you enjoyed this quiz, then please bookmark our <a href="https://www.tomsguide.com/tag/quiz">Quiz</a> section and visit our <a href="https://www.tomsguide.com/polls">Polls page</a> to have your say on all manner of topics, from the best Hollywood movies to the latest Apple releases.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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/entertainment/streaming/classic-sitcom-fans-take-our-quiz-to-spot-the-fake-episodes-from-the-real-ones-from-friends-to-fonzie">Classic sitcom fans, take our quiz to spot the fake episodes from the real ones — from ‘Friends’ to Fonzie</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/i-created-an-ultra-hard-movie-tagline-quiz-only-true-movie-buffs-will-get-a-10-10">I created an ultra-hard movie tagline quiz — only true film buffs will get a 10/10</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/how-well-do-you-know-80s-thriller-movies-take-this-quiz-on-iconic-films-starring-harrison-ford-nicole-kidman-al-pacino-and-more">How well do you know ‘80s thriller movies? Take this quiz on iconic films starring Harrison Ford, Nicole Kidman, Al Pacino and more</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/movies/movie-lovers-can-you-name-these-80s-sci-fi-horrors-from-just-their-main-hero-or-heroine-from-ripley-to-macready</link>
                                                                            <description>
                            <![CDATA[ How well do you know 80s sci-fi thrillers? Take the Tom’s Guide quiz to name 7 classic movies from a single photo of their heroes ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xJw6MFbWSfXUTo5dDydcv3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wKgR5SXGTXsivWZjiGzChK-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 10 Sep 2026 10:51:09 +0000</updated>
                                                                                                                                            <category><![CDATA[Movies]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ ella.taylor@futurenet.com (Ella Taylor) ]]></author>                    <dc:creator><![CDATA[ Ella Taylor ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/W2nC7HFA6avQHdFNFbFPNa-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Ella is Tom’s Guide’s Engagement Editor, on a mission to get to know all about our readers, to help you with your burning questions, and to create an exciting mix of content that entices you to keep coming back to the site – whether you’re a regular reader or a &lt;a href=&quot;https://www.tomsguide.com/membership&quot;&gt;member&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;She has more than 15 years of editorial experience, graduating from Kingston University with a First Class Honours degree in Journalism in 2008. She has written for and edited magazines and websites, including fellow Future titles &lt;em&gt;TechRadar.com, CreativeBloq.com, Digital Camera magazine, NPhoto, BikeRadar.com, Mollie Makes&lt;/em&gt; and more. &lt;/p&gt;&lt;p&gt;Most recently, she was Managing Editor of &lt;em&gt;womanandhome.com&lt;/em&gt;, where she co-launched its &lt;a href=&quot;https://www.womanandhome.com/tag/quiz/&quot; target=&quot;_blank&quot;&gt;Quiz of the Day&lt;/a&gt; and led the charge for articles that actively asked readers for their views. Before that, she was Editor of professional photography website &lt;em&gt;canon-europe.com/pro&lt;/em&gt;, having worked her way up from Production Editor. As such, she&#039;s a stickler for fact-checking, has too many opinions about grammar and is easily excited by a beautiful photo.&lt;/p&gt;&lt;p&gt;A mum of two young children, she keeps fit by typically carrying at least one of them on her shoulders around the hilly streets of Bristol. When not chasing her sons around the play parks and soft plays of South West England and worshipping her three rescue cats, she&#039;s likely to be in the garden, steadily turning it from a neglected concrete jungle to a usable green space. She’s also finally embarking on a kitchen extension in May, so 2026 looks set to be a year of big home improvements and lots of builders’ tea.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/wKgR5SXGTXsivWZjiGzChK-1920-80.jpg">
                                                            <media:credit><![CDATA[Alamy]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A split image shows three main characters from famous 80s sci-fi horror movies, and a &#039;Tom&#039;s Guide Quiz&#039; logo overlaid]]></media:description>                                                            <media:text><![CDATA[A split image shows three main characters from famous 80s sci-fi horror movies, and a &#039;Tom&#039;s Guide Quiz&#039; logo overlaid]]></media:text>
                                <media:title type="plain"><![CDATA[A split image shows three main characters from famous 80s sci-fi horror movies, and a &#039;Tom&#039;s Guide Quiz&#039; logo overlaid]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wKgR5SXGTXsivWZjiGzChK-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Heavy rain coated the windows of my granny's house the night she let my brother and me watch "Gremlins" on VHS for the first time. It was Christmas, so the rainbow lights on the tree helped us feel braver than we were while watching this movie that was almost certainly too scary. She had an old fan heater on the upstairs landing that would sporadically clank and glow a little, making my imagination run wild that night. And I've loved the movie ever since.</p><p>The 1980s brought about all manner of scary sci-fi movies — some absurd, many thrilling, others haunting to this day. If you're a fellow movie lover, take my quiz below to see how many films from this genre you can name purely from the hero or heroine.</p><div style="min-height: 1300px;">                                <div class="kwizly-quiz kwizly-Xm8J8O"></div>                            </div>                            <script src="https://kwizly.com/embed/Xm8J8O.js" async></script><iframe title="How'd you do?" description="Too hard? Too easy? Let us know what you think in the comments." minimumCommentCount="0" class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>How did you do this time? Too hard? Too easy? Did I miss one of your favorites? Let us know in the comments below.</p><p>I hope I didn't scare you too much with some of the film stills from these classic '80s sci-fi horror movies — and that, perhaps, you might even have some fresh movie night inspiration. </p><p>Don't forget to register on our quizzes, games and polls platform, Kwizly, to save your score, reveal hints, and secure your spot on the competitive Tom's Guide leaderboard, and see the <a href="https://www.tomsguide.com/tag/polls">results of our polls</a> in real-time.</p><p>If you enjoyed this quiz, then please bookmark our <a href="https://www.tomsguide.com/tag/quiz">Quiz</a> section and visit our <a href="https://www.tomsguide.com/polls">Polls page</a> to have your say on all manner of topics, from the best Hollywood movies to the latest Apple releases.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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/entertainment/streaming/classic-sitcom-fans-take-our-quiz-to-spot-the-fake-episodes-from-the-real-ones-from-friends-to-fonzie">Classic sitcom fans, take our quiz to spot the fake episodes from the real ones — from ‘Friends’ to Fonzie</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/i-created-an-ultra-hard-movie-tagline-quiz-only-true-movie-buffs-will-get-a-10-10">I created an ultra-hard movie tagline quiz — only true film buffs will get a 10/10</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/how-well-do-you-know-80s-thriller-movies-take-this-quiz-on-iconic-films-starring-harrison-ford-nicole-kidman-al-pacino-and-more">How well do you know ‘80s thriller movies? Take this quiz on iconic films starring Harrison Ford, Nicole Kidman, Al Pacino and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I write about AI for a living and these are 3 things I'd never let it plan for me (and 3 I would) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There are always those instances where I come across the kind of stories that remind me that AI shouldn’t be the final decision for a lot of things.</p><p>Imagine my shock and awe when I came across a <a href="https://techcrunch.com/2026/09/05/hikers-rescued-after-using-google-gemini-for-planning/" target="_blank">report</a> about three inexperienced hikers heavily relying on Gemini’s advice about trekking up Mount Shasta in California and needing to be saved because of it. Google’s AI assistant advised the trio to bring way less food and water than they actually needed, which turned their eight-hour expedition into a multi-day excursion that led to more suffering than celebrating.</p><p>Reading that terrifying piece of news reminded me of something my AI-savvy friend told me when I first started diving into everything ChatGPT, Gemini, Claude and Perplexity have to offer: “You can use it to help you plan things here and there, but you should always rely on your own intelligence and savvy to make the final decision on what to do.”</p><p>With that in mind, here are the three sorts of events I’ll never completely rely on to plan and three events I’ll never have any issue letting AI assist me with planning.</p><h2 id="3-events-i-d-never-let-ai-arrange-for-me">3 events I’d never let AI arrange for me</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="7ELLQEKNhexK3bBAYaDjUN" name="shutterstock_2499766279-16x9" alt="hiking" src="https://cdn.mos.cms.futurecdn.net/7ELLQEKNhexK3bBAYaDjUN-1920-80.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>Right from the bat, I know that I’d never let AI completely plan any sort of outdoor experience that could lead me into a situation where I could be fighting for my survival. </p><p>AI is great for helping me research the sort of questions I should ask park service rangers and experienced professional hiking guides, plus the <a href="https://www.alltrails.com/press/introducing-alltrails-in-chatgpt">AllTrails plugin</a> for ChatGPT is great for getting endorsements for the best verified trails. But I’ll never solely use AI to be the authority for wilderness treks, including mountain climbs, camping, river crossings and other weather-dependent expeditions. I’ll rely on human assistance when I’m looking to be as careful as possible when I want to head outside for some risky adventures.</p><p>When it comes to my physical well-being, I never revert to AI to get the final answer on what to do in certain situations. <a href="https://openai.com/index/introducing-chatgpt-health/" target="_blank">ChatGPT Health</a> exists to let users utilize their health information with the chatbot to get a better grasp of their overall wellness by asking questions. That’s fine and all, but I’d never tap into ChatGPT and comparable AI tools to get the final word on finding out what I should do from a medical standpoint. I may ask AI to give me the sort of questions I should present to a medical professional or explain complex terminology, but I’ll never ask it to tell me to decide what surgery I should get for a certain injury, for example.</p><p>As for major financial decisions, that’s something else I’d never rely on AI to help me plan. The fear of believing a chatbot’s financial advice that’s nothing more than a hallucination that results in me losing tons of money scares me half to death. Blindly following AI’s advice about buying a home, starting a business, investing, etc. just isn’t the way to go — asking questions about the pros and cons of those financial decisions is fine, but using AI as the end-all, be-all for future monetary choices just isn’t the way to go. I’m totally okay with asking AI to give me the sort of questions I should consider before making such a massive economic decision, though.</p><h2 id="3-activities-i-39-d-always-use-ai-to-help-plan-for-me">3 activities I'd always use AI to help plan for me</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="2zj3XdFHwKS3MqZZ2kKcmX" name="shutterstock_2100754390-16x9" alt="surprise party" src="https://cdn.mos.cms.futurecdn.net/2zj3XdFHwKS3MqZZ2kKcmX-1920-80.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>With so many ChatGPT plugins catered towards helping users plan and book vacations, I’ve gotten accustomed to using OpenAI’s chatbot and comparable AI tools to help me plan vacations. Relying on AI to build a day-by-day itinerary, finding the best attractions based on my hobbies & interests and coming up with rainy-day alternatives are among the trip-planning activities I’m fine with AI helping me plan. Once I’ve gotten all the best recommendations for my future getaway from AI, I always make sure to do my own research to see if all of the info can be verified before I hop on a plane.</p><p>I’ll admit to not being the best party planner — I usually let someone else be responsible for that and handle the gift-giving portion of festivities. Lately, I’ve gotten used to tapping into Gemini to help me come up with the best venues, gift recommendations, clever decorations, music playlists and homemade menus to consider when planning a celebratory gathering. Once a BBQ-centric holiday like the Fourth of July, Labor Day or someone’s summer birthday rolls around, I’ll set up some plans with AI, share them with whoever else is part of the planning group and go from there.</p><p>If you’ve been following my AI writing up until this point, you’ve probably noticed that my 2026 revolves around the word “productivity.” ChatGPT in particular has supplied me with a wealth of personal productivity routines that I’ve used to plan my workdays. AI has risen to the occasion to help me set up a realistic to-do list, break up my work sessions into physical- & mental-amplifying exercises and find the best ways to wind down once the evening hours roll through. AI tools have definitely helped me get more work done, stay healthy and stay sane whenever I’ve used them to produce a productivity regimen.</p><h2 id="final-thoughts-5">Final thoughts</h2><p>I always keep this system in place for certain situations when I consider having AI help me set something up: let AI take the lead for low-stakes situations, let AI assist & help me verify certain bits of information for medium-stakes events and let AI assist & rely on more accomplished individuals to give me the answers I need for more high-stakes decisions. </p><p>I’ll have no issue letting Gemini help me plan a weekend sci-fi movie marathon, but I’ll never ask it to help me get out of a major legal situation. Having an AI hallucination resulting in me being behind bars is something I never want to happen…</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/home/coffee-makers/i-just-tried-the-worlds-first-ai-espresso-machine-im-a-coffee-snob-and-it-was-surprisingly-good" target="_blank"><strong>I just tried the world’s first AI espresso machine — I'm a coffee snob, and it was surprisingly... good?</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/people-are-using-custom-apps-and-usd30-gadgets-to-hunt-for-smart-glasses-that-may-be-filming-them-heres-how" target="_blank"><strong>People are using custom apps and $30 gadgets to hunt for smart glasses that may be filming them—here's how</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-claude-and-perplexity-to-rank-the-10-jobs-most-likely-to-be-replaced-by-ai-heres-what-they-all-agreed-on" target="_blank"><strong>I asked ChatGPT, Gemini, Claude and Perplexity to rank the 10 jobs most likely to be replaced by AI — here's what they all agreed on</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-write-about-ai-for-a-living-and-these-are-3-things-id-never-let-it-plan-for-me-and-3-i-would</link>
                                                                            <description>
                            <![CDATA[ There are three situations I’d have no problem having AI help me carefully orchestrate and three situations I’d never solely rely on AI to plan for me. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ojeDwnTg6NhphmhHYLwwNC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ByUKf6V6P4GtcSf8BLik3D-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ByUKf6V6P4GtcSf8BLik3D-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[chatgpt]]></media:description>                                                            <media:text><![CDATA[chatgpt]]></media:text>
                                <media:title type="plain"><![CDATA[chatgpt]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ByUKf6V6P4GtcSf8BLik3D-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There are always those instances where I come across the kind of stories that remind me that AI shouldn’t be the final decision for a lot of things.</p><p>Imagine my shock and awe when I came across a <a href="https://techcrunch.com/2026/09/05/hikers-rescued-after-using-google-gemini-for-planning/" target="_blank">report</a> about three inexperienced hikers heavily relying on Gemini’s advice about trekking up Mount Shasta in California and needing to be saved because of it. Google’s AI assistant advised the trio to bring way less food and water than they actually needed, which turned their eight-hour expedition into a multi-day excursion that led to more suffering than celebrating.</p><p>Reading that terrifying piece of news reminded me of something my AI-savvy friend told me when I first started diving into everything ChatGPT, Gemini, Claude and Perplexity have to offer: “You can use it to help you plan things here and there, but you should always rely on your own intelligence and savvy to make the final decision on what to do.”</p><p>With that in mind, here are the three sorts of events I’ll never completely rely on to plan and three events I’ll never have any issue letting AI assist me with planning.</p><h2 id="3-events-i-d-never-let-ai-arrange-for-me">3 events I’d never let AI arrange for me</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="7ELLQEKNhexK3bBAYaDjUN" name="shutterstock_2499766279-16x9" alt="hiking" src="https://cdn.mos.cms.futurecdn.net/7ELLQEKNhexK3bBAYaDjUN-1920-80.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>Right from the bat, I know that I’d never let AI completely plan any sort of outdoor experience that could lead me into a situation where I could be fighting for my survival. </p><p>AI is great for helping me research the sort of questions I should ask park service rangers and experienced professional hiking guides, plus the <a href="https://www.alltrails.com/press/introducing-alltrails-in-chatgpt">AllTrails plugin</a> for ChatGPT is great for getting endorsements for the best verified trails. But I’ll never solely use AI to be the authority for wilderness treks, including mountain climbs, camping, river crossings and other weather-dependent expeditions. I’ll rely on human assistance when I’m looking to be as careful as possible when I want to head outside for some risky adventures.</p><p>When it comes to my physical well-being, I never revert to AI to get the final answer on what to do in certain situations. <a href="https://openai.com/index/introducing-chatgpt-health/" target="_blank">ChatGPT Health</a> exists to let users utilize their health information with the chatbot to get a better grasp of their overall wellness by asking questions. That’s fine and all, but I’d never tap into ChatGPT and comparable AI tools to get the final word on finding out what I should do from a medical standpoint. I may ask AI to give me the sort of questions I should present to a medical professional or explain complex terminology, but I’ll never ask it to tell me to decide what surgery I should get for a certain injury, for example.</p><p>As for major financial decisions, that’s something else I’d never rely on AI to help me plan. The fear of believing a chatbot’s financial advice that’s nothing more than a hallucination that results in me losing tons of money scares me half to death. Blindly following AI’s advice about buying a home, starting a business, investing, etc. just isn’t the way to go — asking questions about the pros and cons of those financial decisions is fine, but using AI as the end-all, be-all for future monetary choices just isn’t the way to go. I’m totally okay with asking AI to give me the sort of questions I should consider before making such a massive economic decision, though.</p><h2 id="3-activities-i-39-d-always-use-ai-to-help-plan-for-me">3 activities I'd always use AI to help plan for me</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="2zj3XdFHwKS3MqZZ2kKcmX" name="shutterstock_2100754390-16x9" alt="surprise party" src="https://cdn.mos.cms.futurecdn.net/2zj3XdFHwKS3MqZZ2kKcmX-1920-80.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>With so many ChatGPT plugins catered towards helping users plan and book vacations, I’ve gotten accustomed to using OpenAI’s chatbot and comparable AI tools to help me plan vacations. Relying on AI to build a day-by-day itinerary, finding the best attractions based on my hobbies & interests and coming up with rainy-day alternatives are among the trip-planning activities I’m fine with AI helping me plan. Once I’ve gotten all the best recommendations for my future getaway from AI, I always make sure to do my own research to see if all of the info can be verified before I hop on a plane.</p><p>I’ll admit to not being the best party planner — I usually let someone else be responsible for that and handle the gift-giving portion of festivities. Lately, I’ve gotten used to tapping into Gemini to help me come up with the best venues, gift recommendations, clever decorations, music playlists and homemade menus to consider when planning a celebratory gathering. Once a BBQ-centric holiday like the Fourth of July, Labor Day or someone’s summer birthday rolls around, I’ll set up some plans with AI, share them with whoever else is part of the planning group and go from there.</p><p>If you’ve been following my AI writing up until this point, you’ve probably noticed that my 2026 revolves around the word “productivity.” ChatGPT in particular has supplied me with a wealth of personal productivity routines that I’ve used to plan my workdays. AI has risen to the occasion to help me set up a realistic to-do list, break up my work sessions into physical- & mental-amplifying exercises and find the best ways to wind down once the evening hours roll through. AI tools have definitely helped me get more work done, stay healthy and stay sane whenever I’ve used them to produce a productivity regimen.</p><h2 id="final-thoughts-5">Final thoughts</h2><p>I always keep this system in place for certain situations when I consider having AI help me set something up: let AI take the lead for low-stakes situations, let AI assist & help me verify certain bits of information for medium-stakes events and let AI assist & rely on more accomplished individuals to give me the answers I need for more high-stakes decisions. </p><p>I’ll have no issue letting Gemini help me plan a weekend sci-fi movie marathon, but I’ll never ask it to help me get out of a major legal situation. Having an AI hallucination resulting in me being behind bars is something I never want to happen…</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/home/coffee-makers/i-just-tried-the-worlds-first-ai-espresso-machine-im-a-coffee-snob-and-it-was-surprisingly-good" target="_blank"><strong>I just tried the world’s first AI espresso machine — I'm a coffee snob, and it was surprisingly... good?</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/people-are-using-custom-apps-and-usd30-gadgets-to-hunt-for-smart-glasses-that-may-be-filming-them-heres-how" target="_blank"><strong>People are using custom apps and $30 gadgets to hunt for smart glasses that may be filming them—here's how</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-claude-and-perplexity-to-rank-the-10-jobs-most-likely-to-be-replaced-by-ai-heres-what-they-all-agreed-on" target="_blank"><strong>I asked ChatGPT, Gemini, Claude and Perplexity to rank the 10 jobs most likely to be replaced by AI — here's what they all agreed on</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I ditched ChatGPT for YouMind for a day — here’s what surprised me ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Like a lot of people, particularly those working in tech, ChatGPT is practically my default browser tab. With all the <a href="https://www.tomsguide.com/news/chatgpt-is-taking-over-the-internet-with-plugins-what-it-means-for-you">plugins</a> available, <a href="https://www.tomsguide.com/ai/claude-code-vs-chatgpt-codex-which-ai-coding-agent-is-actually-better">Codex</a>, and <a href="https://www.tomsguide.com/ai/chatgpt/new-to-chatgpt-work-these-7-prompts-turn-it-into-a-personal-assistant">Work</a>, I've discovered it's a great place to dump my messy notes and brainstorming angles. <br><br>But the problem with ChatGPT isn't its reasoning ability or capabilities, it's the container. The standard chat interface gets muddy, key details are often lost and the next thing I know I'm copying chunks of my text to an external draft because ChatGPT has completely taken over. </p><p>I knew there had to be a better way, so I gave up my dedicated workspace tool and spent a full workday using<a href="https://youmind.com/overview" target="_blank"> YouMind</a> instead. </p><p>Here is what surprised me most about ditching a conversational chatbot for an asset-first workspace.</p><h2 id="1-chat-threads-make-terrible-knowledge-bases">1. Chat threads make terrible knowledge bases</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/erlkONf0gQg" allowfullscreen></iframe></div></div><p>In ChatGPT, your context is trapped in a linear scroll. If you upload four different reference documents, a YouTube video transcript and a web page, you have to constantly remind the model which source you are referencing <a href="https://www.tomsguide.com/ai/stop-clicking-new-chat-in-chatgpt-staying-in-the-same-conversation-gets-you-better-answers">as the thread grows longer</a>. What's different about YouMind though, is that it handles organization through project Boards. </p><p>With the YouMind platform, my reference material lived in a dedicated sidebar folder rather than clogging up the chat stream. This was something I didn't even know I needed, but the first time I wanted to query and interview transcript and clicked on the source directly, I was obsessed with how easy and organized it felt. </p><p>And, when I wanted cross-source synthesis, I queried the whole board. YouMind lets users treat sources as persistent assets instead of conversational chat history, which help to immediately eliminate the context drift that usually happens five prompts into a ChatGPT session.</p><h2 id="2-the-39-ask-vs-agent-39-quot-mental-shift-changed-my-output-speed">2. The 'Ask vs Agent'" mental shift changed my output speed</h2><p>With ChatGPT, you are always in one continuous chat mode. For me, I find I have to be extremely specific with the chatbot such as prompting it to "<em>Analyze this, but don't write or edit." </em>For some reason, if I show ChatGPT a document, it starts assuming things before I even prompt it to do anything. But YouMind splits actions into two explicit modes.  </p><p><strong>Ask Mode:</strong> Pure inquiry and interrogation. It reads your materials, answers questions and cites exact references without trying to prematurely generate copy.</p><p><strong>Agent Mode:</strong> Pure production. Once I knew what the angle was, I flipped to Agent Mode, chose a specific "Skill," and had it generate a summarized document and slide outline based directly on my approved notes.<br><br>For anyone who teaches workshops, gives presentations at work, or gathers materials for studying, this is a real gamechanger. Separating research synthesis from artifact creation stopped the model from jumping the gun on generic actions before the facts were ironed out.</p><h2 id="3-model-agnosticism-cures-ecosystem-fatigue">3. Model agnosticism cures ecosystem fatigue</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="tpd6kYymoBrfniGcK9HHtd" name="YouMind" alt="YouMind page" src="https://cdn.mos.cms.futurecdn.net/tpd6kYymoBrfniGcK9HHtd-1920-80.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: Future)</span></figcaption></figure><p>When you rely solely on ChatGPT, you get GPT’s tone and style across everything you touch. Every response, whether it's travel advice or a professional email drafted to your boss, sounds the same. That means, if you want Claude’s technical precision, you have to copy your context, open another tab, re-upload your files, and start over.</p><p>Inside a single YouMind board, you can switch between models on the fly. Yes, you read that correctly; you're not restricted to just one model with YouMind. You can use Claude to refine and edit, then switch to GPT for structural outlines, or lean on Gemini for quick web research. Having multiple model families under one roof without moving files around felt remarkably fluid. It's one of the biggest reasons I plan on using YouMind a lot more. </p><h2 id="4-granular-editing-beats-the-39-regenerate-39-lottery">4. Granular editing beats the 'regenerate' lottery</h2><p>The most infuriating part of editing drafts in ChatGPT is the rewrite loop. You ask it to tweak a <em>single</em> sentence, and it generates an entirely new 600-word response. This is one of the aspects of ChatGPT that drives me crazy. Since it does that, it essentially forces users to scan and re-read everything again and again just to ensure everything has remained in place and nothing was accidentally cut. </p><p>In YouMind's Crafts editor, text behaves like a shared Google Doc, so revisions show up inline with visual differences. From there, you can accept, reject or tweak individual suggestions.</p><p>You can highlight just one clunky line and prompt the AI to fix only those words while keeping the surrounding copy untouched.</p><p>For anyone who cares about preserving specific wording and cadence, having inline change-tracking inside the AI interface is a massive workflow upgrade over standard chat.</p><h2 id="what-i-missed-about-chatgpt">What I missed about ChatGPT</h2><p>Swapping a complete workflow for the day isn't easy and, even though YouMind is pretty easy intuitive, there were still some pretty important features that I missed about ChatGPT. </p><p><strong>Raw conversational speed:</strong> For lightning-fast, throwaway queries ("convert this to grams" or "give me 10 alternative verbs for this social post), firing off a two-second prompt in ChatGPT is still faster than setting up or navigating a board.</p><p><strong>Complex multi-step reasoning:</strong> While YouMind lets you access top frontier models, ChatGPT’s native canvas and advanced reasoning toggles still feel slightly more dialed in for heavy logic, reasoning or deep code debugging.</p><p><strong>Mobile accessibility:</strong> ChatGPT's mobile experience is mature across both iOS and Android. YouMind was pretty good on desktop but not as great on mobile. </p><h2 id="the-takeaway-4">The takeaway</h2><p>ChatGPT is an incredible conversational engine, but it is fundamentally built like a messaging app. For complex research and writing projects, treating an LLM like an instant message conversation creates artificial bottlenecks.</p><p>Spending the day in YouMind proved that organizing context into tight project boards and having an inline document editor makes turning research into real deliverables significantly faster. I won't be abandoning ChatGPT for quick, standalone questions, but for deep-dive writing and multi-source research, it's now my new go-to. </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/ai/gemini-3-8-flash-has-one-major-advantage-over-gpt-6-astra-and-claude-fable-5-1"><strong>Gemini 3.8 Flash has one major advantage over GPT-6 Astra and Claude Fable 5.1</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/meta-just-launched-an-ai-that-can-actually-run-your-life-online-heres-what-muse-can-do"><strong>Meta just launched an AI that can actually run your life online — here's what Muse can do</strong></a><strong></strong></li><li><strong></strong><a href="https://proof.vanilla.tools/tomsguide/articles/new/standard"><strong>Anthropic modeled what AI could do by 2030 — the economy gets 32% richer while workers get left behind</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-ditched-chatgpt-for-youmind-for-a-day-heres-what-surprised-me</link>
                                                                            <description>
                            <![CDATA[ I ditched ChatGPT for YouMind for a full workday. Its persistent boards, multiple AI models and inline editing changed how I research and write. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">QUASgbq7eJAijY8EURmXFG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vrP492b593b4Kf4CSLNpDK-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 05:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/vrP492b593b4Kf4CSLNpDK-1920-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[YouMind ]]></media:description>                                                            <media:text><![CDATA[YouMind ]]></media:text>
                                <media:title type="plain"><![CDATA[YouMind ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vrP492b593b4Kf4CSLNpDK-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Like a lot of people, particularly those working in tech, ChatGPT is practically my default browser tab. With all the <a href="https://www.tomsguide.com/news/chatgpt-is-taking-over-the-internet-with-plugins-what-it-means-for-you">plugins</a> available, <a href="https://www.tomsguide.com/ai/claude-code-vs-chatgpt-codex-which-ai-coding-agent-is-actually-better">Codex</a>, and <a href="https://www.tomsguide.com/ai/chatgpt/new-to-chatgpt-work-these-7-prompts-turn-it-into-a-personal-assistant">Work</a>, I've discovered it's a great place to dump my messy notes and brainstorming angles. <br><br>But the problem with ChatGPT isn't its reasoning ability or capabilities, it's the container. The standard chat interface gets muddy, key details are often lost and the next thing I know I'm copying chunks of my text to an external draft because ChatGPT has completely taken over. </p><p>I knew there had to be a better way, so I gave up my dedicated workspace tool and spent a full workday using<a href="https://youmind.com/overview" target="_blank"> YouMind</a> instead. </p><p>Here is what surprised me most about ditching a conversational chatbot for an asset-first workspace.</p><h2 id="1-chat-threads-make-terrible-knowledge-bases">1. Chat threads make terrible knowledge bases</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/erlkONf0gQg" allowfullscreen></iframe></div></div><p>In ChatGPT, your context is trapped in a linear scroll. If you upload four different reference documents, a YouTube video transcript and a web page, you have to constantly remind the model which source you are referencing <a href="https://www.tomsguide.com/ai/stop-clicking-new-chat-in-chatgpt-staying-in-the-same-conversation-gets-you-better-answers">as the thread grows longer</a>. What's different about YouMind though, is that it handles organization through project Boards. </p><p>With the YouMind platform, my reference material lived in a dedicated sidebar folder rather than clogging up the chat stream. This was something I didn't even know I needed, but the first time I wanted to query and interview transcript and clicked on the source directly, I was obsessed with how easy and organized it felt. </p><p>And, when I wanted cross-source synthesis, I queried the whole board. YouMind lets users treat sources as persistent assets instead of conversational chat history, which help to immediately eliminate the context drift that usually happens five prompts into a ChatGPT session.</p><h2 id="2-the-39-ask-vs-agent-39-quot-mental-shift-changed-my-output-speed">2. The 'Ask vs Agent'" mental shift changed my output speed</h2><p>With ChatGPT, you are always in one continuous chat mode. For me, I find I have to be extremely specific with the chatbot such as prompting it to "<em>Analyze this, but don't write or edit." </em>For some reason, if I show ChatGPT a document, it starts assuming things before I even prompt it to do anything. But YouMind splits actions into two explicit modes.  </p><p><strong>Ask Mode:</strong> Pure inquiry and interrogation. It reads your materials, answers questions and cites exact references without trying to prematurely generate copy.</p><p><strong>Agent Mode:</strong> Pure production. Once I knew what the angle was, I flipped to Agent Mode, chose a specific "Skill," and had it generate a summarized document and slide outline based directly on my approved notes.<br><br>For anyone who teaches workshops, gives presentations at work, or gathers materials for studying, this is a real gamechanger. Separating research synthesis from artifact creation stopped the model from jumping the gun on generic actions before the facts were ironed out.</p><h2 id="3-model-agnosticism-cures-ecosystem-fatigue">3. Model agnosticism cures ecosystem fatigue</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="tpd6kYymoBrfniGcK9HHtd" name="YouMind" alt="YouMind page" src="https://cdn.mos.cms.futurecdn.net/tpd6kYymoBrfniGcK9HHtd-1920-80.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: Future)</span></figcaption></figure><p>When you rely solely on ChatGPT, you get GPT’s tone and style across everything you touch. Every response, whether it's travel advice or a professional email drafted to your boss, sounds the same. That means, if you want Claude’s technical precision, you have to copy your context, open another tab, re-upload your files, and start over.</p><p>Inside a single YouMind board, you can switch between models on the fly. Yes, you read that correctly; you're not restricted to just one model with YouMind. You can use Claude to refine and edit, then switch to GPT for structural outlines, or lean on Gemini for quick web research. Having multiple model families under one roof without moving files around felt remarkably fluid. It's one of the biggest reasons I plan on using YouMind a lot more. </p><h2 id="4-granular-editing-beats-the-39-regenerate-39-lottery">4. Granular editing beats the 'regenerate' lottery</h2><p>The most infuriating part of editing drafts in ChatGPT is the rewrite loop. You ask it to tweak a <em>single</em> sentence, and it generates an entirely new 600-word response. This is one of the aspects of ChatGPT that drives me crazy. Since it does that, it essentially forces users to scan and re-read everything again and again just to ensure everything has remained in place and nothing was accidentally cut. </p><p>In YouMind's Crafts editor, text behaves like a shared Google Doc, so revisions show up inline with visual differences. From there, you can accept, reject or tweak individual suggestions.</p><p>You can highlight just one clunky line and prompt the AI to fix only those words while keeping the surrounding copy untouched.</p><p>For anyone who cares about preserving specific wording and cadence, having inline change-tracking inside the AI interface is a massive workflow upgrade over standard chat.</p><h2 id="what-i-missed-about-chatgpt">What I missed about ChatGPT</h2><p>Swapping a complete workflow for the day isn't easy and, even though YouMind is pretty easy intuitive, there were still some pretty important features that I missed about ChatGPT. </p><p><strong>Raw conversational speed:</strong> For lightning-fast, throwaway queries ("convert this to grams" or "give me 10 alternative verbs for this social post), firing off a two-second prompt in ChatGPT is still faster than setting up or navigating a board.</p><p><strong>Complex multi-step reasoning:</strong> While YouMind lets you access top frontier models, ChatGPT’s native canvas and advanced reasoning toggles still feel slightly more dialed in for heavy logic, reasoning or deep code debugging.</p><p><strong>Mobile accessibility:</strong> ChatGPT's mobile experience is mature across both iOS and Android. YouMind was pretty good on desktop but not as great on mobile. </p><h2 id="the-takeaway-4">The takeaway</h2><p>ChatGPT is an incredible conversational engine, but it is fundamentally built like a messaging app. For complex research and writing projects, treating an LLM like an instant message conversation creates artificial bottlenecks.</p><p>Spending the day in YouMind proved that organizing context into tight project boards and having an inline document editor makes turning research into real deliverables significantly faster. I won't be abandoning ChatGPT for quick, standalone questions, but for deep-dive writing and multi-source research, it's now my new go-to. </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/ai/gemini-3-8-flash-has-one-major-advantage-over-gpt-6-astra-and-claude-fable-5-1"><strong>Gemini 3.8 Flash has one major advantage over GPT-6 Astra and Claude Fable 5.1</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/meta-just-launched-an-ai-that-can-actually-run-your-life-online-heres-what-muse-can-do"><strong>Meta just launched an AI that can actually run your life online — here's what Muse can do</strong></a><strong></strong></li><li><strong></strong><a href="https://proof.vanilla.tools/tomsguide/articles/new/standard"><strong>Anthropic modeled what AI could do by 2030 — the economy gets 32% richer while workers get left behind</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>