<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/articletype/news" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in News ]]></title>
                <link>https://www.tomsguide.com/news</link>
        <description><![CDATA[ All the latest news content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Fri, 24 Jul 2026 16:05:01 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ Jimothy the viral raccoon is 100% real — here's what's AI ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/jimothy-the-viral-raccoon-is-100-percent-real-heres-whats-ai</link>
                                                                            <description>
                            <![CDATA[ Is Jimothy the raccoon real? Yes, but the wild videos taking over your feed are generative AI. Discover why this Seattle raccoon became an AI illusion. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jNDv2Y7JhK9Ww3SuUda2FX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EaV3GCLfBvhbTEodmQZKBS-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 16:05:01 +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.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/EaV3GCLfBvhbTEodmQZKBS-1280-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[AI-generated Jimothy]]></media:description>                                                            <media:text><![CDATA[AI-generated Jimothy]]></media:text>
                                <media:title type="plain"><![CDATA[AI-generated Jimothy]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EaV3GCLfBvhbTEodmQZKBS-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you've been anywhere near social media recently, you've likely seen Jimothy. The unusually round, compact raccoon took the internet by storm after <a href="https://www.today.com/news/good-news/jimothy-raccoon-seattle-viral-video-rcna588184" target="_blank">Kiana Hall</a>, a 33-year-old marketing specialist in Seattle, filmed him near the Ballard Goodwill on July 13. Hall initially thought she was looking at a cat under a parked car — until the animal turned around and revealed a racoon with<a href="https://vcahospitals.com/local-neurology" target="_blank"> short spine syndrome</a>, a disorder that affects some animals. She posted the clip to <a href="https://www.instagram.com/c1vrgr1/" target="_blank">Instagram</a> the next day, naming him Jimothy because, as she put it, "he looked like a Jimothy." </p><p>With his seemingly missing neck and spherical shape, he looks like a creature straight out of a video game or a <a href="https://en.wikipedia.org/wiki/Cryptid" target="_blank">cryptid</a> sighting — and as of July 18, the video had racked up <a href="https://www.today.com/news/good-news/jimothy-raccoon-seattle-viral-video-rcna588184" target="_blank">over 7 million views</a>.</p><p>Jimothy is 100% real.</p><h2 id="how-jimothy-became-a-cultural-explosion">How Jimothy became a cultural explosion</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/Da9FGh9jUz7/" target="_blank">A post shared by KING 5 (@king5seattle)</a></p><p>A photo posted by  on </p></blockquote></div><p>Before we get to what's fake, it's worth appreciating what's real — because the real-world response has been nearly as surreal as the AI-generated content.</p><p>Within days of going viral, Jimothy inspired <a href="https://www.washingtonpost.com/lifestyle/2026/07/23/people-are-obsessed-with-jimothy-seattle-raccoon-whos-now-celebrity/" target="_blank">a mural, tattoos</a>, fan art, and a dedicated following on <a href="https://www.reddit.com/r/Seattle/" target="_blank">Reddit's r/Seattle</a>, which saw <a href="https://www.inc.com/saleah-blancaflor/seattles-viral-raccoon-jimothy-became-an-internet-celebrity-not-everyone-is-happy-about-it/91378987" target="_blank">29 million views</a> from July 16 to 22 alone. </p><p>The <a href="https://www.mlb.com/news/jimothy-the-raccoon-wins-mariners-salmon-race" target="_blank">Seattle Mariners</a> brought a Jimothy mascot into their beloved Salmon Run race at T-Mobile Park — and he won, naturally, sparking what fans are calling a rally effect after the team rattled off three straight wins. </p><p><a href="https://www.axios.com/local/seattle/2026/07/23/google-jimothy-raccoon-easter-egg-search-animation-seattle" target="_blank">Google even added an Easter egg.</a> Just search his name and an animated Jimothy scampers across your screen;  it's been triggered over 5 million times. He's received an <a href="https://en.wikipedia.org/wiki/Jimothy_(raccoon)" target="_blank">honorary degree from the University of Washington</a>, recognition from the Seattle City Council, and even a <a href="https://mynorthwest.com/local/raccoon-jimothy-white-house-trump/4259683" target="_blank">shout-out from the White House</a>.</p><h2 id="the-ai-spin">The AI spin</h2><p>But, what's not real is almost everything you are seeing him do online.</p><p>As soon as the original clip went viral in mid-July, creatives, both human and AI took to the internet. Since Jimothy's actual appearance is already somewhat surreal, he has become the perfect subject for AI-powered content. People are running his image through generative models like <a href="https://www.tomsguide.com/ai/i-transformed-photos-into-videos-with-googles-veo-3-and-the-results-are-jaw-dropping">Gemini's Veo</a> and <a href="https://www.tomsguide.com/ai/elon-musk-says-grok-is-making-a-historically-accurate-ai-odyssey-movie-heres-what-we-know">Grok</a> to create increasingly absurd clips, placing him in fantasy landscapes, having him act out cinematic scenes or reimagining him in stylized digital art.</p><p>The gaming world has been especially enthusiastic. <a href="https://www.gosugamers.net/entertainment/news/78842-viral-raccoon-jimothy-goes-viral-in-gaming-is-now-in-dungeons-dragons-and-stardew-valley" target="_blank">Blizzard Entertainment</a> posted a tribute rendering of Jimothy in the style of "World of Warcraft." <a href="https://massivelyop.com/2026/07/20/mmorpg-fans-plead-for-in-game-jimothy-pets-after-devs-create-mock-ups-of-the-viral-critter/" target="_blank">Jagex</a> did the same for "Old School RuneScape" <em>and </em><a href="https://en.wikipedia.org/wiki/Jimothy_(raccoon)" target="_blank">D&D Beyond released an official stat block</a> so players can drop him into their tabletop campaigns. A digital Jimothy even made an appearance in <a href="https://mynorthwest.com/local/ballard-raccoon-icon-jimothy/4258982" target="_blank">Roku City</a>.</p><p>These AI-generated tributes are essentially a celebration of meme culture, but many of us (myself included) were duped. The internet took a genuinely fascinating wild animal and used every creative tool available, from generative AI to game engines to old-fashioned fan art, to build a cinematic universe around him.</p><h2 id="why-we-keep-falling-for-it">Why we keep falling for it </h2><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">Jimothy ❤️ https://t.co/MKhyfCm2mq pic.twitter.com/2LtV3E2eqX<a href="https://twitter.com/cantworkitout/status/2078495010475966556">July 18, 2026</a></p></blockquote><div class="see-more__filter"></div></div><p>The reason these artificial clips are tricking so many people because Jimothy is the perfect subject for digital deception. His real-world proportions already trigger the uncanny valley effect; when a living animal looks like a glitch in the matrix, it naturally lowers our skepticism for actual CGI. </p><p>Combine that biological reality with the way we consume content, rapidly scrolling on phones where platform video compression smooths out the telltale visual artifacts of AI generation, and it’s no wonder people are struggling to separate the real Ballard neighborhood from a prompted illusion.</p><p>So, yes, the scrappy hometown hero from Seattle is real. But if you see him riding a dragon, casting a spell or winning a raid boss fight in Azeroth, that's just the internet doing what it does best. And in this case, doing it faster and more convincingly than ever before, thanks to generative AI.</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-asked-chatgpt-to-improve-my-apple-notes-app-here-are-the-7-changes-i-actually-kept">I asked ChatGPT to improve my Apple Notes app — here are the 7 changes I actually kept</a></li><li><a href="https://www.tomsguide.com/ai/microsoft-copilots-free-deep-research-ai-tool-is-going-away-these-are-the-7-best-free-alternatives">Microsoft Copilot’s free Deep Research AI tool is going away — these are the 7 best free alternatives</a></li><li><a href="https://www.tomsguide.com/ai/i-always-recommend-the-chatgpt-escape-prompt-to-friends-looking-for-a-new-job-heres-why-it-works">I always recommend the ChatGPT 'Escape Prompt' to friends looking for a new job — here's why it works</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to listen to 'The Archers' from anywhere in the world ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/how-to-listen-to-the-archers-from-anywhere-in-the-world</link>
                                                                            <description>
                            <![CDATA[ With plenty of daily drama to keep up with, here's how to listen to "The Archers" from abroad when outside the U.K. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kcX8mQgZebpeAbCJRgmyEd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wipzMftxcDqitYZhAvuvzm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 14:45:10 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom Wardley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/XvemTAehp4KGqevwPtrdCb.jpeg ]]></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/wipzMftxcDqitYZhAvuvzm-1280-80.jpg">
                                                            <media:credit><![CDATA[BBC]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Promotional title card for The Archers featuring the title displayed over a pair of wellington boots in a rural English setting]]></media:description>                                                            <media:text><![CDATA[Promotional title card for The Archers featuring the title displayed over a pair of wellington boots in a rural English setting]]></media:text>
                                <media:title type="plain"><![CDATA[Promotional title card for The Archers featuring the title displayed over a pair of wellington boots in a rural English setting]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wipzMftxcDqitYZhAvuvzm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With the international closure of BBC Sounds, fans of “The Archers” outside the U.K. may find themselves stuck when it comes to listening to the world’s longest running soap opera. But fear not, because we’ve got all the info you need on how to listen to “The Archers” <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992"><strong>from anywhere with a VPN</strong></a><strong> — and for FREE.</strong></p><div  class="fancy-box"><div class="fancy_box-title">'The Archers' date, time, listening options</div><div class="fancy_box_body"><p class="fancy-box__body-text">New episodes of "The Archers" arrive daily (excluding Saturdays) at 7 p.m. BST<br><strong>• LISTEN FREE — </strong>BBC Radio 4 or<strong> </strong><a data-analytics-id="inline-link" href="https://www.bbc.co.uk/sounds" target="_blank" rel="nofollow">BBC Sounds</a> (U.K.)<br><strong>• Listen anywhere</strong> — try <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk free</strong></a></p></div></div><p>If you’re reading this, chances are you’re well versed with all the goings on in Ambridge, but for the uninitiated, “The Archers” is a radio soap opera charting all the drama in the rural English community. The heart of the programme is the titular Archer family, proprietors of Brookfield Farm, as well as the arable antics at Bridge Farm and Home Farm. The daily ongoing story covers everything from dastardly land grabs, steamy love affairs and village fete politics, with all the whimsy one might expect from a cosy countryside chronicle. </p><p>It’s an addictive listen, with short daily episodes, or one weekly omnibus, and there’s a number of ways to tune in, not matter where in the world you find yourself. So read on to find out how to listen to “The Archers" online from outside the U.K..</p><h2 class="article-body__section" id="section-how-to-listen-to-the-archers-for-free"><span>How to listen to 'The Archers' for free</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:597px;"><p class="vanilla-image-block" style="padding-top:56.11%;"><img id="AzfuuoVKXj5oQXYRpLP78C" name="BBC Sounds" alt="BBC Sounds" src="https://cdn.mos.cms.futurecdn.net/AzfuuoVKXj5oQXYRpLP78C.jpg" mos="" align="middle" fullscreen="" width="597" height="335" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: BBC Sounds)</span></figcaption></figure><p>"The Archers" is broadcast by BBC Radio 4 and available on BBC Sounds.</p><p>There's a number of options for listeners in the U.K. to enjoy all new episodes of "The Archers". </p><p>Whichever works best for you, installments drop <strong>every day</strong> except Saturdays, at around <strong>7 p.m. BST</strong>, or, if you prefer to binge, the omnibus arrives every Sunday morning at 11 a.m. BST. </p><p><a href="https://www.bbc.co.uk/sounds" target="_blank" rel="nofollow"><strong>BBC Sounds</strong></a><strong> </strong>is the best option, with the broadcaster's audio streaming app bundling live radio stations, podcasts and audio dramas in one place. And all for FREE. </p><p>You can also listen as episodes go out on <strong>BBC Radio 4 </strong>and catch up via most major podcast apps, including <a href="https://open.spotify.com/show/6vOSD7FRBqdwzhCjKu53uf" target="_blank" rel="nofollow"><strong>Spotify</strong></a><strong> </strong>and <a href="https://podcasts.apple.com/gb/podcast/the-archers/id265970428" target="_blank" rel="nofollow"><strong>Apple Podcasts</strong></a>. <br><br>You don't have to miss out if you're a Brit abroad either because you can <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>unblock BBC Sounds with a VPN</strong></a>.</p><h2 class="article-body__section" id="section-listen-to-the-archers-from-abroad"><span>Listen to 'The Archers' from abroad</span></h2><p>If you’re travelling and find that your usual streaming service is blocked, a <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a> (virtual private network) can make your device appear as though it’s back in your home country. That way, you can keep using your usual subscriptions, just as you would back home.</p><p>We regularly test VPNs, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is one of the best all‑round options for streaming thanks to its fast speeds, reliable unblocking, and wide device support. It also comes with a 30‑day money‑back guarantee, so you can see how it works with your setup before fully committing.</p><div class="product"><a data-dimension112="c5fcba42-873e-11f1-8ed8-b18301fd957c" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra Free" data-dimension48="NordVPN deal: 3 Months Extra Free" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="VnF7jLxiP2tFksCEBf5N8F" name="NordVPN deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/VnF7jLxiP2tFksCEBf5N8F.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>▶︎ <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="c5fcba42-873e-11f1-8ed8-b18301fd957c" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra Free" data-dimension48="NordVPN deal: 3 Months Extra Free" data-dimension25=""><strong>NordVPN deal: 3 Months Extra Free</strong></a><br><br>Boasting lightning-fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅ 3 Months Extra FREE!</strong><br><strong>✅ 75% Off Usual Price</strong><br><strong>✅ Unlocks BBC Sounds</strong><br><br>Use NordVPN to unblock <a href="https://www.bbc.co.uk/sounds" target="_blank" rel="nofollow"><strong>BBC Sounds</strong></a> and stream "The Archers" online from anywhere.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="c5fcba42-873e-11f1-8ed8-b18301fd957c" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra Free" data-dimension48="NordVPN deal: 3 Months Extra Free" data-dimension25="">View Deal</a></p></div><p>Using a VPN is simple.</p><p><strong>1. Install the VPN app</strong> on the device you’ll listen on. <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our pick.</p><p><strong>2. Connect to a server in your home country. </strong>For example, choose a U.K. server to access <a href="https://www.bbc.co.uk/sounds" target="_blank" rel="nofollow"><strong>BBC Sounds</strong></a> while abroad.</p><p><strong>3. Open your streaming app</strong> and play as normal.<strong> </strong></p><h2 class="article-body__section" id="section-listen-around-the-world"><span>Listen around the world</span></h2><h2 id="can-i-listen-to-the-archers-outside-the-u-k">Can I listen to 'The Archers' outside the U.K.?</h2><p>If you're a Brit travelling abroad in the U.S., Canada and Australia and beyond who usually listens to "The Archers" via the <a href="https://www.bbc.co.uk/sounds" target="_blank" rel="nofollow"><strong>BBC Sounds</strong></a> app, you may find your service unavailable due to regional restrictions. While there was previously global access to BBC Sounds, it's now exclusive to Blighty. </p><p>However, there is hope, as you could use a VPN, such as <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>, to <strong>unblock BBC Sounds when travelling abroad</strong>. </p><h2 class="article-body__section" id="section-all-you-need-to-know-about-the-archers"><span>All you need to know about "The Archers"</span></h2><h2 id="the-archers-schedule">'The Archers' schedule</h2><p>New episodes of "The Archers" arrive every day (excluding Saturdays) at 7 p.m. BST. An omnibus edition of the week's episodes lands every Sunday at 11 a.m. BST.</p><h2 id="the-archers-main-cast">'The Archers' main cast</h2><ul><li><strong>David Archer </strong>played by Timothy Bentinck</li><li><strong>Brian Aldridge </strong>played by Charles Collingwood</li><li><strong>Jill Archer </strong>played by Patricia Greene</li><li><strong>Lilian Bellamy </strong>played by Sunny Ormonde</li><li><strong>Pat Archer </strong>played by Patricia Gallimore</li><li><strong>Helen Archer </strong>played by Louiza Patikas</li><li><strong>Lynda Snell </strong>played by Carole Boyd</li><li><strong>Eddie Grundy </strong>played by Trevor Harrison</li></ul><section class="article__schema-question"><h3>Is there a 'The Archers' spin-off?</h3><article class="article__schema-answer"><p>Emma Freud hosts "The Archers Podcast," which drops every Friday on BBC Sounds and other podcast platforms, dissecting the week's events in Ambridge, going behind-the-scenes and answering listener questions. </p></article></section><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-iplayer-vpn">The best BBC iPlayer VPN</a></li><li><a href="https://www.tomsguide.com/uk/best-picks/best-vpn">The best VPN service</a></li><li><a href="https://www.tomsguide.com/ai/i-just-found-a-free-way-to-watch-youtube-without-ads-and-it-doesnt-require-youtube-premium" target="_blank">The free way to watch YouTube without ads</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Ultra delay leak right after Samsung's triumphant Galaxy Fold 8 launch has me sick of waiting for Apple's foldable ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/iphone-ultra-delay-leak-right-after-samsungs-triumphant-galaxy-fold-8-launch-has-me-sick-of-waiting-for-apples-foldable</link>
                                                                            <description>
                            <![CDATA[ Samsung just released its own iPhone Ultra rival, while Apple's first foldable attempt might be delayed again. At this point, I'm truly sick of how slow Apple moves. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">frFdxDJXaGaN8JApawo86H</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 11:54:37 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <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/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg">
                                                            <media:credit><![CDATA[Majin Bu on X]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Fold design ]]></media:description>                                                            <media:text><![CDATA[iPhone Fold design ]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Fold design ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The question of "when will the<a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone"> iPhone Ultra</a> actually be released" still doesn't seem to have an answer. After some back and forth over whether the first Apple foldable will be released alongside <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro</a>, another report from <a href="https://www.digitimes.com/news/a20260723PD226/apple-foldable-iphone-production-market.html" target="_blank">DigiTimes</a> suggests that the actual release date for the foldable still remains uncertain</p><p>At this point I don't know who I should believe, and the only thing I know is that I am so tired of hearing about if and when the foldable iPhone might arrive. Especially now that <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-unpacked-2026-preview-galaxy-z-fold-8-z-flip-8-intelligent-eyewear-and-more">Samsung has just launched a new wave of foldables</a>, including its own passport-style<a href="https://www.tomsguide.com/phones/samsung-phones/my-first-36-hours-with-the-samsung-galaxy-z-fold-8-i-was-wrong-about-the-passport-screen-but-that-usd1-899-price-still-stings"> Galaxy Z Fold 8</a> that could rival Apple's foldable ambitions.</p><p>I just wish Apple would start hustling and release this thing, because it feels like everything even remotely new gets stuck in a perpetual state of "it might arrive this year."</p><h2 id="the-current-deal-with-the-iphone-ultra">The current deal with the iPhone Ultra</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1992px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="hxWF8JHH73hydhmk2vQ4mY" name="iPhone Fold" alt="A render of the potential upcoming iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/hxWF8JHH73hydhmk2vQ4mY.jpg" mos="" align="middle" fullscreen="" width="1992" height="1121" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>According to <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-delay-rumors-shot-down-in-new-report-now-apples-first-foldable-phone-may-launch-alongside-iphone-18-pro-after-all">previous reports</a>, iPhone Ultra mass production began earlier this month. The final assembly is reportedly being carried out by long-time Apple collaborator Foxconn, who DigiTimes's sources claim are "the only partner likely to have a realistic chance of meeting the expected production target."</p><p>It's unclear whether that production target means the full <a href="https://www.tomsguide.com/phones/iphones/apple-expects-10-million-people-to-buy-a-usd2-500-iphone-ultra-and-its-a-huge-gamble">10 million units Apple has reportedly ordered</a>, or simply enough to satisfy demand during the initial release window.</p><p>Foxconn is apparently in the process of "final mass-production adjustments," which has led to even more speculation that the iPhone Ultra may be delayed after all. While it's widely assumed that the phone will be unveiled alongside iPhone 18 Pro at Apple's September event, the actual release date remains unknown.</p><p>Last we heard Apple's suppliers believed <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-delay-rumors-shot-down-in-new-report-now-apples-first-foldable-phone-may-launch-alongside-iphone-18-pro-after-all">everything was still on track</a>, and the iPhone Ultra was shaping up to release alongside iPhone 18 Pro and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a>. But any hypothetical issues could alter the release schedule depending on the severity of the problem.</p><p><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-release-date-just-tipped-for-delay-it-could-arrive-months-after-iphone-18-pro">Past reports suggested</a> that the hinge structure and display durability could be the real sticking points — especially with Apple pushing to release an "exceptionally refined product."</p><p>While the foldable is expected to be very expensive, with a <a href="https://www.tomsguide.com/phones/iphones/usd1-299-iphone-18-pro-max-analyst-now-predicts-usd200-price-hike-for-apples-next-flagship-phone">rumored starting price around $2,500</a>, demand is <a href="https://www.tomsguide.com/phones/iphones/apples-foldable-iphone-ultra-may-not-be-released-at-the-same-time-as-the-iphone-18-pro-heres-why">still expected to be rather high</a>. Prolonged issues would force Apple to push back the release, to try and ensure there is enough supply to match release-day demand.</p><p>So while there's no need to panic about this right now, this back-and-forth over the fate of the iPhone Ultra is really starting to get tiresome. to the point where I'm starting to resent the fact that Apple seems to have taken so long to actually release the phone.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQnnNO"></div>                            </div>                            <script src="https://kwizly.com/embed/WQnnNO.js" async></script><h2 id="just-release-the-thing-already">Just release the thing already</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1964px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="jKyo3FUB76apN2dfooDL9d" name="iPhone Fold render edit 1-2" alt="Renders of the potential iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/jKyo3FUB76apN2dfooDL9d.jpg" mos="" align="middle" fullscreen="" width="1964" height="1105" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: FPT)</span></figcaption></figure><p>Maybe it's just because September's iPhone launch event is coming up fairly soon, or maybe it's just because foldable iPhone rumors have been circulating for the better part of a decade. We're at the stage now when I'm sick and tired of hearing about it, and wish Apple would hurry up and get the iPhone Ultra out into the world.</p><p>I'd even settle for an announcement and confirmation that the Ultra will actually arrive a few months later than the iPhone 18 Pro. It happened with the <a href="https://www.tomsguide.com/us/iphone-x,review-4800.html">iPhone X</a> back in 2017, and I feel like the knowledge that a release date is confirmed would be quite comforting — and would certainly put the majority of these rumors to bed.</p><p>The crazy thing is that this problem isn't exclusive to the iPhone Ultra. It actually seems to happen to most major Apple releases, with rumors circulating multiple years before the final product ever gets released.</p><p>The most infamous example is the <a href="https://www.tomsguide.com/news/apple-car-everything-we-know-so-far">Apple Car</a>, which was in development for a decade before Apple realized it had bitten off more than it could chew. Who knew that trying to develop a fully-autonomous car from nowhere wasn't going to work out? So the project was canceled, and some of the stuff Apple learned <a href="https://www.tomsguide.com/ai/apple-intelligence/the-apple-car-development-may-not-have-been-as-big-a-waste-of-time-and-money-as-everyone-thought-in-fact-it-may-be-the-thing-that-enabled-apples-new-ai-boom">was rolled into its ongoing work with AI and Apple Intelligence.</a></p><p>A similar situation to the iPhone Ultra happened with <a href="https://www.tomsguide.com/computing/smart-glasses/apple-vision-pro-review">Apple Vision Pro</a>. Rumors of an <a href="https://www.tomsguide.com/news/apple-may-be-releasing-arvr-headset-in-2020-after-all">Apple VR or mixed reality headset</a> circulated for multiple years, and I distinctly remember a lot of rumors and speculation that Apple could reveal it at the next Apple event. </p><p>We've been seeing something similar happen with <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">Apple Glasses</a> and the long-awaited <a href="https://www.tomsguide.com/home/smart-home/apple-smart-home-hub-we-just-got-bad-news-about-the-release-window">Siri-powered smart home hub</a>. It's not Apple's problem that these things leak so early, and we've seen it make a concerted effort to plug leaks over the years, but it makes it feel as though these new products are being developed at a snail's pace.</p><h2 id="bottom-line">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:50.03%;"><img id="y8ttnRFF7wEwtwXBQBhntU" name="Apple 2026 A iPhone Fold" alt="Render of a potential folding iPhone" src="https://cdn.mos.cms.futurecdn.net/y8ttnRFF7wEwtwXBQBhntU.jpg" mos="" align="middle" fullscreen="" width="3000" height="1501" 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've always argued that Apple has been a little too particular about when it releases new products. It often feels as though the company has been so <a href="https://www.tomsguide.com/phones/iphones/iphone-flip-should-have-been-released-years-ago-its-time-apple-started-taking-risks-again">hell-bent on making the "perfect" product </a>that it's willing to drag production out for an extended period of time as it attempts to chase an impossible dream. </p><p>The botched Apple Car development and the obsession over eliminating the display crease says to me that Apple has a problem with accepting when a new product is simply "good enough."</p><p>Others would argue that Apple was wise to wait, in an attempt to make the best foldable phone possible. Studying the market, working out the issues that can be fixed, them jumping in to knock Samsung off its throne. </p><p>Considering the foldable phone market is rather small, you could argue that Apple isn't really missing out by waiting and endeavoring to make the best foldable it can — even if it takes several years. </p><p>That doesn't make the constant talk of what may or may not be happening any less exhausting, though. It's at the point that I feel Apple should really have released the iPhone Ultra three or four years ago. So, the sooner it actually makes it to Apple Store shelves, the happier I will be.</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/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">‘We're pretty confident': How Samsung plans to fight the first foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Star Trek: Strange New Worlds' season 4 — stream "T.O.S" prequel online from anywhere now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/how-to-watch-star-trek-strange-new-worlds-season-4</link>
                                                                            <description>
                            <![CDATA[ Here's how to watch "Star Trek: Strange New Worlds" season 4 online no matter where you are, as the pre-OG Enterprise crew continue to boldly go. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MoVDnvGPpNypTu8Wyf2C6G</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MEhY4hpmZ2ej26Gs98W8a6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 09:55:59 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 13:36:59 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom Wardley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/XvemTAehp4KGqevwPtrdCb.jpeg ]]></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/MEhY4hpmZ2ej26Gs98W8a6-1280-80.jpg">
                                                            <media:credit><![CDATA[Paramount Plus]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Paul Wesley as James T. Kirk in Star Trek: Strange New Worlds season 4]]></media:description>                                                            <media:text><![CDATA[Paul Wesley as James T. Kirk in Star Trek: Strange New Worlds season 4]]></media:text>
                                <media:title type="plain"><![CDATA[Paul Wesley as James T. Kirk in Star Trek: Strange New Worlds season 4]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MEhY4hpmZ2ej26Gs98W8a6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The pre-OG crew of the U.S.S. Enterprise continues their mission to seek out new life forms and new civilisations, boldly going one step closer to where it all began in what has been confirmed as the show’s penultimate season. Here’s how to watch “Star Trek: Strange New Worlds" season 4 online<a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"> <u><strong>from anywhere with a VPN</strong></u></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Star Trek: Strange New Worlds' streaming details, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">Season 4 of "Star Trek: Strange New Worlds" premiered on Thursday, July 23. Episodes continue weekly.</p><p class="fancy-box__body-text"><strong>• Free Stream</strong> —  <a data-analytics-id="inline-link" href="https://www.tvnz.co.nz/tvseries/star-trek-strange-new-worlds" target="_blank" rel="nofollow"><strong>TVNZ+</strong></a><br><strong>• Global stream </strong>— Watch on <a data-analytics-id="inline-link" href="https://www.paramountplus.com/" target="_blank" rel="nofollow"><strong>Paramount Plus</strong></a><br><strong>• Watch anywhere — try </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk-free</strong></a></p></div></div><p>As we’d expect with the timeline creeping ever closer to those original 1960s adventures, Paul Wesley’s James T. Kirk is scheduled to make a few more appearances this season, with the future Captain continuing up the ranks as he works his way towards the helm of Starfleet’s flagship. </p><p>But before that, there’s plenty of spacefaring adventures in store for the current Enterprise crew, as Anson Mount’s Captain Pike and co. continue on their galaxy-spanning mission. </p><p>The season got off to a pulse-pounding start as the gang found themselves thrown back to the age of the dinosaurs, all while the ship above fell under siege to a Martian militia. That’s about all we can say without dropping too many spoilers, but fans ought to find plenty to enjoy this time out, with the premiere enjoying rave reviews and the season as a whole currently sitting at 100% on Rotten Tomatoes. </p><p>After a lot of naval gazing and complex plotting in the revamped “Star Trek” universe, “Strange New Worlds” takes things back to the sort of sci-fi swashbuckling the franchise does best, and it sounds like season 4 could be the show's most enjoyable outing yet. </p><p>Read on to discover how to watch “Star Trek: Strange New Worlds" season 4 online and from anywhere now.</p><h2 class="article-body__section" id="section-how-to-watch-star-trek-strange-new-worlds-season-4-online-for-free"><span>How to watch 'Star Trek: Strange New Worlds' season 4 online for free</span></h2><p>You can watch "Star Trek: Strange New Worlds"<em> </em>for free on New Zealand streaming platform, <a href="https://www.tvnz.co.nz/tvseries/star-trek-strange-new-worlds" target="_blank" rel="nofollow"><strong>TVNZ+</strong></a>.</p><p><strong>Traveling overseas?</strong> Access your usual services (or even sign up to their free trials) with <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>.</p><h2 class="article-body__section" id="section-watch-star-trek-strange-new-worlds-s4-from-anywhere-in-the-world"><span>Watch 'Star Trek: Strange New Worlds' S4 from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "Star Trek: Strange New Worlds" on your usual subscription?</p><p>You can still watch the show thanks to the wonders of a VPN (Virtual Private Network). The software allows your devices to appear to be back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a>. It's the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> on the market:</p><div class="product"><a data-dimension112="4f140cca-8737-11f1-b394-5dad5db8b283" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>🟩 <a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="4f140cca-8737-11f1-b394-5dad5db8b283" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" data-dimension25=""><strong>NordVPN deal: Try risk-free for 30 days</strong></a></p><p>Boasting super fast speeds, great features, streaming power and industry-leading security, <a href="https://www.tomsguide.com/reviews/nordvpn-review"><strong>NordVPN</strong> is our #1 VPN</a>.<br><br><strong>✅ 30-day money-back guarantee</strong><br><strong>✅ 75% off the usual price</strong></p><p>Use NordVPN to unblock your usual streaming service and watch "Star Trek: Strange New Worlds" with this <em>exclusive </em>deal. <a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4f140cca-8737-11f1-b394-5dad5db8b283" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-how-to-watch-star-trek-strange-new-worlds-s4-around-the-world"><span>How to watch 'Star Trek: Strange New Worlds' S4 around the world</span></h3><p> Season 4 of "Star Trek: Strange New Worlds" premiered on Thursday, July 23, with episodes now beaming to <a href="https://www.paramountplus.com/" target="_blank" rel="nofollow"><strong>Paramount Plus</strong></a> weekly. </p><p>Paramount Plus plans start from $8.99/month in the U.S. But <a href="https://www.walmart.com/plus" target="_blank" rel="nofollow">Walmart+</a> is currently offering a 30-day trial for $1, which includes a subscription to Paramount Plus. </p><p>The streaming service has a monthly price of CA$7.99 in Canada, £4.99 in the UK, and AU$7.99 in Australia for its lowest-priced plans.</p><p>If you're overseas and Paramount Plus is blocked, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help you to access your streams as if you were back home.</p><h3 class="article-body__section" id="section-star-trek-strange-new-worlds-s4-release-date-schedule"><span>'Star Trek: Strange New Worlds' S4 release date & schedule</span></h3><p>The fourth season of "Star Trek: Strange New Worlds" premiered on Thursday, July 23. Episodes will continue to arrive weekly on the following schedule:<em> </em></p><ul><li><strong>Episode 1: "Valles Marineris"</strong> — Thursday, July 23</li><li><strong>Episode 2: "The Griffin Incident"</strong> — Thursday, July 30</li><li><strong>Episode 3: "Human Best Friend" </strong>— Thursday, August 6</li><li><strong>Episode 4: "A Case of Chiaroscuro"</strong> — Thursday, August 13</li><li><strong>Episode 5: "Level-Five Transporter Accident"</strong> — Thursday, August 20</li><li><strong>Episode 6: "Off-Hour"</strong> — Thursday, August 27</li><li><strong>Episode 7: "Like Chronitons Through the Hourglass"</strong> — Thursday, September 3</li><li><strong>Episode 8: "Orders of Magnitude"</strong> — Thursday, September 10</li><li><strong>Episode 9: "Once La’an a Time"</strong> — Thursday, September 17</li><li><strong>Episode 10: "Tomorrow’s Enterprise"</strong> — Thursday, September 24</li></ul><h3 class="article-body__section" id="section-star-trek-strange-new-worlds-s4-trailer"><span>'Star Trek: Strange New Worlds' S4 trailer</span></h3><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/85nfSzEho68" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-star-trek-strange-new-worlds-s4-cast"><span>'Star Trek: Strange New Worlds' S4 cast</span></h3><ul><li><strong>Anson Mount</strong> as Capt. Christopher Pike</li><li><strong>Rebecca Romijn</strong> as Number One</li><li><strong>Ethan Peck</strong> as Spock</li><li><strong>Jess Bush</strong> as Christine Chapel</li><li><strong>Christina Chong</strong> as La’An Noonien-Singh</li><li><strong>Celia Rose Gooding</strong> as Nyota Uhura</li><li><strong>Melissa Navia</strong> as Erica Ortegas</li><li><strong>Babs Olusanmokun</strong> as Joseph M’Benga</li><li><strong>Martin Quinn</strong> as Montgomery Scott</li><li><strong>Carol Kane</strong> as Commander Pelia</li><li><strong>Paul Wesley</strong> as James T. Kirk</li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/paramount-plus/landman-season-2-finale-review-somehow-taylor-sheridan-has-done-it-again">'Landman' season 2 finale review: Somehow, Taylor Sheridan has done it again</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">The best streaming VPNs</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-itv-thriller-gone-from-anywhere">How to watch 'Gone' online from anywhere — stream new psychological thriller</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 8 new movies and shows to watch this weekend on Netflix, Prime Video and more (July 24-26) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/i-ranked-all-the-new-movies-and-shows-to-watch-this-weekend-on-netflix-prime-video-and-more-july-24-26</link>
                                                                            <description>
                            <![CDATA[ This weekend’s TV streaming picks on Netflix, Prime Video, Hulu and other platforms include "Disclosure Day," "The Mandalorian and Grogu" and "Ransom Canyon." ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">M7RWwth5kr7g3rrwXfNbV9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HYSaqwjPAg75VrQoNW8SsJ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 09:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 15:33:25 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&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/HYSaqwjPAg75VrQoNW8SsJ-1280-80.jpg">
                                                            <media:credit><![CDATA[Universal Pictures; Lucasfilm; Netflix]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Disclosure Day; The Mandalorian and Grogu; Ransom Canyon]]></media:description>                                                            <media:text><![CDATA[Disclosure Day; The Mandalorian and Grogu; Ransom Canyon]]></media:text>
                                <media:title type="plain"><![CDATA[Disclosure Day; The Mandalorian and Grogu; Ransom Canyon]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HYSaqwjPAg75VrQoNW8SsJ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The last weekend of July is here, and the streaming gods are once again asking one very important question: How many hours are you willing to spend on the couch? Thankfully, you won't have to waste any of them doomscrolling, because I've found the eight biggest new movies and shows to watch this weekend across Netflix, Apple TV Plus and the rest of the major <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a>.</p><p>As Tom's Guide's streaming editor, I've ranked this week's biggest releases from most to least worth your time, factoring in everything from hype and star power to actual watchability. Topping the list are two theatrical blockbusters from earlier in the summer: <strong>"Disclosure Day" </strong>and<strong> "Star Wars: The Mandalorian and Grogu."</strong>  </p><p>TV fans will have plenty to binge this weekend, with new seasons of <strong>"Ransom Canyon," "Star Trek: Strange New Worlds"</strong> and <strong>"King of the Hill,"</strong> as well as the return of <strong>"The Walking Dead: Dead City."</strong> Whether you're craving comedy, action or sci-fi, here's my ranked guide to the best new streaming releases to watch this weekend.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="1-disclosure-day-digital">1. 'Disclosure Day' (digital)</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/SCYT8vb2siQ" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Sci-fi thriller<br><strong>Runtime:</strong> 2h 22m<br><strong>What it's about:</strong> Steven Spielberg returns to the genre he helped define with an alien conspiracy thriller. Emily Blunt stars as Margaret Fairchild, a TV meteorologist who suddenly speaks an alien language during a live broadcast. She's forced on the run with cybersecurity analyst Daniel Kellner (Josh O'Connor), who has stolen classified evidence of extraterrestrial life. As the government closes in, the pair race to expose a decades-long cover-up.<br><strong>Why it's worth your time:</strong> No, it's not "Close Encounters of the Third Kind" 2.0, and that's <em>fine</em>. Even a mid-tier Spielberg sci-fi movie is eminently entertaining, elevated by Emily Blunt's terrific performance, some jaw-dropping set pieces and John Williams' soaring score.<br><strong>Where to stream: </strong><a href="https://www.amazon.com/gp/video/detail/B0H3QRLYCN" target="_blank" rel="nofollow">Prime Video</a> (with purchase)</p><h2 id="2-the-mandalorian-and-grogu-digital">2. 'The Mandalorian and Grogu' (digital)</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/IHWlvwu8t1w" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Sci-fi action-adventure<br><strong>Runtime:</strong> 2 hours 4 minutes<br><strong>What it's about:</strong> The galaxy's favorite helmeted dad and his little green adopted child are back. Din Djarin (Pedro Pascal) and <del>Baby Yoda</del> Grogu undertake a mission for the New Republic: Rescue Rotta the Hutt (voiced by Jeremy Allen White), Jabba's heir, from a rival crime syndicate in exchange for intel on an Imperial warlord. Naturally, the job spirals into a planet-hopping adventure packed with blaster fights, crime lords and a teeny bit of Force magic.<br><strong>Why it's worth your time:</strong> If you missed it in theaters, this is arguably where this movie belongs. It plays like three episodes of "The Mandalorian," which is not necessarily a bad thing. Come for the Star Wars spectacle; stay for Baby Yoda stealing every scene without saying a word.<br><strong>Where to stream: </strong><a href="https://www.amazon.com/gp/video/detail/B0H4C18YW8" target="_blank" rel="nofollow">Prime Video</a> (with purchase)</p><h2 id="3-ransom-canyon-season-2-netflix">3. 'Ransom Canyon' season 2 (Netflix)</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/2XKyPE92owY" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Romantic Western drama<br><strong>Available now:</strong> 10 episodes (about 45–50 minutes each)<br><strong>What it's about:</strong> Six months after leaving for New York, Quinn O'Grady (Minka Kelly) returns to Ransom Canyon and rancher Staten Kirkland (Josh Duhamel) is finally ready to fight for their relationship — except Quinn has a new man in her life. Meanwhile, the rival ranching families are still battling for power, and a wave of newcomers brings plenty of trouble to town.<br><strong>Why it's worth your time:</strong> If "Yellowstone" is all grit and "Virgin River" is all heart, "Ransom Canyon" lives somewhere in the middle. Season 2 leans even harder into its deliciously soapy love triangles, family feuds and small-town intrigue. Sometimes you just want attractive people making questionable decisions against a gorgeous Texas backdrop.<br><strong>Where to stream: </strong><a href="https://www.netflix.com/title/81459107">Netflix</a></p><h2 id="4-star-trek-strange-new-worlds-season-4-paramount">4. ‘Star Trek: Strange New Worlds’ season 4 (Paramount+)</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/85nfSzEho68" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Sci-fi adventure<br><strong>Available now:</strong> Episode 1 (59 minutes)<br><strong>What it's about:</strong> Captain Christopher Pike (Anson Mount) and U.S.S. Enterprise boldlly go into another round of galactic adventures, joined by Spock (Ethan Peck), Number One (Rebecca Romijn) and a young James T. Kirk (Paul Wesley). This season mixes terrifying alien encounters with emotional character beats, the early sparks of Kirk and Spock's legendary friendship, and one bonkers puppet episode.<br><strong>Why it's worth your time:</strong> After a divisive third season, "Strange New Worlds" is getting back to what it does best: optimistic, episodic "Star Trek" with heart, humor and plenty of weirdness. <br><strong>Where to stream: </strong><a href="https://www.paramountplus.com/shows/star-trek-strange-new-worlds/" target="_blank" rel="nofollow">Paramount+</a></p><h2 id="5-the-dink-apple-tv">5. 'The Dink' (Apple TV)</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/YyVNFzx5Pl8" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Sports comedy<br><strong>Runtime:</strong> 97 minutes<br><strong>What it's about:</strong> Pickleball is supposed to be retirement's favorite pastime, not the last hope for a washed-up tennis prodigy. Jake Johnson stars as Dusty Boyd, whose latest injury forces him to trade rackets for paddles, much to the horror of his tennis-obsessed father (Ed Harris). But as Dusty finds an unexpected groove with pickleball partner Candace (Mary Steenburgen), he's pulled into a battle over the future of the family country club.<br><strong>Why it's worth your time:</strong> The premise is completely ridiculous, but this sports comedy looks ready to have fun with America's fastest-growing obsession. Johnson is a natural fit for a lovable loser, and shoutout to Andy Roddick as Dusty's longtime rival.<br><strong>Where to stream:</strong> <a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow">Apple TV</a></p><h2 id="6-72-hours-netflix">6. ‘72 Hours’ (Netflix)</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/N-J-HR3quc4" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Comedy<br><strong>Runtime:</strong> 1 hour 42 minutes<br><strong>What it's about: </strong>Forty-year-old executive Joe (Kevin Hart) is desperate to revive his sputtering career when a wrong-number group chat lands him an unexpected opportunity: crashing a three-day bachelor party with a pack of twentysomethings. Joe is determined to prove he's still got it during a booze-soaked, sleep-deprived weekend — whether his back agrees or not.<br><strong>Why it's worth your time: </strong>Kevin Hart was basically born to have a midlife crisis and this comedy leans into that by pairing his frantic energy with a younger cast, including Marcello Hernández. It definitely does not reinvent the comedy wheel, but it fits the bill if you're looking for a "Hangover" lite.<br><strong>Where to stream:</strong> <a href="https://www.netflix.com/title/81715790" target="_blank" rel="nofollow">Netflix</a></p><h2 id="7-the-walking-dead-dead-city-season-3-amc">7. ‘The Walking Dead: Dead City’ season 3 (AMC)</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/cctvSNDaaYs" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Zombie horror drama<br><strong>Release date: </strong>Episode 1 on Sunday, July 26 at 3 a.m ET<br><strong>What it's about: </strong>After years of trying to kill each other, Maggie (Lauren Cohan) and Negan (Jeffrey Dean Morgan) finally decide the only way forward is by becoming ... allies? Yeah, they're as shocked as you are. With Hershel still grappling with the fallout of their shared history, the pair sets out to build the first real community in Manhattan since the apocalypse. Unfortunately, old enemies, dangerous newcomers and the undead have other plans.<br><strong>Why it's worth your time:</strong> The franchise's longest-running grudge finally evolves into something far more interesting. Watching Maggie and Negan team up is a surprisingly refreshing reset.<br><strong>Where to stream: </strong><a href="https://www.amcplus.com/shows/the-walking-dead-dead-city--1060741" target="_blank" rel="nofollow">AMC+</a></p><h2 id="8-king-of-the-hill-season-15-hulu">8. ‘King of the Hill’ season 15 (Hulu)</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/g2JXuQ3nKPU" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Animated comedy<br><strong>Available now:</strong> 10 episodes (about 25 minutes each)<br><strong>What it's about:</strong> Arlen hasn't changed much, but Hank Hill (Mike Judge) and Peggy (Kathy Najimy) are entering a new chapter as retirees, though their nosy neighbors won't give them any peace or quiet. Meanwhile, Bobby is all grown up, trying to keep his business afloat while reconnecting with old friends.<br><strong>Why it's worth your time:</strong>  The revival returns, once more updating the show's world without sacrificing its dry humor, razor-sharp observations or deep affection for its oddball Texans. Older? Yes. Wiser? Hell naw.<br><strong>Where to stream: </strong><a href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2aivFEQ&offerid=1589248.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow">Hulu</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><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/how-to-get-free-netflix">How to get Netflix for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/the-cost-of-streaming-in-2026-what-were-paying-now-vs-5-years-ago-and-how-to-save-money">The cost of streaming in 2026 — what we're paying now vs 5 years ago (and how to save money)</a></li><li><a href="https://www.tomsguide.com/us/best-cable-replacements,review-4387.html">Best live TV streaming services</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Boris Johnson: Into Ukraine's Kill Zone' online for free — stream the intense documentary from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/watch-boris-johnson-into-ukraines-kill-zone</link>
                                                                            <description>
                            <![CDATA[ Learn more about the conflict from a most unlikely source on the front line - here's how to watch "Boris Johnson: Into Ukraine's Kill Zone" online and from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">sXHMaKZTduWqwp4roueevW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/A4zZqpHSKqRmbLip9pVRb6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.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/A4zZqpHSKqRmbLip9pVRb6-1280-80.jpg">
                                                            <media:credit><![CDATA[Channel 5]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Boris Johnson in image from documentary &quot;Boris Johnson: into Ukraine&#039;s Kill Zone&quot;]]></media:description>                                                            <media:text><![CDATA[Boris Johnson in image from documentary &quot;Boris Johnson: into Ukraine&#039;s Kill Zone&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Boris Johnson in image from documentary &quot;Boris Johnson: into Ukraine&#039;s Kill Zone&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/A4zZqpHSKqRmbLip9pVRb6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Get ready for a new insight into the conflict in Eastern Europe thanks to the former British Prime Minister in "Boris Johnson: Into Ukraine's Kill Zone".</p><p>Below we explain how to watch "Boris Johnson: into Ukraine's Kill Zone" <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> — and potentially for FREE!</strong></p><div  class="fancy-box"><div class="fancy_box-title">'Boris Johnson: Into Ukraine's Kill Zone' - TV channel, free stream, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Boris Johnson: Into Ukraine's Kill Zone" will air on <strong>Channel 5 at 9 p.m. BST</strong> on <strong>Friday, July 24 </strong>and will be available to stream on <strong>5</strong>.<br><strong>• FREE STREAM </strong>— <a data-analytics-id="inline-link" href="https://www.channel5.com/" target="_blank" rel="nofollow"><strong>Channel 5</strong></a> <strong>(U.K.)</strong><br><strong>• Watch anywhere — try </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN risk-free</strong></a></p></div></div><p>This 90 minute documentary film is surprisingly sincere and powerful. Given Boris Johnson's past political performances where he cracked wise and cut a comical character at times, many would expect him to be an unusual choice for this project, but he embarks on a dangerous and fascinating journey through Kyiv to deliver a unique view of the war between Ukraine and Russia.</p><p>Johnson travels unprotected, over the course of 72 hours into what is known as the 'kill zone', which sits near Zaporizhzhia. The former politician visits villages that have been ransacked by the conflict, looks into the technology of modern warfare, and endures a missile strike.</p><p>If you're keen to see how the whole thing plays out, keep reading for all the details on where to <strong>watch "Boris Johnson: Into Ukraine's Kill Zone" online</strong> from anywhere today.</p><h2 class="article-body__section" id="section-how-to-watch-boris-johnson-into-ukraine-s-kill-zone-for-free-in-the-u-k"><span>How to watch 'Boris Johnson: Into Ukraine's Kill Zone' for free in the U.K.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="ttCSpj8r9kHj68j7NhsBL9" name="TG_British_Flag_1920_400_shutterstock.jpg" alt="British flag" src="https://cdn.mos.cms.futurecdn.net/ttCSpj8r9kHj68j7NhsBL9.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><div class="product"><a data-dimension112="cbad66be-85bb-11f1-815d-fbec1ce3a5c1" data-action="Deal Block" data-label="5" data-dimension48="5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:562px;"><p class="vanilla-image-block" style="padding-top:92.88%;"><img id="AsapcB9XC3wZvMyLRuEiDQ" name="Channel 5" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AsapcB9XC3wZvMyLRuEiDQ.png" mos="" align="middle" fullscreen="" width="562" height="522" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>On Friday, July 24, "Boris Johnson: into Ukraine's Kill Zone" will air on <strong>Channel 5 at 9 p.m.</strong> BST.</p><p>You can watch afterwards free on-demand on <a href="https://www.channel5.com" target="_blank" rel="nofollow" data-dimension112="cbad66be-85bb-11f1-815d-fbec1ce3a5c1" data-action="Deal Block" data-label="5" data-dimension48="5" data-dimension25=""><strong>5</strong></a> after the doc has aired.<br><br><strong>Outside the U.K.? </strong>You don't have to miss this show if you are a Brit living abroad because you can <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>unblock 5 with a VPN</strong></a>. We'll explain how to do that below...<a class="view-deal button" href="" target="_blank" rel="nofollow" data-dimension112="cbad66be-85bb-11f1-815d-fbec1ce3a5c1" data-action="Deal Block" data-label="5" data-dimension48="5" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-how-to-watch-boris-johnson-into-ukraine-s-kill-zone-from-abroad"><span>How to watch 'Boris Johnson: Into Ukraine's Kill Zone' from abroad</span></h2><p>Thanks to the wonders of a<strong> </strong><a href="https://www.tomsguide.com/best-picks/best-vpn"><strong>VPN</strong></a> (Virtual Private Network), "Boris Johnson: Into Ukraine's Kill Zone" should be available to Brits no matter where they are. The software allows your devices to appear to be back in the U.K. and watch Channel 5 content for free, as if you were back home.</p><p>Not all VPNs works for this – but <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a><strong> does </strong>(we use it daily) and you can get an <strong>exclusive offer below:</strong></p><div class="product"><a data-dimension112="a289f444-809a-11f1-aef0-d5efdbaaf507" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="BFyGSpvzxBqqUsYoFvjPYR" name="NordVPN square deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BFyGSpvzxBqqUsYoFvjPYR.jpg" mos="" align="middle" fullscreen="" width="200" height="200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="a289f444-809a-11f1-aef0-d5efdbaaf507" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25=""><strong>NordVPN deal: 3 Months Extra FREE</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅ 3 Months Extra FREE!</strong><br><strong>✅ Up to 75% Off Usual Price</strong><br><strong>✅ </strong> <strong>30-day money-back guarantee</strong><br><br>Use Nord to unblock your usual streaming service and watch all the coverage of the "Boris Johnson: Into Ukraine's Kill Zone" online with our <em><strong>exclusive</strong></em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="a289f444-809a-11f1-aef0-d5efdbaaf507" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25="">View Deal</a></p></div><p>Using a VPN is incredibly simple, just follow these steps.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance if you're visiting the U.S. and want to view a U.K. service, you'd select a U.K. location from the server list.</p><p><strong>3. Sit back and enjoy the action. </strong>Head to Channel 5 and watch "Boris Johnson: Into Ukraine's Kill Zone" online just like you would at home.</p><h2 class="article-body__section" id="section-can-i-watch-boris-johnson-into-ukraine-s-kill-zone-outside-the-u-k"><span>Can I watch 'Boris Johnson: Into Ukraine's Kill Zone' outside the U.K.</span></h2><p>Unfortunately, it appears <strong>"Boris Johnson: Into Ukraine's Kill Zone" </strong>will not air in the likes of the U.S., Canada and Australia despite Channel 5 being owned by Paramount+.</p><p>If we hear any news about it, we'll be sure to update this page.</p><p>For now, if you're visiting the U.S., Canada, or Australia from the U.K., you can unlock Channel 5 and stream the show using <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>.</p><h2 class="article-body__section" id="section-boris-johnson-into-ukraine-s-kill-zone-all-you-need-to-know"><span>'Boris Johnson: Into Ukraine's Kill Zone' — all you need to know</span></h2><h2 id="boris-johnson-into-ukraine-s-kill-zone-trailer">'Boris Johnson: Into Ukraine's Kill Zone' trailer</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/2a9e8NRaCME" allowfullscreen></iframe></div></div><section class="article__schema-question"><h3>What else can I watch for free on Channel 5?</h3><article class="article__schema-answer"><p>Lots – from drama series like "Number One Fan" and "The Cuckoo" to historical factual shows like "Walking Tudor Britain" and "Digging Up Britain's Past". Traveling outside the country? Here's our guide to watching <a href="https://www.tomsguide.com/how-to/how-to-watch-uk-tv-abroad">watch U.K. TV from abroad</a>.</p></article></section><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/how-to-watch-the-real-wolf-of-wall-street">How to watch 'The Real Wolf of Wall Street’ online</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-salisbury-poisonings-a-spy-next-door">How to watch 'The Salisbury Poisonings: A Spy Next Door' online</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/im-a-true-crime-junkie-and-these-5-podcasts-are-the-only-ones-that-actually-keep-me-up-at-night" target="_blank">I’m a true crime junkie, and these 5 podcasts are the only ones that actually keep me up at night</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best movies leaving HBO Max soon that you should stream before they go —including an iconic action flick ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/3-best-movies-leaving-hbo-max-soon-that-you-should-stream-before-they-go-including-an-iconic-action-flick</link>
                                                                            <description>
                            <![CDATA[ From a literary romance to an action classic, here are 3 movies leaving HBO Max soon that you should stream before they're gone on July 31 ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">U8iyCqkw9LpsZBQZfwmr6E</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oURrxu3FbSgJKNSmt24c9D-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE.jpeg ]]></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/oURrxu3FbSgJKNSmt24c9D-1280-80.jpg">
                                                            <media:credit><![CDATA[HBO Max; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[HBO Max logo on orange film reel background]]></media:description>                                                            <media:text><![CDATA[HBO Max logo on orange film reel background]]></media:text>
                                <media:title type="plain"><![CDATA[HBO Max logo on orange film reel background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oURrxu3FbSgJKNSmt24c9D-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The beauty of the streaming model is that there's always something new to watch. The <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, including HBO Max, are always freshening up their extensive libraries with newly released films and TV series every few weeks, so that no two binge-watches have to be the same. </p><p>To make way for new content, however, the platforms have to regularly say goodbye to some pretty beloved flicks and shows every month, and July 2026 will be no exception for <a href="https://www.tomsguide.com/reviews/hbo-max">HBO Max</a>. As the month comes to an end, the streamer will part ways with an Oscar-nominated musical biopic centered on one of America's finest poets, a classic film adaptation of one of literature's most famous romances and an action franchise built around a true movie icon. </p><p>Here are three movies leaving HBO Max by July 31, and why you need to check them out before they're long gone. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="alien-covenant">'Alien: Covenant"</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/svnAD0TApb8" allowfullscreen></iframe></div></div><p>Ridley Scott returns to the acclaimed "Alien" franchise with this 2017 prequel film, which takes place 18 years before the original "Alien" movie and 11 years after that ill-fated expedition in "Prometheus." </p><p>Made up of Katherine Waterston, Billy Crudup and Danny McBride, among others, the crew of the colony ship Covenant is bound for a remote planet on the far side of the galaxy. However, upon meeting David (Michael Fassbender), who was a crewmember on the destroyed Prometheus ship, they quickly realize that their destination is less untouched paradise and more extraterrestrial nightmare when the planet's sinister inhabitants force the crew into a deadly fight for survival.</p><p><em><strong>Stream </strong></em><a href="https://play.hbomax.com/movie/7cb8cee4-2637-4dcb-a7c4-8b9d3f31f227" target="_blank" rel="nofollow"><em><strong>"Alien: Covenant" on HBO Max</strong></em></a><em><strong> before July 31</strong></em></p><h2 id="wuthering-heights">'Wuthering Heights'</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/XmuMd4FnnYo" allowfullscreen></iframe></div></div><p>Long before there was <a href="https://www.tomsguide.com/entertainment/movies/wuthering-heights-is-a-visual-beauty-with-intense-yearning-but-ultimately-leaves-a-sour-note">Jacob Elordi and Margot Robbie</a>, there was Laurence Olivier and Merle Oberon taking on the roles of Heathcliff and Catherine in William Wyler's legendary 1939 adaptation of the Emily Brontë novel. </p><p>Though the black-and-white romantic drama depicts only half of Brontë's Gothic classic and eliminates all of the second-generation characters (sorry kids!), it's widely acclaimed for its lush, deliciously melodramatic treatment of the source material. (For <a href="https://www.newyorker.com/magazine/1939/04/15/1939-04-15-099-tny-cards-000053252" target="_blank">The New Yorker</a>, John Mosher said the period film "approximates the quality of the fierce, tempestuous story with a force one might never have expected...Seldom has the tone of a great novel been so faithfully reproduced by the movie people.") </p><p>Wyler's "Wuthering Heights" went on to receive eight Oscar nominations, including for Best Picture, Best Director and Best Actor, and took home one for Gregg Toland's gorgeously moody cinematography. </p><p><em><strong>Stream </strong></em><a href="https://www.hbomax.com/movies/wuthering-heights/434f62be-c3e9-468d-a025-47e00c8afc39" target="_blank" rel="nofollow"><em><strong>"Wuthering Heights" on HBO Max</strong></em></a><em><strong> before July 31</strong></em></p><h2 id="john-wick">'John Wick'</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/2AUmvWm5ZDQ" allowfullscreen></iframe></div></div><p>Keanu Reeves added yet another iconic character to his decades-spanning filmography as the titular hitman of <a href="https://www.tomsguide.com/news/watch-the-john-wick-movies-in-order-online">the "John Wick" franchise</a>, which kicked off with the 2014 action thriller directed by Chad Stahelski and spawned three sequels thus far. (A <a href="https://www.tomsguide.com/news/john-wick-5">fifth "Wick" film</a> has been confirmed by Lionsgate and is reportedly in active development with both Keanu Reeves and director Chad Stahelski returning.)</p><p>All four "John Wick" movies are set to leave HBO Max on July 31, so now's your time to revisit the visionary action franchise, which revolves around a former hired gun who is reluctantly pulled out of retirement and thrust back into the criminal underworld and all the dark dangers therein. </p><p><em><strong>Stream </strong></em><a href="https://www.hbomax.com/movies/john-wick/1ff1cc37-0986-4574-895e-5ad8033e3857" target="_blank" rel="nofollow"><em><strong>"John Wick" on HBO Max</strong></em></a><em><strong> before July 31</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X851me"></div>                            </div>                            <script src="https://kwizly.com/embed/X851me.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/entertainment/hbo-max/new-on-hbo-max-in-july-2026-all-the-new-shows-and-movies-to-watch-this-month">New on HBO Max in July 2026: All the new shows and movies to watch this month</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/missed-it-in-theaters-stephen-kings-brutal-the-long-walk-is-the-newest-no-1-movie-on-hbo-max-and-not-sinners">Missed it in theaters? Stephen King's brutal 'The Long Walk' is the newest No. 1 movie on HBO Max (and not 'Sinners')</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/hbo-max-just-added-52-movies-here-are-the-5-im-streaming-first">HBO Max just added 52 movies — here are the 5 I’m streaming first</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon Alexa was down: outage affecting security systems and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/news/live/amazon-outage-july-23-2026</link>
                                                                            <description>
                            <![CDATA[ Amazon's Alexa voice assistant appears to be suffering an outage affecting the ability to contact systems. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iB5JtaesDBEns9aFtszgoT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5P7fpww3ZptYTqpHtaZvG4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 19:08:08 +0000</pubDate>                                                                                                                                <updated>Thu, 23 Jul 2026 19:33:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Home Security]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/5P7fpww3ZptYTqpHtaZvG4-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[An Echo Show 10 with the Alexa Plus logo displayed on screen]]></media:description>                                                            <media:text><![CDATA[An Echo Show 10 with the Alexa Plus logo displayed on screen]]></media:text>
                                <media:title type="plain"><![CDATA[An Echo Show 10 with the Alexa Plus logo displayed on screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5P7fpww3ZptYTqpHtaZvG4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon's Alexa voice assistant suffered an outage today. Starting around 11:30 a.m. Pacific, more than 2,000 reports suddenly hit the outage tracking site <a href="https://downdetector.com/status/amazon-alexa/" target="_blank">DownDetector</a>.</p><p>We also saw <a href="https://www.reddit.com/r/alexa/new/" target="_blank">reports on Reddit</a> with users asking if Alexa is down. My colleagues found delays in Alexa reporting announcements with Ring systems and the Alexa speakers weren't connecting. Some users on Reddit reported that newer Alexa devices were working but that older speakers were the main ones affected. </p><h2 id="sudden-spike-on-down-detector">Sudden spike on Down Detector</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:680px;"><p class="vanilla-image-block" style="padding-top:56.62%;"><img id="8BcxjJE6FRgY9PQucL7JCn" name="Screenshot 2026-07-23 120726" alt="Alexa outage 7-23-26" src="https://cdn.mos.cms.futurecdn.net/8BcxjJE6FRgY9PQucL7JCn.png" mos="" align="middle" fullscreen="" width="680" height="385" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DownDetector)</span></figcaption></figure><p>Starting around 11:30 am Pacific, a sudden spike of over 2,000 reports suddenly hit the outage tracking site on Down Detector.</p><p>Most users just reported it was down but a couple said that their Amazon speakers weren't working.</p><p>"No response to voice commands, lots of blue lights. affecting all 3 of my smart speakers," one person wrote.</p><h2 id="relay-between-ring-and-alexa-is-down">Relay between Ring and Alexa is down</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:1500px;"><p class="vanilla-image-block" style="padding-top:61.67%;"><img id="Rc4eYmTQ5QsoXuCkjBi9JB" name="Ring Battery Doorbell Pro (2nd gen)" alt="Ring Battery Doorbell Pro (2nd gen)" src="https://cdn.mos.cms.futurecdn.net/Rc4eYmTQ5QsoXuCkjBi9JB.jpg" mos="" align="middle" fullscreen="" width="1500" height="925" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Ring)</span></figcaption></figure><p>My colleague John Velasco confirmed that he is getting a delay on announcements from his Ring cameras to Alexa. </p><p>"My Alexa speakers don't announce people when my Ring cameras detect them," he said.</p><p>He had a minute delay he said.</p><h2 id="reports-dive-but-alexa-com-is-down">Reports dive but Alexa.com is down</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="ENcHRNWoHMSJgLLu7xM6sh" name="amazon alexa event 2025" alt="Amazon Alexa+ graphic" src="https://cdn.mos.cms.futurecdn.net/ENcHRNWoHMSJgLLu7xM6sh.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: Amazon )</span></figcaption></figure><p>On DownDetector reports have taken a nose dive with people reporting things back up.</p><p>However, I've found that Alexa.com is currently inaccessible. Is it down for you?</p><h2 id="multiple-reports-on-alexa-subreddit">Multiple reports on Alexa subreddit</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="WXPMeDCBrXbRBUA2FYPddf" name="reddit logo 1.shutterstock_2459885999" alt="Reddit app logo on a phone with blue screens in background" src="https://cdn.mos.cms.futurecdn.net/WXPMeDCBrXbRBUA2FYPddf.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>On the<a href="https://www.reddit.com/r/alexa/new/" target="_blank"> Alexa subreddit</a>, I've seen multiple reports from Alexa users saying that the platform is down.</p><p>"My Alexa platform is unresponsive and the app interface isn't working on either my iPhone or iPad. I have performed basic troubleshooting (cold boot device and iPhone) but still unresponsive. I can ask Alexa to turn on the lights and the device lights indicate that it hears me but does not perform the task. I can also ask about the weather. Same result. Light on device acknowledging being spoken to but nothing is done. is anyone," said one post.</p><p>I have seen some people saying that the outage is only affecting their older devices but not the newer ones.</p><h2 id="a-blip">A blip</h2><p>Well, it appears the outage is over. Lasting just about an hour, it's not clear what caused the Alexa platform to glitch today. </p><p>However, reports on DownDetector are at nearly zero and the systems we have  access to have started to receive normal announcements.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ While PC gamers fight for 16GB of VRAM, AMD just unveiled a rack with 31,000 Gigabytes ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/while-pc-gamers-fight-for-16gb-of-vram-amd-just-unveiled-a-rack-with-31-000-gigabytes</link>
                                                                            <description>
                            <![CDATA[ AMD just announced a 256-core CPU and a single server cabinet packing a staggering 31 terabytes of high-bandwidth VRAM! Here's what you need to know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Mqrn8DKLJCq4VdWZUeAyQ3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Q2aQikzLRuy3KY7ig3o93J-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 18:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[GPUs]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.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/Q2aQikzLRuy3KY7ig3o93J-1280-80.png">
                                                            <media:credit><![CDATA[AMD]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[AMD Instinct MI455X]]></media:description>                                                            <media:text><![CDATA[AMD Instinct MI455X]]></media:text>
                                <media:title type="plain"><![CDATA[AMD Instinct MI455X]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Q2aQikzLRuy3KY7ig3o93J-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It’s getting harder to ignore the widening silicon inequality gap in the tech world right now thanks to <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMageddon</a>. On one side, you have consumer PC gamers dealing with overpriced PC components, wondering if a standard 8-core CPU and 16GB of VRAM is enough to handle modern AAA games. On the other side, you have enterprise AI machines operating in a whole other universe of compute.</p><p>During its Advancing AI 2026 event, AMD announced an enormous 256-core CPU alongside the AMD Helios Rackscale solution — a single server cabinet packing a staggering 31 terabytes of high-bandwidth VRAM. No, these numbers are not typos!</p><p>Naturally, you can’t walk into your local Micro Center and buy one of these. Don’t get me wrong, the numbers are cool, but in a time where I might have to donate a kidney to afford a decent amount of RAM, it leaves a bad taste to see 31,000 gigabytes of it being (potentially) used to generate low-quality AI videos.</p><p>Here's what you need to know about AMD's enterprise CPU and server rack, along with how they stack up against a popular consumer GPU.</p><h2 id="the-256-core-cpu">The 256-Core CPU</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GJRqKLXQkf9MfgQBFGFCnd" name="AMD_EPYC_03" alt="AMD EPYC" src="https://cdn.mos.cms.futurecdn.net/GJRqKLXQkf9MfgQBFGFCnd.png" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AMD)</span></figcaption></figure><p>To put things into perspective, let’s consider the <a href="https://www.tomsguide.com/us/best-gaming-pc,review-2219.html">best gaming PCs</a>. A high-end gaming CPU like the Ryzen 9 9950X tops out at 16 cores, which is plenty for running <a href="https://www.tomsguide.com/opinion/cyberpunk-2077-is-finally-worth-buying-heres-why">Cyberpunk 2077</a> or editing 4K videos.</p><p>Conversely, AMD’s new 6th Gen EPYC 9006 Series (SP7) server processor packs up to 256 cores and 512 threads onto a single chip, with high-frequency variants like the EPYC 9006X pushing boost speeds up to 5.15GHz. That’s 16 times the core count of a flagship desktop processor. EPYC would be an entire LAN party on one chip.</p><p>So, what’s the need to have 256 cores on a single die? AMD built these chips specifically to handle the massive overhead of agentic AI. Modern AI agents have to run code in isolated sandboxes, manage huge system memory states, and coordinate heavy feeds. This all takes a massive amount of computing power and is a far cry from our gaming PCs having to render ray-traced shadows.</p><h2 id="helios-rackscale">Helios Rackscale</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PN9VkVCroTuYNMrp3e6Pk8" name="AMD_Instinct_MI455X_3" alt="AMD Instinct MI455X" src="https://cdn.mos.cms.futurecdn.net/PN9VkVCroTuYNMrp3e6Pk8.png" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AMD)</span></figcaption></figure><p>If you thought the CPU numbers sound wild, the RAM numbers are even more mind-blowing. The centerpiece of AMD’s announcement is the Helios Rackscale solution, which is an open-architecture AI system.</p><p>Inside a single server rack sit 18 compute trays holding a total of 72 AMD Instinct MI455X GPUs. Combined, this single cabinet delivers 31 terabytes (31,000 GB) of HBM4 VRAM with a whopping 1.7 petabytes per second of memory bandwidth.</p><p>For context, 31TB of VRAM is equivalent to roughly 1,937 <a href="https://www.tomsguide.com/computing/gpus/nvidia-geforce-rtx-5070-ti-review">Nvidia RTX 5070 Ti</a> graphics cards chained together! </p><p>These are insane numbers when compared to what a typical gaming GPU is packing. It’s definitely impressive, but at the same time, that’s offset by the knowledge that a good chunk of the world’s RAM is going to server racks like this.</p><h2 id="helios-rack-vs-rtx-5070-ti">Helios Rack vs. RTX 5070 Ti</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZeHAezdrSFQ9busZoowYUH" name="Nvidia GeForce RTX 5070 Ti" alt="Nvidia GeForce RTX 5070 Ti" src="https://cdn.mos.cms.futurecdn.net/ZeHAezdrSFQ9busZoowYUH.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>To give you an understanding of how monstrous a single Helios rack is, let’s compare its raw specs against one of the most popular upper-midrange consumer GPUs out now: The Nvidia RTX 5070 Ti (16GB GDDR7).</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Feature / Spec </strong></p></th><th  ><p><strong>Nvidia RTX 5070 Ti (desktop) </strong></p></th><th  ><p><strong>AMD Helios Rackscale solution </strong></p></th><th  ><p><strong>Performance equivalent </strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>VRAM capacity </strong></p></td><td  ><p>16GB GDDR7</p></td><td  ><p>31,000 GB (31 TB) HBM4</p></td><td  ><p>~1,937 RTX 5070 Tis</p></td></tr><tr><td class="firstcol " ><p><strong>Memory bandwidth </strong></p></td><td  ><p>896 GB/s</p></td><td  ><p>1.7 petabytes/sec (1,700,000 GB/s)</p></td><td  ><p>~1,897 RTX 5070 Tis streaming simultaneously </p></td></tr><tr><td class="firstcol " ><p><strong>Peak AI compute (FP4)</strong></p></td><td  ><p>~1,406 TFLOPS</p></td><td  ><p>2.9 exaflops (2,900,000 TFLOPS) </p></td><td  ><p>~2,062 RTX 5070 Tis firing at max throughput </p></td></tr><tr><td class="firstcol " ><p><strong>GPU count </strong></p></td><td  ><p>1 GPU</p></td><td  ><p>72 Instinct MI455X GPUs </p></td><td  ><p>1 unified server cabinet </p></td></tr></tbody></table></div><p>Looking at it through this lens, a single server rack packs the raw memory bandwidth of nearly 1,900 desktop PCs working in unison! This is a whole other level of computing, my friends.</p><h2 id="bottom-line-2">Bottom line</h2><p>AMD is certainly flexing its tech muscles with this announcement. However, there’s a sobering reality behind these staggering numbers. Seeing a single server rack hog 31 terabytes of high-bandwidth memory shows exactly where the global supply chain is funneling its resources. Namely, it’s all being swallowed by the AI boom (or bubble — however you see it). As a lifelong gamer, it hurts being pushed to the side.</p><p>Even if it stings, we can’t fault AMD for choosing to invest in more lucrative enterprise projects like this rather than in the average consumer. So, the next time you find yourself debating whether to pay a premium for a 16GB graphics card over an 8GB model, or wondering why PC component prices keep climbing, you now have a better idea of why.</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/hardware/sk-hynix-warns-2027-will-be-worst-year-for-ram-prices-right-as-a-damning-report-reveals-something-that-will-add-fuel-to-the-price-fixing-lawsuit">SK Hynix warns 2027 will be 'worst year' for RAM prices — right as a damning report reveals something that will add fuel to the price-fixing lawsuit</a></li><li><a href="https://www.tomsguide.com/ai/openai-just-made-its-biggest-move-against-nvidia-and-it-could-make-chatgpt-cheaper-to-run">OpenAI just made its biggest move against Nvidia — and it could make ChatGPT cheaper to run</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-seeks-ram-from-blacklisted-chinese-company-as-memory-shortage-impacts-everything-but-it-may-not-be-enough">Apple seeks RAM from blacklisted Chinese company as memory shortage impacts everything — but it may not be enough</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Jeff Bezos reportedly pushing for Prime Video overhaul that puts AI front and center ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/prime-video/jeff-bezos-reportedly-pushing-for-prime-video-overhaul-that-puts-ai-front-and-center</link>
                                                                            <description>
                            <![CDATA[ A new report claims Jeff Bezos is personally advocating for an AI-first overhaul of Prime Video. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">GCfR7zxVKusC2L8wiytg5n</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fZ72AHPgRrZVefGKSdC9Zk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 18:26:23 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/fZ72AHPgRrZVefGKSdC9Zk-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Jeff Bezos speaking at a VATECH event]]></media:description>                                                            <media:text><![CDATA[Jeff Bezos speaking at a VATECH event]]></media:text>
                                <media:title type="plain"><![CDATA[Jeff Bezos speaking at a VATECH event]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fZ72AHPgRrZVefGKSdC9Zk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Video could be getting an AI overhaul at the behest of Amazon founder Jeff Bezos, according to a new report. The redesign would put AI front and center under a new project allegedly dubbed Lighthouse.</p><p><a href="https://www.reuters.com/business/media-telecom/amazons-bezos-pushes-prime-video-redesign-focused-ai-2026-07-23/" target="_blank">Reuters</a> reports that the push from Bezos is meant as a way for Amazon to utilize its massive investments in AI and "elevate the company's stature in artificial intelligence." This comes as other investments, including improving the Alexa voice assistant, have provided mixed results and ongoing losses.</p><p>Bezos was "displeased" with a Prime Video presentation last fall where AI was not highlighted. The Lighthouse project was born out of this meeting.</p><h2 id="what-does-lighthouse-add-to-prime-video">What does Lighthouse add to Prime Video?</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="drYYfdJ36CcqYV9vHHGK6g" name="thelighthouse.jpg" alt="Best movies on Amazon: The Lighthouse" src="https://cdn.mos.cms.futurecdn.net/drYYfdJ36CcqYV9vHHGK6g.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: A24)</span></figcaption></figure><p>Bezos is said to be personally involved in the overhaul, an unusual step considering he relinquished the CEO title in 2021 to focus on the Washington Post and his spaceflight company Blue Origin.</p><p>Per Reuters, Lighthouse would add a slew of new features that would use AI to improve film and TV show recommendations. This would be done by having the AI learn customer preferences and respond to spoken requests.</p><p>A homepage redesign is part of the project, but it's not finalized, so it's not known how it would look yet. </p><p>However, it was suggested that it could include AI-driven titles with viewing suggestions like "Christmas rom-coms" or "action movies from the 1980s." Reportedly, a current version doesn't include text-heavy titles, so that even that appears to still be in the air.</p><p>Programs and live events like Thursday Night Football would still be promoted in the upper portion of the platform alongside the traditional search bar.</p><p>Amazon is also supposedly attempting to integrate Alexa into Prime Video's search function as part of the redesign. Most recently, Alexa was <a href="https://www.tomsguide.com/ai/alexa-release-date-cost-devices-and-all-the-new-ai-features">overhauled into a generative AI version</a> last year and integrated into the <a href="https://www.tomsguide.com/ai/alexa-just-got-a-major-upgrade-for-the-holidays-here-are-the-new-shopping-and-home-features-im-most-excited-about">Amazon shopping platform</a> earlier this year.</p><h2 id="where-prime-video-stands">Where Prime Video stands</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="zWqHCpTxYNgNF2cEkpZ93U" name="primevideo-logo-blueelectric" alt="Prime Video logo on blue electric currents background" src="https://cdn.mos.cms.futurecdn.net/zWqHCpTxYNgNF2cEkpZ93U.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: Prime Video; Shutterstock)</span></figcaption></figure><p>Amazon last gave <a href="https://www.tomsguide.com/entertainment/streaming/prime-video-is-getting-a-massive-redesign-heres-whats-new">Prime Video a massive update </a>in July of 2024 that streamlined content curation and added AI recommendations.</p><p>The most r<a href="https://www.nielsen.com/news-center/2025/youtube-netflix-ride-the-wave-of-summer-streaming-highs-in-nielsens-media-distributor-gauge/">ecent Nielsen data from 2025</a> has Prime Video in a distant eighth place in TV viewing share behind YouTube, Netflix and Disney+ at 3.9% of viewers. Reuters reports that it's bumped up to 4.2% this year, though still behind Netflix and Disney.</p><p>An AI overhaul could be a way for the company to utilize both its artificial intelligence investments and increase viewership with more personalized recommendations.</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/amazon-prime-usd2-5-billion-settlement-deadline-is-days-away-heres-how-to-claim-your-share">Amazon Prime $2.5 billion settlement deadline is days away — here's how to claim your share</a></li><li><a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">Read anywhere with the best Kindle and e-readers we tested for books, comics and note-taking</a></li><li><a href="https://www.tomsguide.com/computing/e-readers/sorry-kindle-but-i-still-prefer-reading-comic-books-on-my-ipad">Sorry, Kindle — but I still prefer reading comic books on my iPad</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Elon Musk says Grok is making a 'historically accurate' AI Odyssey movie — here's what we know ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/elon-musk-says-grok-is-making-a-historically-accurate-ai-odyssey-movie-heres-what-we-know</link>
                                                                            <description>
                            <![CDATA[ Elon Musk says Grok is making a 'historically accurate' AI movie based on The Odyssey. Here's what we know about xAI's ambitious filmmaking plans. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">K8tLgmiicoV5cUcMQs9D5i</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/npK5HCGmxVph7YMwyfVxJ5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 17:35:21 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[AI Image &amp; Video]]></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.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/npK5HCGmxVph7YMwyfVxJ5-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Elon Musk next to Grok on phone]]></media:description>                                                            <media:text><![CDATA[Elon Musk next to Grok on phone]]></media:text>
                                <media:title type="plain"><![CDATA[Elon Musk next to Grok on phone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/npK5HCGmxVph7YMwyfVxJ5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Elon Musk has never been one to shy away from ambitious promises, and his latest claim may be one of his boldest yet. In a <a href="https://x.com/elonmusk/status/2079758604656316619" target="_blank">recent post on </a>X, the xAI founder said Grok is working on a full-length, AI-generated adaptation of "The Odyssey" that he described as "historically accurate."</p><p>It's a bold claim, for sure. AI video tools like<a href="https://www.tomsguide.com/ai/ai-image-video/runway-unveils-gen-3-ai-video-just-took-a-big-leap-forward"> Runway Gen-3</a> and <a href="https://www.tomsguide.com/ai/ai-image-video/luma-dream-machine-ai-video-generator-is-getting-a-huge-update-heres-whats-in-store">Luma Dream Machine</a> have already shown they can produce impressive short clips, but creating a coherent feature-length film is a much bigger challenge. If Musk's vision becomes reality, it would push AI video well beyond the short demonstrations we've seen so far.</p><p>Here's what we know — and why Musk's choice of the phrase "historically accurate" has sparked discussion.</p><h2 id="the-ai-race-heads-to-hollywood">The AI race heads to Hollywood</h2><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">Before this year ends, Grok Imagine will make a full-length movie of The Odyssey that is historically accurate and true to the art of Homer https://t.co/bVHzUmY9WN<a href="https://twitter.com/cantworkitout/status/2079758604656316619">July 22, 2026</a></p></blockquote><div class="see-more__filter"></div></div><p>Until now, Grok has been best known as the chatbot built into X. An AI-generated movie would represent a major expansion of xAI's ambitions, suggesting the company wants to compete in AI video generation.</p><p>The choice of "The Odyssey" is particularly ambitious. Homer's epic follows Odysseus on his long journey home after the Trojan War, combining ancient Greek settings with legendary creatures, gods and mythological events. Re-creating that story would require AI to maintain consistent characters, environments and visual style across thousands of shots — something today's video models still struggle to do reliably.</p><p>Musk's description of the film as "historically accurate" also appears to be a response to the recent debate surrounding Christopher Nolan's adaptation of "The Odyssey," which grossed more than $300 million in its opening weekend. </p><p>Some of the film's casting choices — such as Academy Award-winner Lupita Nyong'o as Helen of Troy and Elliot Page as Sinon — sparked online arguments from right-wing commentators over whether modern adaptations should strictly follow Homer's descriptions of key characters. Musk was among those criticizing what he saw as departures from the original text.</p><p>At the same time, "The Odyssey" isn't a historical record. It's an ancient Greek epic that blends elements of the Bronze Age with mythology, including gods, monsters and supernatural events. So when Musk talks about 'historical accuracy,' he's likely referring to a faithful interpretation of Homer's descriptions and the story's ancient Greek setting, rather than suggesting the events themselves literally happened.</p><p>While AI can already generate remarkably realistic scenes lasting a few seconds, maintaining continuity across an entire feature film remains one of the industry's biggest technical hurdles.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQwmzX"></div>                            </div>                            <script src="https://kwizly.com/embed/WQwmzX.js" async></script><h2 id="what-does-historically-accurate-actually-mean">What does 'historically accurate' actually mean?</h2><p>Musk's choice of words doesn't appear to be accidental. Christopher Nolan's upcoming adaptation of "The Odyssey" has been at the center of online debate over several casting decisions, particularly the casting of Lupita Nyong'o. Critics, including Musk, argued that changing the appearance of mythological characters departed from Homer's descriptions, while others countered that "The Odyssey" is a work of mythology rather than literal history and has been reinterpreted countless times over the centuries.</p><p>The debate quickly expanded beyond the film itself, becoming part of a broader cultural argument over historical representation, artistic freedom and diversity in modern adaptations. Musk weighed in multiple times on X, criticizing what he viewed as unnecessary departures from the original text.</p><p>Against that backdrop, his promise that Grok will create a "historically accurate" version of "The Odyssey" looks more like a statement about how he believes the story should be portrayed.</p><h2 id="can-grok-actually-pull-it-off">Can Grok actually pull it off?</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="hBhUy8t3CJddkWbV6eD8J8" name="MuskGrok" alt="Elon Musk's face over Grok AI logo" src="https://cdn.mos.cms.futurecdn.net/hBhUy8t3CJddkWbV6eD8J8.jpg" 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: VINCENT FEURAY / Getty Images)</span></figcaption></figure><p>As with many Musk announcements, it's worth treating both the timeline and the scope of the project with some caution. Producing a feature-length movie isn't just about generating convincing visuals. It also requires a cohesive screenplay, believable dialogue, voice performances, music, editing and scene-to-scene continuity.</p><p>Musk hasn't shared many technical details about how Grok would handle those challenges, and xAI has yet to demonstrate a publicly available system capable of generating a full-length film.</p><p>Still, the announcement highlights how quickly AI video is evolving. Just a few years ago, generating even a few seconds of realistic footage seemed out of reach. Now, companies are openly talking about feature-length productions.</p><p>Whether Grok ultimately delivers on Musk's promise remains to be seen. But if it can produce a watchable, coherent feature-length film rather than a collection of impressive clips, it would represent one of the biggest milestones AI video has reached so far.</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-asked-chatgpt-to-improve-my-apple-notes-app-here-are-the-7-changes-i-actually-kept"><strong>I asked ChatGPT to improve my Apple Notes app — here are the 7 changes I actually kept</strong></a></li><li><a href="https://www.tomsguide.com/ai/microsoft-copilots-free-deep-research-ai-tool-is-going-away-these-are-the-7-best-free-alternatives"><strong>Microsoft Copilot’s free Deep Research AI tool is going away — these are the 7 best free alternatives</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-always-recommend-the-chatgpt-escape-prompt-to-friends-looking-for-a-new-job-heres-why-it-works"><strong>I always recommend the ChatGPT 'Escape Prompt' to friends looking for a new job — here's why it works</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft Copilot’s free Deep Research AI tool is going away — these are the 7 best free alternatives ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/microsoft-copilots-free-deep-research-ai-tool-is-going-away-these-are-the-7-best-free-alternatives</link>
                                                                            <description>
                            <![CDATA[ Now that the Deep Research AI tool is being retired from Microsoft Copilot, check out these 7 free alternatives to fulfill your AI research needs. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HzV3MEj793jn2pFC5GYj4K</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EPQSVMjySTNj4u35tMstwD-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 15:49:29 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM.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/EPQSVMjySTNj4u35tMstwD-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[microsoft copilot]]></media:description>                                                            <media:text><![CDATA[microsoft copilot]]></media:text>
                                <media:title type="plain"><![CDATA[microsoft copilot]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EPQSVMjySTNj4u35tMstwD-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Microsoft is reducing free features for users. Microsoft Whiteboard now requires you to have a Microsoft Business account if you want to continue using it; the meeting preparation feature embedded in Microsoft Outlook asks you to purchase a Microsoft 365 Copilot license and Copilot Podcasts are being discontinued altogether. Now another feature that was once free of charge is being taken away from Microsoft users and replaced by a paid option.</p><p>The Deep Research feature, once available at no extra cost to Microsoft Copilot users, is now being retired, <a href="https://support.microsoft.com/en-us/microsoft-copilot/deep-research-in-microsoft-copilot">starting August 18, 2026</a>. And after it’s gone, you’ll be required to get a Microsoft 365 Premium subscription to create the reports and analyses you’re used to doing with Copilot with the all-new Researcher AI tool.</p><p>While your previously generated Deep Research content won’t be deleted and will be accessible through Researcher, it’s a bit of a bummer to know that you’ll only be able to get back to it via a required payment.</p><p>If this news disappoints you as much as it did for me, then consider giving these alternative AI tools a try if you’re looking for more ways to conduct your research.</p><h2 id="try-out-these-free-options-to-continue-generating-detailed-reports">Try out these free options to continue generating detailed reports </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:4082px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qN9CfvKTgD2P2SdCQcDEtH" name="shutterstock_2486442525-2" alt="perplexity ai" src="https://cdn.mos.cms.futurecdn.net/qN9CfvKTgD2P2SdCQcDEtH.jpg" mos="" align="middle" fullscreen="" width="4082" height="2296" 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><strong>Perplexity</strong> stands out as one of the top options that can fulfill all your Copilot Deep Research needs. Since its biggest selling point is backing up its data via valid citations and easily verifiable claims, you can rely on its real-time web search to get the fast results you’re looking for. Conducting everyday research on general news, products and academics should work just fine if you consider using Perplexity’s free tier.</p><p><strong>Claude</strong> is one of the strongest AI analysts you can utilize—it’s capable of generating long-form explanations, providing you with legit citations and offers “Connectors” such as PubMed, bioRxiv and Consensus that act as research databases. </p><p><strong>Google Gemini</strong> taps into all the latest information injected into Google Search to analyze and synthesize all the data you’re looking for from multiple webpages. Researching all manner of topics through Gemini is another free AI research tool alternative worth considering as well. Gemini’s Google Workspace integration is also great if you’re looking to export your deep research reports to Google Docs or download as a PDF.</p><p><strong>Gemini Notebook </strong>(formerly known as NotebookLM) is an amazing AI research tool as it allows you to upload your own sources to create your own study material. Injecting your notebooks with PDFs, research papers, notes, Google Docs, etc. helps Gemini Notebook get all the information it needs to answer any questions you may have about your current research topic. Being able to turn your notebooks into Audio & Video Overviews, Slide Decks, Quizzes, Flashcards, etc. also stands out as some of the best ways Gemini Notebook handles your research sessions.</p><p><strong>ChatGPT </strong>is known far and wide as the mainstream AI tool that your everyday AI chatbot user makes use of. Presenting it with super descriptive prompts (a good example of that being "Research the current AI landscape in 2026. Compare OpenAI, Google, Anthropic, Microsoft and Meta. Include recent developments, strengths, weaknesses, market positioning, and cite sources”) helps it handle deep research tasks with more clarity. ChatGPT comes in handy when you’re looking to learn about new subjects, have the most complex topics explained to you in simpler terms and have research data built into structured reports.</p><p><strong>Elicit </strong>stands tall as one of the best AI research tools for users interested in deep academic literature discovery and structured data extraction. Students and professional researchers can definitely put their trust in this option since it cites 138 million academic papers and 545,000 clinical trials (with more scientific data sources set to arrive later). </p><p>And finally, <strong>Google AI Mode </strong>is a viable pick when you’re looking for a web research option that can handle any tasks you once gave to Copilot’s Deep Research tool. Since it’s readily available inside the Google Search bar, it’s great for comparing products, simplifying complex subjects, comparing viewpoints and discovering up-to-date information.</p><h2 id="bottom-line-3">Bottom line</h2><p>While the news of Microsoft Copilot’s Deep Research feature going away and being replaced by a mandatory paid option breaks our hearts, it’s less painful when you consider the wide range of free options you can use to replace it. It’s worth keeping in mind that chatbots are prone to hallucinating, which should compel you to always double-check every bit of information it sends your way. But for the most part, the seven AI deep research tools I’ve made you aware of are mostly dependable and worthy of your time.</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-asked-chatgpt-to-improve-my-apple-notes-app-here-are-the-7-changes-i-actually-kept" target="_blank">I asked ChatGPT to improve my Apple Notes app — here are the 7 changes I actually kept</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt-just-gave-me-the-ultimate-mcu-recap-heres-how-to-watch-the-marvel-films-and-shows-in-order-before-avengers-doomsday" target="_blank">ChatGPT just gave me the ultimate 'Avengers: Doomsday' cheat sheet — how to watch Marvel films and shows in the right order</a></li><li><a href="https://www.tomsguide.com/ai/i-always-recommend-the-chatgpt-escape-prompt-to-friends-looking-for-a-new-job-heres-why-it-works" target="_blank">I always recommend the ChatGPT 'Escape Prompt' to friends looking for a new job — here's why it works</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget pulling weeds — this one unlikely item in your toolbox can make all the difference ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/gardening/forget-pulling-weeds-this-one-unlikely-item-in-your-toolbox-can-make-all-the-difference</link>
                                                                            <description>
                            <![CDATA[ Tired of pulling weeds? This one DIY tool you already own could make light work of a back-breaking task this summer. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ki3JZ6KKnstfhBbuS9WUin</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5Wxpg9xgc4PbmDb2uxMoh7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 12:09:34 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gardening]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Outdoors]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.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/5Wxpg9xgc4PbmDb2uxMoh7-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[person removing weeds growing in yard ]]></media:description>                                                            <media:text><![CDATA[person removing weeds growing in yard ]]></media:text>
                                <media:title type="plain"><![CDATA[person removing weeds growing in yard ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5Wxpg9xgc4PbmDb2uxMoh7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If there is one gardening chore that always feels like a losing battle, it’s dealing with those pesky weeds. </p><p>Whether they’re taking over my lawn and paved patio or surfacing between the gravel in my front yard — they seem to be everywhere and completely ruin the look of my outdoor space.</p><p>And while I’ve tried everything from commercial weed killers to homemade <a href="https://www.tomsguide.com/home/gardening/3-natural-ways-to-remove-dandelions-for-a-weed-free-lawn">natural hacks</a>, experts all agree that nothing beats pulling the taproot up by hand or with the right weeding tool. </p><p>Although there are <a href="https://www.tomsguide.com/home/i-bought-the-viral-grampas-weeder-and-its-my-favorite-gardening-tool-heres-why">various specialty tools like Grampa’s Weeder</a> to spare your back from the strain, you don’t always need to splash out on new gear. I’ve just stumbled across one clever alternative that handles the hard work for you, and it’s likely already sitting in your toolkit or among your leftover decorating supplies.</p><p>Here’s why your painter’s tool could be a game-changer in the backyard. </p><div class="product"><a data-dimension112="fb4474a2-867a-11f1-ad05-0b3e25559cac" data-action="Deal Block" data-label="This 5-in-1 decorating tool can act as an effective weed puller. Simply use the sharp edges to work into the crevices of patio stones and dig into smaller areas to pull up weeds easily." data-dimension48="This 5-in-1 decorating tool can act as an effective weed puller. Simply use the sharp edges to work into the crevices of patio stones and dig into smaller areas to pull up weeds easily." data-dimension25="$7" href="https://www.amazon.com/Bates-Paint-Scraper-Painters-Wallpaper/dp/B071XDP685" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1195px;"><p class="vanilla-image-block" style="padding-top:125.52%;"><img id="tecUCxLosXkLkgn9LPX4DT" name="Bates- Paint Scraper" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tecUCxLosXkLkgn9LPX4DT.jpg" mos="" align="middle" fullscreen="" width="1195" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 5-in-1 decorating tool can act as an effective weed puller. Simply use the sharp edges to work into the crevices of patio stones and dig into smaller areas to pull up weeds easily.<a class="view-deal button" href="https://www.amazon.com/Bates-Paint-Scraper-Painters-Wallpaper/dp/B071XDP685" target="_blank" rel="nofollow" data-dimension112="fb4474a2-867a-11f1-ad05-0b3e25559cac" data-action="Deal Block" data-label="This 5-in-1 decorating tool can act as an effective weed puller. Simply use the sharp edges to work into the crevices of patio stones and dig into smaller areas to pull up weeds easily." data-dimension48="This 5-in-1 decorating tool can act as an effective weed puller. Simply use the sharp edges to work into the crevices of patio stones and dig into smaller areas to pull up weeds easily." data-dimension25="$7">View Deal</a></p></div><h3 class="article-body__section" id="section-how-to-use-a-painters-tool-to-remove-weeds"><span>How to use a painters tool to remove weeds</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:1500px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="vEiCS63FSmpQ2vuwsNTKjP" name="Bates- Paint Scraper" alt="Bates- Paint Scraper" src="https://cdn.mos.cms.futurecdn.net/vEiCS63FSmpQ2vuwsNTKjP.jpg" mos="" align="middle" fullscreen="" width="1500" height="844" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Bates- Paint Scraper 5-in-1 tool </span><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p>It turns out that your painter’s scraper or 5-in-1 tool can do so much more than just remove wallpaper. Experts have suggested it as an effective tool for getting into awkward spots to tackle weeds, especially in the tiniest of cracks.</p><p>Simply use the pointed end of this tool to get into those tight spots. In fact, the sharp edges are perfect for reaching into tiny crevices in patio pavers or driveways to pull out those persistent garden intruders.</p><p>In addition, this versatile multi-tool is great for clearing away thick moss, digging out deep-seated roots, or even cutting through bags of compost and soil. So it’s a win-win. </p><p>Whenever you can, using a scraper is much more efficient than the back-breaking task of hand-pulling. But if you prefer the manual method, experts agree you must remove the entire taproot to ensure those persistent weeds don't resurface. </p><p>“If you are dealing with weeds with deep taproots, such as thistle or dandelion, you need to remove all of the taproot growth if you do not want them to come back,” states Angelika Zaber, lawn care specialist and gardening expert at <a href="https://www.onlineturf.co.uk/" target="_blank">Online Turf.</a> </p><p>“This can be done by digging out the taproots using hand forks or trowels."</p><p>So before you head out to buy expensive weeding gear, you might want to take a look at your existing toolkit or leftover DIY stash for a clever weeding alternative.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5lgne"></div>                            </div>                            <script src="https://kwizly.com/embed/W5lgne.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/home/7-ways-to-banish-weeds-from-your-lawn-that-wont-harm-the-grass">7 tips to banish weeds from your lawn that won't harm the grass</a></li><li><a href="https://www.tomsguide.com/home/this-aluminum-foil-hack-keeps-birds-away-from-grass-seed-and-it-actually-works">This aluminum foil hack keeps birds away from grass seed — and it actually works</a></li><li><a href="https://www.tomsguide.com/home/5-easy-tips-to-fix-bare-patches-on-your-lawn-this-spring">5 easy tips to fix bare patches on your lawn this spring</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Who Wants to Be a Millionaire' online — stream the Jimmy Kimmel quiz show from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/how-to-watch-who-wants-to-be-a-millionaire-online</link>
                                                                            <description>
                            <![CDATA[ Big money is on offer once more as Jimmy Kimmel poses the questions - here's how to watch "Who Wants to Be a Millionaire" online and potentially for free. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pamTUwEi4Q6H2s6yW32iJT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/QX9hbYH9F7e36WX7U5N353-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 11:29:21 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.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/QX9hbYH9F7e36WX7U5N353-1280-80.jpg">
                                                            <media:credit><![CDATA[ABC]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Jimmy Kimmel is the host of &quot;Who Wants To Be A Millionaire&quot; in the U.S.]]></media:description>                                                            <media:text><![CDATA[Jimmy Kimmel is the host of &quot;Who Wants To Be A Millionaire&quot; in the U.S.]]></media:text>
                                <media:title type="plain"><![CDATA[Jimmy Kimmel is the host of &quot;Who Wants To Be A Millionaire&quot; in the U.S.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/QX9hbYH9F7e36WX7U5N353-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Jimmy Kimmel returns to quiz hopeful contestants looking to win big in the U.S. version of "Who Wants To Be A Millionaire."</p><p>Here's <strong>how to watch "Who Wants To Be A Millionaire" online and </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> </strong>and potentially for FREE.</p><div  class="fancy-box"><div class="fancy_box-title">"Who Wants To Be A Millionaire" - Date, start time, TV channel, streaming info</div><div class="fancy_box_body"><p class="fancy-box__body-text">You can watch "Who Wants To Be A Millionaire" on <strong>ABC </strong>in the U.S. with the first episode airing on <strong>Wednesday, July 22</strong>. You can also catch the show the next day on Hulu.<br><strong>• FREE — Watch on ABC via </strong><a data-analytics-id="inline-link" href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>YouTube TV with a free trial</strong></a> (U.S.)<br><strong>• U.S. — </strong>ABC via <a data-analytics-id="inline-link" href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow">YouTube TV</a> / <a data-analytics-id="inline-link" href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2AivFEQ&offerid=763711.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow">Hulu</a> (next day)<br><strong>• Watch anywhere —</strong> with <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a></p></div></div><p>The latest season of "Who Wants To Be A Millionaire" will be a celebrity special, with 16 famous contestants queuing up to try and nab the $1,000,000 for charity. Among those taking part, we'll see "Seinfeld" icon Jason Alexander, acclaimed actors Will Forte, Paul Giamatti and Jesse Eisenberg, and one of the biggest names in Hollywood, Ben Affleck.</p><p>The beauty of that last name is that host Jimmy Kimmel has a long-standing fake feud with Matt Damon, so we're sure that topic will arise while he's putting questions to Affleck. All of the celebs will pair up and have a go at cliaming the top prize, but as we know, answering those 15 questions is easier said than done.</p><p>Read on for everything you need to know about <strong>how to watch "Who Wants To Be A Millionaire" online</strong> from anywhere and potentially for free.</p><h2 id="how-to-watch-who-wants-to-be-a-millionaire-for-free">How to watch 'Who Wants To Be A Millionaire' for FREE</h2><p>Viewers in America can catch (at least some of) "Who Wants To Be A Millionaire" for free by signing up to a <a href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>free-trial of YouTube TV</strong></a> and accessing ABC that way.</p><p>They currently offer a 5-day free trial, meaning you can already catch one bumper episode for nothing.</p><p>The only catch is you'll have to pay for the service once your free trial ends (duration of trial can vary). That costs $67.99/month for the first five months, and $82.99/month thereafter.</p><h2 class="article-body__section" id="section-how-to-watch-who-wants-to-be-a-millionaire-from-anywhere"><span>How to watch 'Who Wants To Be A Millionaire' from anywhere</span></h2><p>Away from home at the moment and blocked from watching "Who Wants To Be A Millionaire" on your usual subscription or <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>?</p><p>You can still watch the show thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn" target="_blank">VPN</a> (Virtual Private Network) which makes your device appear to be in another country. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>. It's the best on the market:</p><div class="product"><a data-dimension112="8e229ddc-7f85-11f1-b0e2-351ea6f06fc1" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="BFyGSpvzxBqqUsYoFvjPYR" name="NordVPN square deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BFyGSpvzxBqqUsYoFvjPYR.jpg" mos="" align="middle" fullscreen="" width="200" height="200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="8e229ddc-7f85-11f1-b0e2-351ea6f06fc1" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25=""><strong>NordVPN deal: 3 Months Extra FREE</strong></a></p><p>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.</p><p><strong>✅ Up to 75% off usual price</strong><br><strong>✅ 3 months extra FREE!</strong><br><strong>✅ Unlocks streaming services</strong></p><p>Use Nord to unblock your usual streaming service and watch "Who Wants To Be A Millionaire" anywhere with our <em><strong>exclusive</strong></em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="8e229ddc-7f85-11f1-b0e2-351ea6f06fc1" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-how-to-watch-who-wants-to-be-a-millionaire-in-the-u-s"><span>How to watch 'Who Wants To Be A Millionaire' in the U.S.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="UHZYAaZCSyV7FkHxYGxtJ6" name="TG_US_Flag_1920_400_shutterstock.jpg" alt="US flag" src="https://cdn.mos.cms.futurecdn.net/UHZYAaZCSyV7FkHxYGxtJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" 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>American viewers can catch "Who Wants To Be A Millionaire" on <strong>ABC from Wednesday, July 22 at 8 p.m. ET</strong>. It is also available to stream on <a href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2AivFEQ&offerid=763711.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>Hulu</strong></a> the following day. New episodes will air weekly on Wednesday nights from then onwards.</p><p><strong>Don't have cable?</strong> ABC is available to stream via <a href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>YouTube TV and you can get a free trial</strong></a> of that service. <a href="https://www.sling.com/" target="_blank" rel="nofollow">Sling TV</a>and <a href="https://www.fubo.tv/" target="_blank" rel="nofollow">Fubo</a> are other options.</p><p><strong>Abroad? </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> can unlock your stream of "Who Wants To Be A Millionaire".</p><h2 class="article-body__section" id="section-can-you-watch-who-wants-to-be-a-millionaire-in-canada"><span>Can you watch 'Who Wants To Be A Millionaire' in Canada?</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="eByagaoLZki73CLtYaRPMG" name="TG_Canada_Flag_1920_400_shutterstock.jpg" alt="Canada Flag" src="https://cdn.mos.cms.futurecdn.net/eByagaoLZki73CLtYaRPMG.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" 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>Unfortunately, 'Who Wants to Be a Millionaire" will not air in Canada.</p><p>Visiting the Great White North from the U.S.? <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> can unlock your stream of "Who Wants To Be A Millionaire".</p><h2 class="article-body__section" id="section-can-you-watch-who-wants-to-be-a-millionaire-in-the-u-k"><span>Can you watch 'Who Wants To Be A Millionaire' in the U.K.?</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="ttCSpj8r9kHj68j7NhsBL9" name="TG_British_Flag_1920_400_shutterstock.jpg" alt="British flag" src="https://cdn.mos.cms.futurecdn.net/ttCSpj8r9kHj68j7NhsBL9.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>"Who Wants To Be A Millionaire" will not be broadcast in the U.K. on any linear TV channel or streaming platform.</p><p>They do however have their own version, broadcasted by <a href="https://www.itv.com/watch/who-wants-to-be-a-millionaire/33753" target="_blank" rel="nofollow"><strong>ITV</strong></a>.</p><p><strong>Visiting the U.K.?</strong> Use <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> to change your location back to the U.S. and watch "Who Wants To Be A Millionaire" from anywhere.</p><h2 class="article-body__section" id="section-can-you-watch-who-wants-to-be-a-millionaire-in-australia"><span>Can you watch 'Who Wants To Be A Millionaire' in Australia?</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="R4wb8TX7wmafWv7eBYfay3" name="TG_australia_Flag_1920_400_shutterstock.jpg" alt="Australia flag" src="https://cdn.mos.cms.futurecdn.net/R4wb8TX7wmafWv7eBYfay3.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>You'll face similar issues in Australia, with "Who Wants To Be A Millionaire" not having a broadcast or streaming deal in place.</p><p><strong>If you're just visiting Oz</strong>, you can can gain access to your usual streaming services with <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></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/disney-plus/disney-is-finally-merging-your-hulu-profile-into-the-streaming-service-heres-what-you-need-to-know">Disney+ is finally merging your Hulu profile into the streaming service — here's what you need to know</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-password-season-3">How to watch 'Password' season 3 online — stream the Jimmy Fallon quiz show from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-homestead-rescue-intervention-online">How to watch 'Homestead Rescue: Intervention' online</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Stuart Fails to Save the Universe' — stream 'Big Bang Theory' spin-off online from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/watch-stuart-fails-to-save-the-universe</link>
                                                                            <description>
                            <![CDATA[ The 'Big Bang Theory' comic book store owner brings about a potential apocalypse in multiversal spin-off. Here's how to watch 'Stuart Fails to Save the Universe' online wherever you are in the world. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WJVrocLLMLwGWkWxbvjRVo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HUWwUaV6XCR27fFfYC5XVb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom Wardley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/XvemTAehp4KGqevwPtrdCb.jpeg ]]></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/HUWwUaV6XCR27fFfYC5XVb-1280-80.jpg">
                                                            <media:credit><![CDATA[HBO Max]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Brian Posehn, Kevin Sussman, Lauren Lapkus in Stuart Fails to Save the Universe]]></media:description>                                                            <media:text><![CDATA[Brian Posehn, Kevin Sussman, Lauren Lapkus in Stuart Fails to Save the Universe]]></media:text>
                                <media:title type="plain"><![CDATA[Brian Posehn, Kevin Sussman, Lauren Lapkus in Stuart Fails to Save the Universe]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HUWwUaV6XCR27fFfYC5XVb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It may have all started with a big bang, but it could end with an apocalypse if “The Big Bang Theory’s” hapless comic-book store owner doesn’t get his act together. Here’s how to watch “Stuart Fails to Save the Universe" online<a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"> <strong>from anywhere with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Stuart Fails to Save the Universe' streaming details, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Stuart Fails to Save the Universe" premieres on Thursday, July 23.<br><strong>• U.S., U.K. & AU </strong>— <a data-analytics-id="inline-link" href="https://www.hbomax.com/" target="_blank" rel="nofollow">HBO Max</a><br><strong>• CA </strong>— <a data-analytics-id="inline-link" href="https://www.crave.ca/en" target="_blank" rel="nofollow">Crave</a><br><strong>• Watch anywhere — try </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk-free</strong></a></p></div></div><p>Following “<a href="https://www.tomsguide.com/entertainment/streaming/watch-young-sheldon-season-7-online">Young Sheldon</a>” and “<a href="https://www.tomsguide.com/entertainment/paramount-plus/watch-georgie-and-mandys-first-marriage-online">Georgie & Mandy’s First Marriage</a>,” “Stuart Fails to Save the Universe” is the third spin-off from “The Big Bang Theory,” but the first to follow directly from the OG show. Creator Chuck Lorre has said he’s looking to “do something radical” with the new show, and it <a href="https://www.tomsguide.com/entertainment/hbo-max/hbo-max-just-confirmed-a-new-big-bang-theory-spinoff-and-its-nothing-like-young-sheldon">very much looks like we’re stepping out of the cozy comedy comfort zone for this installment</a>. </p><p>As the title implies, the new show follows Stuart (Kevin Sussman), owner of the comic book store where our original gang spent so much time hanging out and debating every corner of geek culture. Following the events of the original series, Stuart accidentally breaks a quantum device, built by Sheldon and Leonard, no less, triggering an apocalyptic, multiverse-spanning Armageddon.</p><p>Taking it upon himself to fix fractured reality, Stuart embarks on a universe-hopping adventure with girlfriend Denise (Lauren Lapkus), geologist Bert (Brian Posehn), and physicist and one-time Sheldon rival Barry Kripke (John Ross Bowie) along for the ride.</p><p>With echoes of "Future Man" and "Sliders", the 10-episode series will see the group hop from one universe to another as they try to restore the multiverse. None of the other original "The Big Bang Theory" cast members have been confirmed to return. However, we wouldn't be surprised to see a few alternate-selves cameos before the season is over.</p><p>Sounding more like the sort of sci-fi extravaganza our four favourite nerds would (hate) watch than anything the franchise has delivered previously, the new adventures of Stuart and co. are an intriguing must-watch for "The Big Bang Theory" fans. Read on to discover how to watch "Stuart Fails to Save the Universe" online from anywhere.</p><h3 class="article-body__section" id="section-how-to-watch-stuart-fails-to-save-the-universe-online-in-the-u-s"><span>How to watch 'Stuart Fails to Save the Universe' online in the U.S.</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="UHZYAaZCSyV7FkHxYGxtJ6" name="TG_US_Flag_1920_400_shutterstock.jpg" alt="US flag" src="https://cdn.mos.cms.futurecdn.net/UHZYAaZCSyV7FkHxYGxtJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>"Stuart Fails to Save the Universe" premieres on July 23, with episodes dropping every <strong>Thursday </strong>at <strong>9 p.m. ET / 6 p.m. PT</strong> on on <a href="https://www.hbomax.com/" target="_blank" rel="nofollow"><strong>HBO Max</strong></a>.</p><p>Prices start at $10.99/month, up to $18.49/month for ad-free and $22.99/month 4K and multi-device streaming. You can also get two months free on any tier by opting for the annual plan. </p><p><strong>Traveling overseas and don't want to miss the show?</strong> You can still access your usual streamer via a VPN such as our recommendation, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>.</p><h2 class="article-body__section" id="section-watch-stuart-fails-to-save-the-universe-from-anywhere-in-the-world"><span>Watch 'Stuart Fails to Save the Universe' from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "Stuart Fails to Save the Universe" on your usual subscription?</p><p>You can still watch the "Big Bang Theory" spin-off thanks to the wonders of a VPN (Virtual Private Network). The software allows your devices to appear to be back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a>. It's the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> on the market:</p><div class="product"><a data-dimension112="ff9dc4ae-84e5-11f1-9191-b7bfd9db60b4" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>🟩 <a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="ff9dc4ae-84e5-11f1-9191-b7bfd9db60b4" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" data-dimension25=""><strong>NordVPN deal: Try risk-free for 30 days</strong></a></p><p>Boasting super fast speeds, great features, streaming power and industry-leading security, <a href="https://www.tomsguide.com/reviews/nordvpn-review"><strong>NordVPN</strong> is our #1 VPN</a>.<br><br><strong>✅ 30-day money-back guarantee</strong><br><strong>✅ 75% off the usual price</strong></p><p>Use NordVPN to unblock your usual streaming service and watch "Stuart Fails to Save the Universe" with this <em>exclusive </em>deal. <a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="ff9dc4ae-84e5-11f1-9191-b7bfd9db60b4" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-how-to-watch-stuart-fails-to-save-the-universe-online-in-canada"><span>How to watch 'Stuart Fails to Save the Universe' online in Canada</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="eByagaoLZki73CLtYaRPMG" name="TG_Canada_Flag_1920_400_shutterstock.jpg" alt="Canadian flag" src="https://cdn.mos.cms.futurecdn.net/eByagaoLZki73CLtYaRPMG.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Canadians can stream "Stuart Fails to Save the Universe" on <a href="https://www.crave.ca" target="_blank" rel="nofollow"><strong>Crave</strong></a>. Episodes release on the same schedule as the U.S., with the premiere set for <strong>Thursday, July 23 </strong>at<strong> 9 p.m. ET / 6.p.m. PT</strong>.</p><p>Crave subscriptions start at $11.99/month for its Standard With Ads plan, up to $22/month for ad-free Premium.</p><p><strong>On vacation away from Canada?</strong> You'll need one of the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPNs</a> to log in back home to use Crave as it will be geo-blocked when out of the country.</p><h2 class="article-body__section" id="section-how-to-watch-stuart-fails-to-save-the-universe-in-the-u-k"><span>How to watch 'Stuart Fails to Save the Universe' in the U.K.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="ttCSpj8r9kHj68j7NhsBL9" name="TG_British_Flag_1920_400_shutterstock.jpg" alt="British flag" src="https://cdn.mos.cms.futurecdn.net/ttCSpj8r9kHj68j7NhsBL9.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>"Stuart Fails to Save the Universe" will stream on <a href="https://www.hbomax.com/" target="_blank" rel="nofollow"><strong>HBO Max</strong></a> in the U.K., with episodes dropping <strong>every Friday</strong> at around <strong>2 a.m. BST</strong>, starting <strong>July 24</strong>. </p><p>HBO Max prices start from £5.99/month, but the streamer is included with some U.K. based subscriptions such as the Sky Ultimate plan. </p><p><strong>On vacation outside the U.K.?</strong> <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>A good streaming VPN</strong></a> will allow you to log in back home to use HBO Max as you normally would. </p><h2 class="article-body__section" id="section-how-to-watch-stuart-fails-to-save-the-universe-online-in-australia"><span>How to watch 'Stuart Fails to Save the Universe' online in Australia</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="R4wb8TX7wmafWv7eBYfay3" name="TG_australia_Flag_1920_400_shutterstock.jpg" alt="Australia flag" src="https://cdn.mos.cms.futurecdn.net/R4wb8TX7wmafWv7eBYfay3.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Aussies will be able to watch "Stuart Fails to Save the Universe" on <a href="https://www.hbomax.com/" target="_blank" rel="nofollow"><strong>HBO Max</strong></a>, with episodes dropping weekly from <strong>Friday, July 22</strong>.</p><p><a href="https://www.tomsguide.com/reference/max-price-australia">HBO Max pricing in Australia</a> starts from $11.99/month or $119.99/year, with pricier options available to add extra devices, enable downloadable content and upgrade to 4K and Dolby Atmos.</p><p><strong>Aussie away from home?</strong> Subscribing to a <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>VPN</strong></a> will let you access your usual streamer no matter where in the world you are.</p><h3 class="article-body__section" id="section-stuart-fails-to-save-the-universe-release-date-schedule"><span>'Stuart Fails to Save the Universe' release date & schedule</span></h3><p>"Stuart Fails to Save the Universe" will premiere on Thursday, July 23 in North America and Friday, July 24 in the U.K. and Australia. Episodes drop at 9 p.m. ET on the following schedule:</p><ul><li><strong>Episode 1:</strong> Thursday, July 23</li><li><strong>Episode 2: </strong>Thursday, July 30</li><li><strong>Episode 3:</strong> Thursday, August 6</li><li><strong>Episode 4:</strong> Thursday,<strong> </strong>August 13</li><li><strong>Episode 5: </strong>Thursday,<strong> </strong>August 20</li><li><strong>Episode 6:</strong> Thursday, August 27</li><li><strong>Episode 7: </strong>Thursday, September 3</li><li><strong>Episode 8:</strong> Thursday, September 10</li><li><strong>Episode 9:</strong> Thursday, September 17</li><li><strong>Episode 10:</strong> Thursday, September 24</li></ul><h3 class="article-body__section" id="section-stuart-fails-to-save-the-universe-trailer"><span>'Stuart Fails to Save the Universe' trailer</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/_blrWb1yZiY" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-stuart-fails-to-save-the-universe-cast"><span>'Stuart Fails to Save the Universe' cast</span></h3><ul><li>Kevin Sussman as Stuart</li><li>Brian Posehn as Bert</li><li>Lauren Lapkus as Denise</li><li>John Ross Bowie as Barry</li><li>Ryan Cartwright as Kyle</li><li>Josh Brener as Trevor</li><li>Tommy Walker as Gary</li></ul><section class="article__schema-question"><h3>Is 'Stuart Fails to Save the Universe' a spin-off?</h3><article class="article__schema-answer"><p>"Stuart Fails to Save the Universe" is the fourth installment in the "Big Bang Theory" universe, but the first to spin-off directly from the OG sitcom, serving as a sequel. "Young Sheldon" followed the character originally played by Jim Parsons through childhood, with "Georgie & Mandy's First Marriage" being a spin-off of the prequel show. </p></article></section><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/house-of-the-dragon-season-3-will-be-goddamn-huge-showrunner-teases">'House of the Dragon' season 3 will be 'goddamn huge,' showrunner teases</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">The best streaming VPNs</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-not-suitable-for-work">How to watch 'Not Suitable For Work' online — stream Mindy Kaling sitcom</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Granite Harbour' season 3 online — stream the latest episodes of the hit detective series ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/how-to-watch-granite-harbour-season-3</link>
                                                                            <description>
                            <![CDATA[ Sgt Davis Lindo and DCI Lara 'Bart' Bartlett investigate a suspicious death in Aberdeen - here's how to watch "Granite Harbour" season 3 online and for free. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JaBeHSixk2QRrQQgkyN8vf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/J4VXAvFxgKqazjQouQSF8n-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.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/J4VXAvFxgKqazjQouQSF8n-1280-80.jpg">
                                                            <media:credit><![CDATA[BBC]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Promotional image for &quot;Granite Harbour&quot; season 3]]></media:description>                                                            <media:text><![CDATA[Promotional image for &quot;Granite Harbour&quot; season 3]]></media:text>
                                <media:title type="plain"><![CDATA[Promotional image for &quot;Granite Harbour&quot; season 3]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/J4VXAvFxgKqazjQouQSF8n-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Sgt Davis Lindo and DCI Lara 'Bart' Bartlett have a new case to crack in the heart of Aberdeen, with a suspicious death forming the crux of "Granite Harbour" season 3.</p><p>Here's how to watch "Granite Harbour" season 3 online <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with this VPN</strong></a><strong> — and potentially for free.</strong></p><div  class="fancy-box"><div class="fancy_box-title">"Granite Harbour" S3 - Date, TV channel, Streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Granite Harbour" season 3 premieres on Thursday, July 23 at 9 p.m. BST in the U.K.<br><strong>• WATCH FREE — </strong><a data-analytics-id="inline-link" href="https://www.bbc.co.uk/programmes/m002yygf" target="_blank" rel="nofollow"><strong>BBC One</strong></a> / <a data-analytics-id="inline-link" href="https://www.bbc.co.uk/iplayer/episodes/p0db975h/granite-harbour" target="_blank" rel="nofollow"><strong>BBC iPlayer</strong></a> (U.K.)<br><strong>• Watch BBC anywhere — </strong>try <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN risk-free for 30 days</strong></a></p></div></div><p>Season 3 of "Granite Harbour" will see the detectives dive into a mysterious death in a traveling community on the outskirts of Aberdeen. Not only is this shaping up to be a shady case, it's also going to be extremely complex, too.</p><p>Meanwhile, Lindo and Bart are still dealing with the fallout of DI Mallick’s betrayal and the impact that had on Northeastern HQ. Three fresh episodes are here and you won't want to miss a minute of it.</p><p>If you're ready to investigate further, here's <strong>how to watch "Granite Harbour" season 3 online</strong> and from anywhere.</p><section class="article__schema-question"><h3>Can I watch 'Granite Harbour' season 3 for free?</h3><article class="article__schema-answer"><p><strong>"Granite Harbour" will stream for free in the U.K. on </strong><a href="https://www.bbc.co.uk/iplayer" target="_blank" rel="nofollow"><strong>BBC iPlayer</strong></a><strong>. </strong></p><p>Your U.K. postcode (e.g. SE1 7PB) and a valid TV Licence are required to watch.</p><p>Outside the U.K. on holiday? Unlock "Granite Harbour" – and your usual BBC news and sport – with <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (try risk-free)</strong></a>.</p></article></section><h2 class="article-body__section" id="section-how-to-watch-granite-harbour-season-3-from-anywhere"><span>How to watch 'Granite Harbour' season 3 from anywhere</span></h2><p>Thanks to the wonders of a<strong> </strong><a href="https://www.tomsguide.com/best-picks/best-vpn"><strong>VPN</strong></a> (Virtual Private Network), "Granite Harbour" season 3 should be available to Brits no matter where they are. The software allows your devices to appear to be back in the U.K. and <a href="https://www.tomsguide.com/entertainment/streaming/watch-bbc-iplayer-in-the-usa">watch iPlayer</a> for free, as if you were back home.</p><p>Not all VPNs works for this — but <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (try risk-free)</strong></a><strong> does </strong>(we use it daily).</p><div class="product"><a data-dimension112="d513322a-806f-11f1-b28c-bfcf96d9244c" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="VnF7jLxiP2tFksCEBf5N8F" name="NordVPN deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/VnF7jLxiP2tFksCEBf5N8F.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="d513322a-806f-11f1-b28c-bfcf96d9244c" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25=""><strong>NordVPN deal: 3 Months Extra FREE</strong></a></p><p>Boasting lightning-fast speeds, great features, streaming power, and class-leading security, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our #1 VPN.<br><br><strong>✅ 3 months extra FREE!</strong><br><strong>✅ 75% off usual price</strong><br><strong>✅ Unlocks streaming services</strong></p><p>Use Nord to unblock your usual streaming service and watch "Granite Harbour" season 3 from abroad.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="d513322a-806f-11f1-b28c-bfcf96d9244c" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25="">View Deal</a></p></div><p>Using a VPN is incredibly simple.</p><p><strong>1. Install the VPN of your choice</strong>. <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN</strong></a>.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you're away from the U.K. and want to view a U.K. service, you'd select U.K. from the list.</p><p><strong>3. Sit back and enjoy. </strong>Watch "Granite Harbour" season 3 online and on-demand when traveling outside the U.K. (terms permitting).</p><h2 class="article-body__section" id="section-watch-granite-harbour-season-3-in-the-u-k"><span>Watch 'Granite Harbour' season 3 in the U.K.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="ttCSpj8r9kHj68j7NhsBL9" name="TG_British_Flag_1920_400_shutterstock.jpg" alt="British flag" src="https://cdn.mos.cms.futurecdn.net/ttCSpj8r9kHj68j7NhsBL9.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>"Granite Harbour" season 3 will air on BBC One and BBC Scotland at 9 p.m. on Thursday, July 23. The second episode will air the day after, and the finale will be broadcast on Friday, July 31.</p><p>You'll be able to stream all three episodes on <a href="https://www.bbc.co.uk/iplayer" target="_blank" rel="nofollow">BBC iPlayer</a> from Thursday, July 23.<br><br><strong>Outside the U.K.? </strong>You don't have to miss the show if you are a Brit living abroad because you can <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>watch your usual streams from anywhere with a VPN</strong></a>.</p><h2 class="article-body__section" id="section-can-you-watch-granite-harbour-season-3-in-the-u-s-or-canada"><span>Can you watch 'Granite Harbour' season 3 in the U.S. or Canada?</span></h2><p>Unfortunately, there is no broadcast or streaming plan for "Granite Harbour" season 3 in the U.S. or Canada at this moment in time.</p><p><strong>The solution?</strong> <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN </strong></a> can unlock your stream if you're a British resident so you can watch "Granite Harbour" season 3 from anywhere.</p><h2 class="article-body__section" id="section-can-you-watch-granite-harbour-season-3-in-australia"><span>Can you watch 'Granite Harbour' season 3 in Australia?</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="R4wb8TX7wmafWv7eBYfay3" name="TG_australia_Flag_1920_400_shutterstock.jpg" alt="Australia flag" src="https://cdn.mos.cms.futurecdn.net/R4wb8TX7wmafWv7eBYfay3.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" 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>There is no specific release date for "Granite Harbour" season 3 for those of you Down Under, but the latest season is expected to land on <a href="https://acorn.tv/" target="_blank" rel="nofollow">Acorn TV</a> eventually.</p><p>If you're <strong>traveling around</strong>, British folk can still watch the show thanks to <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN </strong></a> which will unlock your stream and bypass geo-restrictions.</p><h3 class="article-body__section" id="section-granite-harbour-season-3-all-you-need-to-know"><span>'Granite Harbour' season 3 — all you need to know</span></h3><h2 id="granite-harbour-season-3-cast">'Granite Harbour' season 3 - cast</h2><ul><li><strong>Romario Simpson</strong> as DC Davis Lindo</li><li><strong>Hannah Donaldson</strong> as DS Lara "Bart" Bartlett</li><li><strong>Dawn Steele</strong> as DCI Cora MacMillan</li><li><strong>John Gordon Sinclair</strong> as Chief Constable Alan Willis</li><li><strong>Alastair Mackenzie</strong> as Richard Loughty</li></ul><h2 id="granite-harbour-season-3-episode-guide">'Granite Harbour' season 3 - episode guide</h2><ul><li><strong>Episode 1: </strong>A birthday celebration ends in tragedy when a girl is found dead near a traveller site. As tensions rise, Lindo and the team uncover secrets that threaten to tear a community apart.</li><li><strong>Episode 2: </strong>Lindo and the team recover the murder weapon and find new leads that challenge their assumptions as tensions rise within the community.</li><li><strong>Episode 3: </strong>As the case reaches a stunning conclusion, Lindo and Bart face a race against time to find the real killer as long held secrets are finally revealed.</li></ul><section class="article__schema-question"><h3>What other shows can I watch on BBC iPlayer?</h3><article class="article__schema-answer"><p>Lots of other comedy shows – including <a href="https://www.tomsguide.com/entertainment/streaming/watch-i-kissed-a-girl-season-2-online">"I Kissed a Girl" S2</a>, "<a href="https://www.tomsguide.com/entertainment/streaming/watch-the-other-bennet-sister">The Other Bennet Sister</a>", "<a href="https://www.bbc.co.uk/iplayer/episodes/b09twr53/this-country?seriesId=b09twr53-structural-1-p04qv4jc" target="_blank" rel="nofollow">This Country</a>", "<a href="https://www.bbc.co.uk/iplayer/episodes/p05v9qqg/the-young-offenders?seriesId=p05v9qqg-structural-1-p05v9r4v" target="_blank" rel="nofollow">The Young Offenders</a>", "<a href="https://www.bbc.co.uk/iplayer/episodes/b062r9t5/people-just-do-nothing?seriesId=b062r9t5-structural-1-p01xw0xp" target="_blank" rel="nofollow">People Just Do Nothing</a>", "<a href="https://www.bbc.co.uk/iplayer/episodes/m002x3c0/schitts-creek?seriesId=m002x3c0-structural-1-m002x3c1" target="_blank" rel="nofollow">Schitt's Creek</a>" and "<a href="https://www.bbc.co.uk/iplayer/episodes/b06l51nr/detectorists?seriesId=b06l51nr-structural-1-b04kf095" target="_blank" rel="nofollow">Detectorists</a>".</p></article></section><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/watch-the-salisbury-poisonings-a-spy-next-door">How to watch 'The Salisbury Poisonings: A Spy Next Door' online</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-the-westies">How to watch 'The Westies' online — stream the mafia crime series from anywhere in the world</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-watch-uk-tv-abroad">How to watch U.K. TV from abroad</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ There's a simple way to watch Commonwealth Games 2026 for *FREE* ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/sports/simple-way-to-watch-commonwealth-games-2026-for-free</link>
                                                                            <description>
                            <![CDATA[ All the ways to watch 2026 Commonwealth Games live streams, with Joshua Kerr, Shericka Jackson and Chad Le Clos in action in Glasgow. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">X8DpDHGXb82tCJEXmnvSRe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vmQnQQYKKzSiitrWSzhMFc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 07:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 08:05:05 +0000</updated>
                                                                                                                                            <category><![CDATA[Sports]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Adrian Back ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RtLZVVvN9uqWCPaq6H5s9X.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/vmQnQQYKKzSiitrWSzhMFc-1280-80.jpg">
                                                            <media:credit><![CDATA[Henry NICHOLLS / AFP via Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Britain&#039;s Josh Kerr celebrates after winning the men&#039;s one mile event during the IAAF Diamond League athletics competition at the London stadium in London on July 18, 2026. ]]></media:description>                                                            <media:text><![CDATA[Britain&#039;s Josh Kerr celebrates after winning the men&#039;s one mile event during the IAAF Diamond League athletics competition at the London stadium in London on July 18, 2026. ]]></media:text>
                                <media:title type="plain"><![CDATA[Britain&#039;s Josh Kerr celebrates after winning the men&#039;s one mile event during the IAAF Diamond League athletics competition at the London stadium in London on July 18, 2026. ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vmQnQQYKKzSiitrWSzhMFc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The 23rd edition of the Commonwealth Games is now officially underway and on Friday in Glasgow there's a packed schedule of events. In the pool, Adam Peaty-Ramsey begins his quest for another gold medal when he takes part in the 100m breaststroke heats. </p><p>Elsewhere in the morning session, there's a mouthwatering clash between England and Australia in the wheelchair 3x3 basketball, while talented Northern Irish boxer Jon McConnell gets his campaign underway in the men's 70kg category. </p><p>There will also be plenty of medals dished out on the first day of action in Scotland. There are medal events in artistic gymnastics, para powerlifting and para swimming, while the swimming relay finals will take place in the evening session. </p><p>You can watch Commonwealth Games 2026 live streams <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> and potentially for free.</strong></p><div  class="fancy-box"><div class="fancy_box-title">Commonwealth Games 2026 live streams: TV schedule, dates</div><div class="fancy_box_body"><p class="fancy-box__body-text">The 2026 Commonwealth Games run from Thursday. July 23 to Sunday, August 2. Full schedule below.<br><strong>• Australia — </strong><a data-analytics-id="inline-link" href="https://7plus.com.au/glasgow-2026-commonwealth-games" target="_blank" rel="nofollow"><strong>7Plus</strong></a> <strong>(FREE)</strong><br><strong>• U.K. — TNT Sports</strong><br><strong>• Canada — </strong><a data-analytics-id="inline-link" href="https://gem.cbc.ca/live" target="_blank" rel="nofollow"><strong>CBC Gem</strong></a><strong> (FREE)</strong><br><strong>• U.S. — </strong><a data-analytics-id="inline-link" href="https://connect.beinsports.com/" target="_blank" rel="nofollow"><strong>beIN SPORTS</strong></a><br><strong>• Watch anywhere — Try </strong><a data-analytics-id="inline-link" href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow"><strong>NordVPN 100% risk free</strong></a></p></div></div><h2 id="the-simple-way-to-watch-the-commonwealth-games-for-free">The simple way to watch the Commonwealth Games for FREE</h2><p>The Commonwealth Games 2026 are free of charge on <a href="https://7plus.com.au/glasgow-2026-commonwealth-games" target="_blank" rel="nofollow"><strong>7Plus</strong></a>, which is providing comprehensive coverage in Australia. </p><p>Free Commonwealth Games coverage can also be found on <a href="https://gem.cbc.ca/live" target="_blank" rel="nofollow"><strong>CBC Gem</strong></a> in Canada, <a href="https://www.threenow.co.nz/" target="_blank" rel="nofollow"><strong>ThreeNow</strong></a> in New Zealand and Welsh/Gaelic language coverage on <a href="https://www.bbc.co.uk/tv/s4c" target="_blank" rel="nofollow"><strong>S4C</strong></a> and <a href="https://www.bbc.co.uk/tv/bbcalba" target="_blank" rel="nofollow"><strong>BBC Alba</strong></a>.</p><p><a href="https://www.channel5.com/" target="_blank" rel="nofollow"><strong>Channel 5</strong></a> in the U.K. will have daily highlights.</p><p><strong>Watch from anywhere in the world — </strong><a href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow"><strong>Use a VPN</strong></a> to watch Glasgow 2026 for free, whether you’re in the U.K., the U.S., or India.</p><h2 class="article-body__section" id="section-watch-commonwealth-games-2026-from-anywhere"><span>Watch Commonwealth Games 2026 from anywhere</span></h2><p>Away from home at the moment and blocked from watching the Commonwealth Games on your usual subscription?</p><p>You can still watch Commonwealth Games live thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn" target="_blank">VPN</a> (Virtual Private Network). The software allows your devices to appear as if they're back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow">NordVPN</a>. It's the best on the market:</p><div class="product"><a data-dimension112="cca31634-8469-11f1-89b8-cfa2e36c2aad" data-action="Deal Block" data-label="NordVPN deal: Get 3 months extra FREEBoasting lightning fast speeds, great features, streaming power, and class-leading security, NordVPN is our #1 VPN.&#9989; 30-day money-back guarantee&#9989; Up to 75% off usual price&#9989; Includes 3 extra months for freeUse Nord to unblock your usual streaming service and watch the Commonwealth Games live online with our exclusive deal. NordVPN deal: Get 3 months extra FREE" data-dimension48="NordVPN deal: Get 3 months extra FREEBoasting lightning fast speeds, great features, streaming power, and class-leading security, NordVPN is our #1 VPN.&#9989; 30-day money-back guarantee&#9989; Up to 75% off usual price&#9989; Includes 3 extra months for freeUse Nord to unblock your usual streaming service and watch the Commonwealth Games live online with our exclusive deal. NordVPN deal: Get 3 months extra FREE" href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow" data-dimension112="cca31634-8469-11f1-89b8-cfa2e36c2aad" data-action="Deal Block" data-label="NordVPN deal: Get 3 months extra FREEBoasting lightning fast speeds, great features, streaming power, and class-leading security, NordVPN is our #1 VPN.&#9989; 30-day money-back guarantee&#9989; Up to 75% off usual price&#9989; Includes 3 extra months for freeUse Nord to unblock your usual streaming service and watch the Commonwealth Games live online with our exclusive deal. NordVPN deal: Get 3 months extra FREE" data-dimension48="NordVPN deal: Get 3 months extra FREEBoasting lightning fast speeds, great features, streaming power, and class-leading security, NordVPN is our #1 VPN.&#9989; 30-day money-back guarantee&#9989; Up to 75% off usual price&#9989; Includes 3 extra months for freeUse Nord to unblock your usual streaming service and watch the Commonwealth Games live online with our exclusive deal. NordVPN deal: Get 3 months extra FREE" data-dimension25=""><strong>NordVPN deal: Get 3 months extra FREE</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅ 30-day money-back guarantee</strong><br><strong>✅ Up to 75% off usual price</strong><br>✅ <strong>Includes 3 extra months for free</strong><br><br>Use Nord to unblock your usual streaming service and watch the Commonwealth Games live online with our <em>exclusive</em> deal.<a class="view-deal button" href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow" data-dimension112="cca31634-8469-11f1-89b8-cfa2e36c2aad" data-action="Deal Block" data-label="NordVPN deal: Get 3 months extra FREEBoasting lightning fast speeds, great features, streaming power, and class-leading security, NordVPN is our #1 VPN.&#9989; 30-day money-back guarantee&#9989; Up to 75% off usual price&#9989; Includes 3 extra months for freeUse Nord to unblock your usual streaming service and watch the Commonwealth Games live online with our exclusive deal. NordVPN deal: Get 3 months extra FREE" data-dimension48="NordVPN deal: Get 3 months extra FREEBoasting lightning fast speeds, great features, streaming power, and class-leading security, NordVPN is our #1 VPN.&#9989; 30-day money-back guarantee&#9989; Up to 75% off usual price&#9989; Includes 3 extra months for freeUse Nord to unblock your usual streaming service and watch the Commonwealth Games live online with our exclusive deal. NordVPN deal: Get 3 months extra FREE" data-dimension25="">View Deal</a></p></div><h2 id="quick-start-watch-commonwealth-games-with-a-vpn">Quick Start: Watch Commonwealth Games with a VPN</h2><p>Using a VPN is incredibly simple.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you're in the U.S. but want to view your free 7Plus, you'd select an Australian server from the list.</p><p><strong>3. Sit back and enjoy the action. </strong>Head over to <a href="https://7plus.com.au/glasgow-2026-commonwealth-games" target="_blank" rel="nofollow"><strong>7Plus</strong></a> and enjoy!</p><h2 class="article-body__section" id="section-how-to-watch-commonwealth-games-2026-live-streams-in-the-u-s"><span>How to watch Commonwealth Games 2026 live streams in the U.S.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="UHZYAaZCSyV7FkHxYGxtJ6" name="TG_US_Flag_1920_400_shutterstock.jpg" alt="US flag" src="https://cdn.mos.cms.futurecdn.net/UHZYAaZCSyV7FkHxYGxtJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Viewers in the U.S. can watch the Commonwealth Games 2026 on <strong>beIN SPORTS. </strong></p><p>Fans can also stream the action on <a href="https://www.beinsports.com/en-us" target="_blank" rel="nofollow"><strong>beIN SPORTS CONNECT</strong></a>, while the main beIN SPORTS channel will show the best of the action live.</p><p>beIN SPORTS subscriptions start from $5.99 per month or $59.99 per year.</p><p>If you already use the service but aren't in the U.S. right now, you can live stream Commonwealth Games 2026 by using a <a href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow"><strong>good VPN</strong></a>. </p><h2 class="article-body__section" id="section-how-to-watch-commonwealth-games-2026-live-streams-in-canada"><span>How to watch Commonwealth Games 2026 live streams in Canada</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="eByagaoLZki73CLtYaRPMG" name="TG_Canada_Flag_1920_400_shutterstock.jpg" alt="Canada flag" src="https://cdn.mos.cms.futurecdn.net/eByagaoLZki73CLtYaRPMG.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>As mentioned above, fans can watch the Commonwealth Games 2026 unfold on CBC Sports and the channel's <a href="https://gem.cbc.ca/live" target="_blank" rel="nofollow"><strong>CBC Gem</strong></a> streaming service. </p><p>If you live in Canada but aren't at home right now, you can still tune in live by using a quality VPN like <a href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>.</p><h2 class="article-body__section" id="section-how-to-watch-commonwealth-games-2026-live-streams-in-the-u-k"><span>How to watch Commonwealth Games 2026 live streams in the U.K.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="ttCSpj8r9kHj68j7NhsBL9" name="TG_British_Flag_1920_400_shutterstock.jpg" alt="British flag" src="https://cdn.mos.cms.futurecdn.net/ttCSpj8r9kHj68j7NhsBL9.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>In the UK and Ireland, coverage of the Commonwealth Games 2026 will be provided by <strong>TNT Sports</strong>.</p><p>TNT Sports has replaced the BBC as the live broadcast partner of the games in the UK and Ireland and will show every event on its streaming partner <a href="https://www.hbomax.com/gb/en/sports" target="_blank" rel="nofollow"><strong>HBO Max</strong></a>.</p><p>Plans start at £25.99 per month, with rolling subscriptions available at £30.99. </p><p>As mentioned above, highlights will be available for FREE on<a href="https://www.cyclingweekly.com/racing/tour-de-france/tour-de-france-highlights-to-be-shown-free-to-air-on-5-in-uk-tnt-sports-announce"><strong> </strong></a><a href="https://www.channel5.com/" target="_blank" rel="nofollow"><strong>Channel 5</strong></a> every day. </p><p>If you're on holiday outside the U.K., you can still follow your usual Commonwealth Games live stream by using one of the best VPN services, such as <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>.</p><h2 class="article-body__section" id="section-how-to-watch-commonwealth-games-2026-live-streams-in-australia"><span>How to watch Commonwealth Games 2026 live streams in Australia</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="R4wb8TX7wmafWv7eBYfay3" name="TG_australia_Flag_1920_400_shutterstock.jpg" alt="Australia flag" src="https://cdn.mos.cms.futurecdn.net/R4wb8TX7wmafWv7eBYfay3.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Every single event of the Commonwealth Games 2026 is being shown live on <strong>Channel 7</strong> and its streaming website <a href="https://7plus.com.au/glasgow-2026-commonwealth-games" target="_blank" rel="nofollow"><strong>7Plus</strong></a>.</p><p>If you aren't in Oz right now, you can live stream all the action from Glasgow by using a <a href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow"><strong>good VPN</strong></a>. </p><h2 class="article-body__section" id="section-commonwealth-games-preview"><span>Commonwealth Games: Preview </span></h2><p>With 215 medals up for grabs across 10 sports, and with 74 nations competing, there will be an array of world-class athletes on show in Scotland. The track and field roster is particularly impressive as it includes Jamaica's five-time Olympic medallist Shericka Jackson and Canada’s most decorated male Olympian of all-time Andre De Grasse. </p><p>Home favorite Kerr will also look to add to his medal collection fresh from setting a new mile world record in London last weekend, while English’s best hopes for glory will be Georgia Hunter-Bell in the 800m and Zharnel Hughes in the 200m. </p><p>In the pool, South African superstar Le Clos needs just one medal (he currently has 18) to become the most decorated athlete in Commonwealth Games history. He’ll face competition from a strong Australian squad, while England’s Adam Ramsay-Peaty will be chasing gold in the 50m and 100m breaststroke events, </p><p>Elsewhere, all eyes will be on the Sir Chris Hoy Velodrome to see how Matthew Richardson goes in the sprint and team sprint after switching allegiances from Australia to England. Welsh legend Emma Finucane is another to watch as she bids to complete the set by adding Commonwealth glory to her Olympic, European and world titles. </p><p>Here's how to watch Commonwealth Games 2026 online and on TV — including free streaming options.</p><section class="article__schema-question"><h3>What sports will take place at the Commonwealth Games 2026?</h3><article class="article__schema-answer"><ul><li>Athletics and Para Athletics</li><li>Swimming and Para Swimming</li><li>Artistic Gymnastics</li><li>Track Cycling and Para Track Cycling</li><li>Netball</li><li>Weightlifting and Para Powerlifting</li><li>Boxing</li><li>Judo</li><li>Bowls and Para Bowls</li><li>3x3 Basketball and 3x3 Wheelchair Basketball</li></ul></article></section><h3 class="article-body__section" id="section-commonwealth-games-medal-schedule"><span>Commonwealth Games medal schedule </span></h3><p><strong>3x3 basketball:</strong> July 29</p><p><strong>Artistic Gymnastics: </strong>July 24, 25, 26, 27 and 28 </p><p><strong>Athletics: </strong>July 27, 28, 29, 30, 31 July and August 1</p><p><strong>Bowls:</strong> July 28 and August 2</p><p><strong>Boxing: </strong>July 1</p><p><strong>Judo:</strong> July 31 and August 1, 2</p><p><strong>Netball: </strong>August 2</p><p><strong>Swimming: </strong>July 24, 25, 26, 27, 28 and 29 </p><p><strong>Track cycling:</strong> July 30, 31 and August 1, 2 </p><p><strong>Weightlifting:</strong> July 26, 27, 28, 29 and 30</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/netflix-top-10-shows-heres-the-3-you-need-to-binge-watch-this-week-july-21-27" target="_blank">Top 10 Netflix shows you need to stream this week</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-f1-live-online" target="_blank">How to watch F1 online from anywhere</a></li><li><a href="https://www.tomsguide.com/best-picks/best-exercise-bikes" target="_blank">What's the best exercise bike?</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Want a Netflix mystery miniseries you can watch in one weekend? I've got 3 recommendations that will hook you ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/want-a-netflix-mystery-miniseries-you-can-watch-in-one-weekend-ive-got-3-recommendations-that-will-hook-you</link>
                                                                            <description>
                            <![CDATA[ From a luxurious New England whodunnit to a gritty British detective drama, here are 3 mystery miniseries on Netflix you can binge-watch in one weekend ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zdmnagHQVD7ydwDyKRJz9f</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/U9cMesvKv4YXuG7qBHr9yi-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE.jpeg ]]></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/U9cMesvKv4YXuG7qBHr9yi-1280-80.jpg">
                                                            <media:credit><![CDATA[Netflix; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Netflix logo on a smoky background]]></media:description>                                                            <media:text><![CDATA[Netflix logo on a smoky background]]></media:text>
                                <media:title type="plain"><![CDATA[Netflix logo on a smoky background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/U9cMesvKv4YXuG7qBHr9yi-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We love a good whodunnit in all formats, but especially when it's a mystery miniseries. You don't have to wait multiple seasons for a satisfying conclusion to the story, and yet there's more than enough run time to ramp up the tension and leave you guessing. </p><p>And <a href="https://www.tomsguide.com/entertainment/streaming/netflix">Netflix</a>, one of the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> around, is home to plenty of pulpy, puzzling limited series that will keep you clicking "next episode" all weekend long. From a Nicole Kidman-led, New England-set mystery drama to a Spanish-language adaptation of a <a href="https://www.tomsguide.com/entertainment/streaming/every-harlan-coben-show-you-can-stream-on-netflix-and-prime-video-ranked">Harlan Coben page-turner</a> (just one of many on the streamer, from "<a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-psychological-thriller-is-one-of-harlan-cobens-best-shows-yet-and-you-can-binge-watch-it-now">Lazarus</a>" to "Stay Close" to "Missing You"), these Netflix miniseries will leave you equal parts entertained and engrossed. </p><p>So, if you want to spend a few days binge-watching some addictive streaming originals, here are three Netflix mystery miniseries that will have you hooked from the very first episode.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="the-perfect-couple">'The Perfect Couple'</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/FqaeoFOBXWo" allowfullscreen></iframe></div></div><p>Nicole Kidman, a crazy wig and a mysterious death to unravel—really, what more could you need from a Netflix show? Set over a lavish summer wedding on the picturesque island of Nantucket, "<a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-no-1-mystery-thriller-show-has-viewers-divided-but-it-should-be-your-next-binge-watch">The Perfect Couple</a>" is a soapy, sunkissed mystery based the Elin Hilderbrand beach read of the same name. </p><p>Kidman leads a star-studded ensemble (Liev Schreiber, Eve Hewson, Meghann Fahy, Dakota Fanning and Sam Nivola) as Greer Garrison Winbury, a famous novelist and the matriarch of the super-wealthy Winbury family. When a dead body shockingly washes ashore just hours before her son's nuptials, everyone becomes a suspect. </p><p>(And if you want more frothy mysteries full of complex family dynamics, here are <a href="https://www.tomsguide.com/entertainment/streaming/best-shows-like-the-perfect-couple">5 five shows like 'The Perfect Couple'</a> to also add to your watchlist.<a href="https://www.tomsguide.com/entertainment/streaming/best-shows-like-the-perfect-couple">)</a></p><p><em><strong>Stream </strong></em><a href="https://www.netflix.com/title/81474158" target="_blank" rel="nofollow"><em><strong>"The Perfect Couple" on Netflix</strong></em></a><em><strong> now</strong></em></p><h2 id="the-innocent">'The Innocent'</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/LhERIj0ddXI" allowfullscreen></iframe></div></div><p>Adapted from Harlan Coben's<strong> </strong>seventh standalone novel, 2005's "The Innocent," this twisty Spanish miniseries centers on Mateo "Matt" Vidal (played by Mario Casas), a Barcelona man who was imprisoned for four years for accidental negligent homicide after trying to break up a bar brawl. Matt is trying to start his life over and rebuild his relationship with his wife Olivia (Aura Garrido), when all of those plans are derailed by a mysterious phone call that sends him on the path to find the truth.</p><p>The eight-episode mystery has a picture-perfect 100% approval rating on Rotten Tomatoes; in her review for <a href="https://www.fotogramas.es/series-tv-noticias/a62333055/el-inocente-serie-netflix-thriller-intriga-mario-casas/" target="_blank">Fotogramas</a> (translated to English), critic María Juesas praised the series for how "it approaches each chapter like a movie, focusing each time on a different character, telling us almost all his secrets as if he were adding one more piece to the puzzle...'The Innocent' knows how to play with a labyrinthine plot that hides a puzzle of crime, deception and mysteries."<br><br><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/81036936" target="_blank" rel="nofollow"><em><strong>"The Innocent" on Netflix</strong></em></a><em><strong> now</strong></em></p><h2 id="bodies">'Bodies'</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/RyZjIPB8paw" allowfullscreen></iframe></div></div><p>Why have one detective story when you can have four? In this Netflix limited series based on the graphic novel by Si Spencer, four different investigators (played by Kyle Soller, Jacob Fortune-Lloyd, Amaka Okafor and Shira Haas) are working the same across four very different timelines:  1890, 1941, 2023, and 2053, respectively.</p><p>As each dive into the case of a dead body in Longharvest Lane across eight episodes, it soon becomes clear that those seemingly disparate investigations might <em>not</em> be so disparate after all and may be linked to a larger conspiracy that has the potential to destroy all of London. (If you like your murder mysteries with a bit of a sci-fi edge, this one is for you.) <br><br><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/81252916" target="_blank" rel="nofollow"><em><strong>"Bodies" on Netflix </strong></em></a><em><strong>now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OKBRKW"></div>                            </div>                            <script src="https://kwizly.com/embed/OKBRKW.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/entertainment/netflix/netflix-just-added-one-of-the-most-gripping-mystery-thriller-movies-ive-ever-seen-and-its-like-a-digital-jigsaw-puzzle">Netflix just added one of the most gripping mystery thriller movies I've ever seen — and it’s like a digital jigsaw puzzle</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-netflix-thriller-miniseries-to-binge-watch-in-one-weekend-april-2026">3 best Netflix thriller miniseries to binge-watch in one weekend</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-cozy-murder-mystery-movies-to-stream-this-weekend">5 best cozy murder mystery movies to stream this weekend</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Leaked iOS 27 code hints Apple can completely lock down leased iPhones over missed payments ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/leaked-ios-27-code-hints-apple-can-completely-lock-down-leased-iphones-over-missed-payments</link>
                                                                            <description>
                            <![CDATA[ Leaked iOS 27 code appears to reveal potential restrictions Apple could place on leased iPhones due to missed payments. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">orHNYtKEERcbP3iNm2BqzF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5WnqNRxctGBQQ6NnmhWyA9-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 00:26:39 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/5WnqNRxctGBQQ6NnmhWyA9-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / John Velasco]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 17 Pro review.]]></media:description>                                                            <media:text><![CDATA[iPhone 17 Pro review.]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 17 Pro review.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5WnqNRxctGBQQ6NnmhWyA9-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It appears likely that Apple is looking to make a big shift in how it treats leased iPhones and payment plans. The changes include a new <a href="https://www.tomsguide.com/us/iphone-upgrade-program-faq,news-21583.html">Upgrade Program </a>and leaked <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-is-now-live-9-features-you-need-to-try-first">iOS 27</a> beta code that suggests Apple could restrict iPhones when customers skip payments.</p><h2 id="apple-upgrade-program">Apple Upgrade Program</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="UfsgdagGx97Tu2BSXw2yy7" name="GettyImages-2226561632" alt="apple store" src="https://cdn.mos.cms.futurecdn.net/UfsgdagGx97Tu2BSXw2yy7.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: Agoes Rudianto/NurPhoto via Getty Images)</span></figcaption></figure><p>The code leak (from <a href="https://9to5mac.com/2026/07/21/ios-27-code-suggests-apple-could-restrict-leased-devices-after-missed-payments/" target="_blank">9to5Mac</a>) appears to coincide with a report from yesterday that Apple is planning to <a href="https://www.tomsguide.com/phones/iphones/should-you-lease-your-next-iphone-what-you-need-to-know-about-the-rumored-apple-upgrade-program">ditch the iPhone Upgrade Program</a> in favor of one that lets you lease different Apple devices.</p><p>According to Bloomberg's Mark Gurman, Apple will partner with Klarna to finance the program, which would cover most iPhones, Macs, MacBooks, iPads and Apple Watches, save the entry-level models. The leases would run between 24 and 36 months depending on which device you get.</p><p>Like car leases, the Program would let you pay off your device or upgrade to a new model before the lease ends. At the end of the term, you could keep the device or return it.</p><h2 id="ios-27">iOS 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="Z5AREXkHH3WuxG2NVDBMVA" name="iOS 27" alt="iOS 27 logo on iPhone" src="https://cdn.mos.cms.futurecdn.net/Z5AREXkHH3WuxG2NVDBMVA.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple/Shutterstock)</span></figcaption></figure><p>With that in mind, according to 9to5Mac, iOS 27 contains code that reveals a "broader system for managing a financed iPhone." This system apparently includes the ability to restrict apps and service if a payment is missed.</p><p>There is something called App Managed Features which would authorize financing and perform status checks, presumably to ensure payments have been made.</p><p>If a payment is missed, the iPhone would be put in "Restricted Mode." This mode "blocks access to most apps." A small set of apps would remain available, including:</p><ul><li><strong>Accessibility Reader</strong></li><li><strong>App Store</strong></li><li><strong>Health</strong></li><li><strong>Magnifier</strong></li><li><strong>Phone</strong></li><li><strong>Clock</strong></li><li><strong>Settings</strong></li><li><strong>Wallet</strong></li><li><strong>Passwords</strong></li><li><strong>The Restricted Mode interface itself</strong></li></ul><p>Some apps like Messages and Home or safety apps might also remain accessible. Though it seems the financial provider has control over the exceptions.</p><p>Apparently, the number of missed payments that trigger Restricted Mode is up to the financial provider and their policies. </p><h2 id="when-could-restricted-mode-arrive">When could Restricted Mode arrive?</h2><p>Apple is rumored to launch the new Apple Upgrade Program next week on July 28. However, 9to5Mac couldn't find references to the Restricted Mode in the current beta code or iOS 26.6 RC, which was released yesterday.</p><p>It's possible Apple could launch either feature later.</p><p>We'll know in less than a week whether or not Apple decides to actually launch its revised Upgrade Program. </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/forget-iphone-18-pro-iphone-20-tipped-to-get-apples-biggest-screen-upgrade-ever">Forget iPhone 18 Pro — iPhone 20 tipped to get Apple’s biggest screen upgrade ever</a></li><li><a href="https://www.tomsguide.com/computing/new-report-details-huge-mac-overhaul-for-macbooks-imacs-and-mac-studio">New report details huge Mac overhaul for MacBooks, iMacs and Mac Studio</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-card-takes-aim-at-apple-card-with-way-more-perks-and-rewards-heres-what-you-get">Samsung Galaxy Card takes aim at Apple Card with way more perks and rewards — here’s what you get</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Xbox is testing out Backward Compatibility for older games on PCs with four classic titles ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/gaming/xbox/xbox-is-testing-out-backward-compatibility-for-older-games-on-pcs-with-four-classic-titles</link>
                                                                            <description>
                            <![CDATA[ Xbox is bringing backward compatibility for some older games to PC and handhelds. Here's what the games are and when they'll be available. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ri3s7vyHsPqfnfeN8Gnhj4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CBRgpGNSoTrkkwFE6i9CUF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 18:59:03 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Xbox]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/CBRgpGNSoTrkkwFE6i9CUF-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xbox and Samsung]]></media:description>                                                            <media:text><![CDATA[Xbox and Samsung]]></media:text>
                                <media:title type="plain"><![CDATA[Xbox and Samsung]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CBRgpGNSoTrkkwFE6i9CUF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Today (7/22), Xbox introduced a new early release program it's calling Xbox Compatibility on PC. It's an interesting move as rival <a href="https://www.tomsguide.com/gaming/a-playstation-6-without-a-disc-drive-im-done-with-sony">Sony faces an ongoing backlash</a> for ditching discs.</p><p>In the <a href="https://news.xbox.com/en-us/2026/07/22/xbox-backward-compatibility-on-pc/" target="_blank">announcement post</a>, Xbox said that the program will let you play classic Xbox games on either your PC or gaming handheld consoles like the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">ROG Xbox Ally X</a>.</p><p>"We don’t want to leave our gaming legacy behind even as technology continues to evolve and advance. We expect our library of games to move forward with us and to be able to play them in entirely new ways."</p><p>The program is starting with four original Xbox games coming to PC for the first time. Xbox says that new features are also being added, like customizable graphic settings, up to 4x resolution upscaling, VSync support, Fullscreen and Windowed display modes, and anti-aliasing.</p><p>Here are the four starting games:</p><ul><li><em><strong>BLiNX: The Time Sweeper </strong></em></li><li><em><strong>Conker: Live and Reloaded </strong></em></li><li><em><strong>Crimson Skies: High Road to Revenge </strong></em></li><li><em><strong>Fuzion Frenzy</strong></em></li></ul><p>Each game costs $9.99, though at the time of writing, Fuzion Frenzy is on sale for $7.50. They're available for purchase now and are included in all Xbox Game Pass plans.</p><p>Of the four, I'd personally recommend Fuzion Frenzy or Crimson Skies. If you're unfamiliar, Crimson Skies is an arcade flier while Fuzion Frenzy is a more sci-fi Mario Party from the original Xbox. </p><p>If you already have licenses for these games, they'll carry over to your PC or handheld console.</p><p>Here are the minimum requirements to run these games per Xbox:</p><ul><li><strong>GPU: </strong>Nvidia GTX 950 or AMD Radeon RX 550 or Intel UHD 770 or Intel Arc A310</li><li><strong>CPU</strong>: Min 4 cores: Intel Core i3-8100 or AMD Ryzen 3 1200 or AMD Ryzen Z2 A Processor</li><li><strong>RAM: </strong>8GB</li><li><strong>OS: </strong>Windows 11</li><li><strong>Drivers and versions: </strong>Latest version as of January 2026</li></ul><p>Xbox is starting with those four titles, but it's not clear when any more games will be added. Achievements will arrive in the coming months.</p><p>But these four are a decent start.</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/dlss-5-is-fully-controllable-from-the-developer-nvidias-upscaler-might-be-better-than-expected">"DLSS 5 is fully controllable from the developer": Nvidia’s upscaler might be better than expected</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/splatoon-raiders-review">Splatoon Raiders review: An ink-soaked looter shooter</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/if-playstation-wants-to-succeed-with-all-digital-it-needs-to-follow-the-steam-model-5-ways-it-can-win-over-gamers-like-me">If PlayStation wants to succeed with all-digital, it needs to follow the Steam model — 5 ways it can win over gamers like me</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ New report details huge Mac overhaul for MacBooks, iMacs and Mac Studio ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/new-report-details-huge-mac-overhaul-for-macbooks-imacs-and-mac-studio</link>
                                                                            <description>
                            <![CDATA[ A new report claims that Apple is giving its entire line of Mac computers a major overhaul. Here's what to potentially expect and when. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Vsxmt9GHGYTHgDzZyVwK28</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5jsbAXhogUzmnuzcd5jTCR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 18:25:28 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.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/5jsbAXhogUzmnuzcd5jTCR-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[MacBook Pro 16-inch M5 Pro on a desk]]></media:description>                                                            <media:text><![CDATA[MacBook Pro 16-inch M5 Pro on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[MacBook Pro 16-inch M5 Pro on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5jsbAXhogUzmnuzcd5jTCR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple’s Mac lineup will get a major overhaul starting later this year. That’s according to Bloomberg reporter and Apple tipster <a href="https://www.bloomberg.com/news/articles/2026-07-22/apple-to-launch-new-macbook-air-imac-macbook-pro-neo-mac-mini-mac-studio" target="_blank">Mark Gurman</a>, whose sources gave him a rundown of the upcoming Macs.</p><p>Things will kick off with a refreshed entry-level 14-inch MacBook Pro featuring the new <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-could-get-two-upgrades-this-year-with-apples-m6-chip-arriving-early">M6 chip</a>, along with a new iMac that will also sport the yet-to-be-announced processor. Development of these Macs is reportedly complete, but they aren’t likely to ship until the fall.</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:3678px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PVynuTDwCUjjRjzbvrwEuU" name="MacBook Neo A18 review-LIST2" alt="MacBook Neo shown on desk" src="https://cdn.mos.cms.futurecdn.net/PVynuTDwCUjjRjzbvrwEuU.jpg" mos="" align="middle" fullscreen="" width="3678" height="2069" 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 next biggest release should be higher-end 14-inch and 16-inch <a href="https://www.tomsguide.com/news/macbook-pro-oled">MacBooks with OLED panels</a> and a new design. These brand-new editions to the MacBook line will have M5 Pro and M5 Max chips. Apple will reportedly release these MacBooks in late 2026 or early 2027.</p><p>New MacBook Air models are expected early in 2027. These 13- and 15-inch laptops will apparently resemble the current models, though Apple is reportedly developing an OLED model for 2028. There will be another MacBook Pro with a new design and packing an M7 chip sometime in 2027.</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="bNV9jhCAcApnh37Y5sf5HS" name="TG_Mac-Studio-Display-LIST.jpg" alt="Mac Studio on a desk hooked up to a Studio DIsplay" src="https://cdn.mos.cms.futurecdn.net/bNV9jhCAcApnh37Y5sf5HS.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>Additionally, Apple is working on a refreshed <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>. This model reportedly runs on the updated A19 Pro chip and more RAM. The report doesn’t say anything about pricing or when this laptop will launch.</p><p>Gurman’s report also says that a new iMac with an OLED screen is in the works, but won’t be released until later. Apple is also planning new Mac mini and Mac Studio models with refreshed chips. This includes the M5 Pro and M6 for the Mac mini, and the M5 Max and M5 Ultra for the Mac Studio.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmVyPe"></div>                            </div>                            <script src="https://kwizly.com/embed/XmVyPe.js" async></script><h2 id="outlook">Outlook</h2><p>As always, take this report with a grain of salt, as Apple hasn’t made any official announcements about these Mac models. There’s certainly a lot to look forward to if all of this is accurate, though with the ongoing RAM crisis, it’s anyone’s guess when these computers will actually release and how much they’ll cost. As always, stay tuned for more as we hear further reports.</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/should-you-lease-your-next-iphone-what-you-need-to-know-about-the-rumored-apple-upgrade-program">What you need to know about the rumored 'Apple Upgrade' program</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-finally-threw-android-users-a-bone-with-this-new-ios-27-photo-feature-heres-how">Apple finally threw Android users a bone with this new iOS 27 photo feature</a></li><li><a href="https://www.tomsguide.com/ai/the-4-biggest-allegations-in-apples-lawsuit-against-openai">The 4 biggest allegations in Apple's lawsuit against OpenAI</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=laptops&brands=Apple&min_discount_ratio=0.95&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 normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .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: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-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; }    @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: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">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-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.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>        \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-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \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();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    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 (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          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 (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                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');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          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 loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  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: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    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.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 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.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = 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">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // 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); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung turned the Galaxy Watch Ultra 2 into a fully-fledged dive computer — but there’s a catch ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/samsung-turned-the-galaxy-watch-ultra-2-into-a-fully-fledged-dive-computer-but-theres-a-catch</link>
                                                                            <description>
                            <![CDATA[ The Ultra 2 has legit dive-ready specs and features, including the ability to monitor nitrogen levels, depth, temperature, and dive time. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9aCe3HVrodUa26zrhEnNnM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/u4HGWUFwc8QuKbaWkCz6NZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 18:10:53 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></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.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/u4HGWUFwc8QuKbaWkCz6NZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background]]></media:description>                                                            <media:text><![CDATA[Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/u4HGWUFwc8QuKbaWkCz6NZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung just dropped the new <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a>, a larger-than-life, tough-built smartwatch with an ultra-bright display, plenty of battery life, health and fitness tech galore, and legit dive-ready features. </p><p>Unlike the original <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Galaxy Watch Ultra</a>, which isn’t meant for diving or high-impact water sports despite its 100-meter water resistance rating, the new model is not only rated for 100 meters but is also EN13319-certified for scuba diving, not to mention IP69K-certified against dust and moisture.</p><p>That’s not all; Samsung has partnered with <a href="https://www.mares.com/en_US/mares-app" target="_blank" rel="nofollow">Mares</a>, a popular and trusted dive app, to turn the Galaxy Watch Ultra 2 into a fully-fledged dive computer to track your dives. It also provides real-time nitrogen level monitoring, depth and water temperature, dive time, and more. However, there is a catch.</p><h2 id="the-samsung-galaxy-watch-ultra-2-is-built-for-diving-for-a-price">The Samsung Galaxy Watch Ultra 2 is built for diving... for a price</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:4737px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="7RLoxSzFXxAzKQFchr6Qod" name="GalaxyWatchUltra2-v-AWU3-01" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/7RLoxSzFXxAzKQFchr6Qod.jpg" mos="" align="middle" fullscreen="" width="4737" height="2664" 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>To access all of these cool dive-ready features, Galaxy Watch Ultra 2 users will need to subscribe to the Mares app, which is $8.99 a month or $69.99 for the year. For the early birds, it's worth mentioning that support for Mares won't be available right when the smartwatch ships, but a little later this year. </p><p>Samsung has a two-year deal with Mares that makes the app exclusive to only the Galaxy Watch Ultra 2 and no other Android smartwatches. Of course, Apple already has a partnership in place with Mares, which similarly turns the <a href="https://www.tomsguide.com/reviews/apple-watch-ultra-review">Apple Watch Ultra</a>, <a href="https://www.tomsguide.com/reviews/apple-watch-ultra-2">Apple Watch Ultra 2</a>, and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3</a> into wrist-based dive computers.</p><p>One other important note: The Galaxy Watch Ultra 2 is meant for recreational dives only, specifically, those less than 40 meters in depth. Sorry, no deep-sea diving. </p><p>What are your thoughts on the Samsung Galaxy Watch Ultra 2 and its water-based features? Would you trust it on your next dive? More importantly, are you willing to pony up the extra cash for the Mares app? Let me know in the comments below. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OoD23X"></div>                            </div>                            <script src="https://kwizly.com/embed/OoD23X.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/smartwatch-water-resistance-ratings-explained">Smartwatch water resistance ratings explained</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">5 things to know about the new Samsung Galaxy Watch 9</a></li><li><a href="https://www.tomsguide.com/wellness/smart-rings/the-samsung-galaxy-ring-is-about-to-be-the-worlds-first-fda-cleared-smart-ring-for-sleep-apnea">The Samsung Galaxy Ring is about to be the world’s first FDA-cleared smart ring for sleep apnea</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ "DLSS 5 is fully controllable from the developer": Nvidia’s upscaler might be better than expected ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/dlss-5-is-fully-controllable-from-the-developer-nvidias-upscaler-might-be-better-than-expected</link>
                                                                            <description>
                            <![CDATA[ The original DLSS 5 announcement was controversial, but Nvidia has now addressed many of the key concerns. Here’s how DLSS 5 will maintain artistic intent for games. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">PGEiQUbugQ2LRUsFgAYq5j</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PJS2JJLoZ3qWusm2ZFjrAW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 16:11:40 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[PC Gaming]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.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/PJS2JJLoZ3qWusm2ZFjrAW-1280-80.jpg">
                                                            <media:credit><![CDATA[Nvidia]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Nvidia DLSS 5]]></media:description>                                                            <media:text><![CDATA[Nvidia DLSS 5]]></media:text>
                                <media:title type="plain"><![CDATA[Nvidia DLSS 5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PJS2JJLoZ3qWusm2ZFjrAW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>To say that people weren’t impressed when <a href="https://www.tomsguide.com/computing/gpus/deciphering-dlss-5-pc-gaming-breakthrough-or-nvidias-ai-slop-era">Nvidia DLSS 5</a> was announced would be an understatement. Gamers and critics alike expressed concerns over heavy-handed “beauty filters” smoothing out character faces and AI overwriting developer art direction. The initial requirement of a second GPU for rendering also didn’t go over well.</p><p>At SIGGRAPH, Nvidia held a follow-up keynote that was practically built to address the concerns folks have with DLSS 5. Instead of focusing on how photo-realistic DLSS 5 could make graphics appear, the keynote centered around the amount of control artists will have over the technology.</p><p>Here’s a breakdown of what Nvidia discussed at SIGGRAPH and how DLSS 5 might not be as bad as we feared.</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/vXDetI2TUWw" allowfullscreen></iframe></div></div><h2 id="granular-control">Granular control</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="YxnzjvFDDGGrmrSjc9iYRU" name="Nvidia DLSS 5 three models 2" alt="Nvidia DLSS 5" src="https://cdn.mos.cms.futurecdn.net/YxnzjvFDDGGrmrSjc9iYRU.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: Nvidia)</span></figcaption></figure><p>As you might recall, the biggest complaint with DLSS 5 is how the graphics appeared to have an Instagram/TikTok filter slapped over them. A less charitable description would be an “AI slop” filter. Nvidia addressed this concern directly, saying that game artists would have full control over a game’s graphics.</p><p>Developers won’t be forced into all-or-nothing with AI. They’ll be able to mask out individual characters, faces, props, or background elements so DLSS 5 either ignores them or processes them with tailored settings. Structural and Tone Intensity sliders will give devs fine control over how things appear. There will also be three distinct AI models for developers to assign. </p><h2 id="no-ai-overwrites">No AI overwrites</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="mnvD4pGZ6ePcqrKZBC2UR5" name="Nvidia DLSS 5 granular controls" alt="DLSS 5" src="https://cdn.mos.cms.futurecdn.net/mnvD4pGZ6ePcqrKZBC2UR5.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: Nvidia)</span></figcaption></figure><p>Another concern is that the AI would hallucinate on low-poly geometry or rewrite hand-crafted visuals. DLSS 5 isn’t generating a game scene from scratch but relies strictly on internal game engine buffers to preserve the artist’s original intent.</p><p>Nvidia emphasized that traditional rasterization and ray tracing still build the entire frame first, defining geometry, lighting anchors, motion vectors, and surface normals. Nvidia framed DLSS 5 as a third category of AI rendering alongside upscaling reconstruction and frame generation. The engine creates the world while the model enriches complex lighting elements.</p><h2 id="latency">Latency</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="q7R5wTB9YVYfCsA6htPPrd" name="Nvidia DLSS 5 frames" alt="Nvidia DLSS 5" src="https://cdn.mos.cms.futurecdn.net/q7R5wTB9YVYfCsA6htPPrd.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: Nvidia)</span></figcaption></figure><p>Generative video models usually process frames in batches, which can introduce input lag. That’s obviously a non-starter for fast-paced games like CSGO 2.</p><p>Nvidia says that DLSS 5 processes the current frame using the game’s engine’s native motion vectors without looking ahead to future frames. By avoiding multi-frame batch processing, Nvidia’s goal is to eliminate both generative latency and temporal shimmering artifacts.</p><h2 id="one-gpu-needed-not-two">One GPU needed, not two</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2002px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="m5EFY2WowRnf9kJ5ELvfGg" name="Nvidia DLSS 5 one GPU" alt="DLSS 5" src="https://cdn.mos.cms.futurecdn.net/m5EFY2WowRnf9kJ5ELvfGg.jpg" mos="" align="middle" fullscreen="" width="2002" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nvidia)</span></figcaption></figure><p>When Nvidia first demoed DLSS 5, the computational overhead was so heavy that it reportedly required dual high-end GPUs just to run smoothly. Naturally, this isn’t feasible for most players, but Nvidia says you’ll be able to run DLSS 5 on a single GPU.</p><p>To that end, Nvidia revealed that they have distilled the massive generative model into a much smaller, single-step diffusion model. The updated implementation has been engineered to run on a single RTX GPU with efficient VRAM allocation instead of requiring multi-GPU rigs that only hardcore users own.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdR22e"></div>                            </div>                            <script src="https://kwizly.com/embed/OdR22e.js" async></script><h2 id="outlook-2">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xWV7Xvua8aPb7TaLHKQ5Jj" name="Nvidia RTX 50 series GPU" alt="Nvidia RTX 50-series GPU held in hand with Nvidia logo on green background" src="https://cdn.mos.cms.futurecdn.net/xWV7Xvua8aPb7TaLHKQ5Jj.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>I’ve championed Nvidia DLSS for years, but I was one of the folks who wasn’t enamored with that initial DLSS 5 reveal. Now, after SIGGRAPH, I'm less worried about this fall's upcoming update.</p><p>We’ll have to wait to see how the final version functions, but I’m glad that Nvidia has addressed all the major concerns. If we can get richer game graphics without the infamous AI look, then we’ll all be winners.</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/gpus/what-is-nvidia-dlss-explaining-the-ai-tech-transforming-pc-gaming-and-why-its-getting-controversial">What is Nvidia DLSS? Explaining the AI tech transforming PC gaming — and why it’s getting controversial</a></li><li><a href="https://www.tomsguide.com/gaming/theyre-completely-wrong-nvidia-ceo-jensen-huang-responds-to-dlss-5-criticism">Nvidia's 'GPT moment' for graphics rejected by gamers; CEO Jensen Huang rushes to defend DLSS 5</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/deciphering-dlss-4-5-i-tested-nvidias-new-upscaler-and-figured-out-when-to-use-model-l-or-m">DLSS 4.5 is now live — I tested Nvidia’s upscaler to see which model you should actually use</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=laptops&min_discount_ratio=0.95&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 normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .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: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-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; }    @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: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">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-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.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>        \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-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \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();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    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 (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          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 (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                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');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          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 loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  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: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    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.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 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.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = 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">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // 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); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Samsung Galaxy Ring is about to be the world’s first FDA-cleared smart ring for sleep apnea ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smart-rings/the-samsung-galaxy-ring-is-about-to-be-the-worlds-first-fda-cleared-smart-ring-for-sleep-apnea</link>
                                                                            <description>
                            <![CDATA[ Slated for a fall roll-out, the Samsung Galaxy Ring is set to become the world’s first smart ring with FDA-cleared sleep apnea detection. Here’s everything you need to know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aLxH58XKXnW9kqtiKPrNoY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qbuGDweaP9pPc7iTUUDHPV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 15:54:50 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smart Rings]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Fitness]]></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.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/qbuGDweaP9pPc7iTUUDHPV-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Samsung Galaxy Ring in a user&#039;s hand]]></media:description>                                                            <media:text><![CDATA[Close-up of the Samsung Galaxy Ring in a user&#039;s hand]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Samsung Galaxy Ring in a user&#039;s hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qbuGDweaP9pPc7iTUUDHPV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung’s annual summer <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">Galaxy Unpacked</a> event came and went without any mention of a <a href="https://www.tomsguide.com/wellness/smart-rings/samsung-confirms-galaxy-ring-2-is-coming-and-it-might-even-work-with-ios">Samsung Galaxy Ring 2</a>. However, there was one important smart ring announcement: The current Samsung Galaxy Ring is getting a cool new health feature.</p><p>Slated for a fall roll-out, the <a href="https://www.tomsguide.com/wellness/fitness-trackers/samsung-galaxy-ring-review">Samsung Galaxy Ring</a> is set to become the world’s first smart ring with FDA-cleared sleep apnea detection. Here’s everything you need to know.</p><h2 id="samsung-galaxy-ring-is-getting-fda-cleared-sleep-apnea-detection">Samsung Galaxy Ring is getting FDA-cleared sleep apnea detection </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="KVkpbrrY6x6oF64axmc8wT" name="GalaxyWatch7-06.jpg" alt="Samsung Galaxy Watch 7 in 40mm on a user's wrist" src="https://cdn.mos.cms.futurecdn.net/KVkpbrrY6x6oF64axmc8wT.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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>While other smart rings, like the <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-ringconn-gen-2-a-subscription-free-alternative-to-oura-ring-promising-150-plus-days-of-battery">Ringconn Gen 2</a>, have sleep apnea alerts, the feature isn’t FDA-cleared. Meanwhile, the <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring 5</a> —  one of the <a href="https://www.tomsguide.com/wellness/fitness-trackers/best-smart-rings">best smart rings</a> of 2026 right alongside the Galaxy Ring — also doesn’t support FDA-cleared sleep apnea detection, though it does screen for breathing disturbances, which can be a sign of the condition. </p><p>Similar to the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-7-review">Galaxy Watch 7</a>, <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Galaxy Watch 8</a>, <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">Galaxy Watch 9</a>, and <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Ultra</a> series, sleep apnea detection on the Galaxy Ring will likely require a few nights to calibrate before it’s ready for action. If signs of sleep apnea are detected, users will receive an alert in their morning report with guidance on seeking further medical review. </p><p><a href="https://www.tomsguide.com/wellness/sleep/samsung-launches-world-sleep-day-sleep-apnea-survey-and-withings-launches-sleep-apnea-telemedicine-partnership">Sleep apnea</a> notably impacts millions of adults, but often goes undiagnosed. Long-term, the condition can lead to cardiovascular issues. </p><h2 id="new-galaxy-watches-and-smart-glasses-too">New Galaxy Watches and smart glasses, too </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:5540px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uiH5kxLWFFyNzASJsHfwuc" name="GalaxyWatchUltra2-01" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/uiH5kxLWFFyNzASJsHfwuc.jpg" mos="" align="middle" fullscreen="" width="5540" height="3116" 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>In other wearables news, in addition to the Galaxy Ring sleep apnea announcement, Samsung also unveiled the latest <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">Samsung Galaxy Watch 9</a>, <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a>, and a sleek pair of <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-hands-on-with-the-new-samsung-smart-glasses-heres-why-id-pick-them-over-meta">Samsung Galaxy smart glasses</a>.</p><p>Better yet, Galaxy Watch owners will be able to control the smart specs using gesture controls when they officially launch later this year. That said, Samsung didn’t mention whether or not users can similarly use the Galaxy Ring. </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/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/3-reasons-why-google-should-make-an-oura-ring-alternative">3 reasons why Google should make an Oura Ring alternative</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor">Garmin Cirqa Smart Band launch: Garmin debuts a screen-free Whoop and Fitbit Air competitor</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Instagram was down — Live updates on massive outage affecting DMs ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/news/live/instagram-down-outage-live-updates-7-22-26</link>
                                                                            <description>
                            <![CDATA[ There seems to be an issue with Instagram, as users are reporting problems on the popular social network. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">72rBddB5zBxd3LVHmMNfJ3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jPZiwUxvsgL5bSjBsCdCvB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 14:04:04 +0000</pubDate>                                                                                                                                <updated>Wed, 22 Jul 2026 16:24:51 +0000</updated>
                                                                                                                                            <category><![CDATA[Social Media]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                                                                <author><![CDATA[ dave.leclair@futurenet.com (Dave LeClair) ]]></author>                    <dc:creator><![CDATA[ Dave LeClair ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/fyx7qYdxPMTNBhdnMfNmaB.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Managing News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/jPZiwUxvsgL5bSjBsCdCvB-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Instagram app logo on a phone display]]></media:description>                                                            <media:text><![CDATA[Instagram app logo on a phone display]]></media:text>
                                <media:title type="plain"><![CDATA[Instagram app logo on a phone display]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jPZiwUxvsgL5bSjBsCdCvB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Thousands of users flocked to <a href="https://downdetector.com/status/instagram/" target="_blank">Downdetector</a> today, reporting problems with the popular social media platform Instagram. When the outage first started, we saw a massive spike in reports, with more than 2,000, which is significant so early in the downtime.</p><p>Reports reached a high of around 4,000 today. As far as we can tell, Meta never acknowledged the outage on its <a href="https://metastatus.com/" target="_blank">status page</a>. Though it appears that the issue with Instagram mostly extended to DMs, which weren't going through. </p><p>The outage lasted around 2 hours starting at 6:30 am specific.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OoD2zX"></div>                            </div>                            <script src="https://kwizly.com/embed/OoD2zX.js" async></script><h2 id="the-reports-are-rolling-in">The reports are rolling in</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:1440px;"><p class="vanilla-image-block" style="padding-top:57.08%;"><img id="NRgiarJU3WM3FdCrovdAGo" name="Screenshot 2026-07-22 at 10.02.23 AM" alt="Downdetector" src="https://cdn.mos.cms.futurecdn.net/NRgiarJU3WM3FdCrovdAGo.png" mos="" align="middle" fullscreen="" width="1440" height="822" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector )</span></figcaption></figure><p>We're seeing a massive spike in Instagram reports on <a href="https://downdetector.com/status/instagram/" target="_blank">Downdetector</a>, with more than 2,500 people jumping to the outage-reporting website to say something is wrong with the beloved social network.</p><p>We're also seeing smaller spikes to other Meta-owned social networks, with Messenger sitting at around <a href="https://downdetector.com/status/facebook-messenger/" target="_blank">500 reports</a> and <a href="https://downdetector.com/status/facebook/" target="_blank">Facebook at 300</a>. </p><h2 id="meta-across-the-board">Meta across the board</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:2220px;"><p class="vanilla-image-block" style="padding-top:24.05%;"><img id="APd6ZvuA8TDUFEVzMrtrd" name="Screenshot 2026-07-22 at 10.08.38 AM" alt="Downdetector" src="https://cdn.mos.cms.futurecdn.net/APd6ZvuA8TDUFEVzMrtrd.png" mos="" align="middle" fullscreen="" width="2220" height="534" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector )</span></figcaption></figure><p>It's all Meta at the top of Downdetector, but it's a bit deceiving, as Instagram is the only one with more than 1,000 reports. The other Meta services are worth monitoring, but they're lower.</p><h2 id="dms-appear-the-be-the-problem">DMs appear the be the problem</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:2220px;"><p class="vanilla-image-block" style="padding-top:20.81%;"><img id="HWiHj2jBFRnpQEVinuaqxF" name="Screenshot 2026-07-22 at 10.11.04 AM" alt="Downdetector" src="https://cdn.mos.cms.futurecdn.net/HWiHj2jBFRnpQEVinuaqxF.png" mos="" align="middle" fullscreen="" width="2220" height="462" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector )</span></figcaption></figure><p>Based on the comments section on Downdetector, it seems that Instagram DMs are the main issue, which could explain why we're also seeing a spike in reports to Messenger. If you're struggling to send Direct Messages on Instagram, know you're not alone, as it seems to be a fairly widespread issue.</p><h2 id="more-than-3-000-reports">More than 3,000 reports</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:1366px;"><p class="vanilla-image-block" style="padding-top:36.90%;"><img id="kwpyT3Xmq7J8BmABnHgNje" name="Screenshot 2026-07-22 at 10.15.23 AM" alt="Downdetector" src="https://cdn.mos.cms.futurecdn.net/kwpyT3Xmq7J8BmABnHgNje.png" mos="" align="middle" fullscreen="" width="1366" height="504" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector )</span></figcaption></figure><p>Instagram has gone past 3,000 reports for the first time since the outage began. Clearly, more users are logging in to find that they can't send direct messages, leaving them disappointed and forced to jump on Downdetector to tell the world.</p><p>Hopefully, this is just a quick outage that Meta resolves ASAP, but we'll keep you posted as it develops.</p><h2 id="messenger-still-climbing">Messenger still climbing</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:1366px;"><p class="vanilla-image-block" style="padding-top:36.90%;"><img id="tcLbDSVmZVbw4bb9g9vig" name="Screenshot 2026-07-22 at 10.23.06 AM" alt="Downdetector" src="https://cdn.mos.cms.futurecdn.net/tcLbDSVmZVbw4bb9g9vig.png" mos="" align="middle" fullscreen="" width="1366" height="504" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector )</span></figcaption></figure><p>While the predominant user reports seem to be about Instagram direct messages, we're also seeing Meta's main Messenger app spike, surpassing 1,000 reports. </p><h2 id="no-known-issues">'No Known Issues'</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:1944px;"><p class="vanilla-image-block" style="padding-top:39.40%;"><img id="wJS5cLUTuet2WcZ37aCmpK" name="Screenshot 2026-07-22 at 10.33.50 AM" alt="Meta status page" src="https://cdn.mos.cms.futurecdn.net/wJS5cLUTuet2WcZ37aCmpK.png" mos="" align="middle" fullscreen="" width="1944" height="766" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Meta)</span></figcaption></figure><p>Over on Meta's status page, everything is still showing as "No Known Issues." While it's clear that something is wrong based on the raw number of reports, for whatever reason, Meta isn't publicly saying anything. </p><p>We've reached out to the social network and will update if we hear back.</p><h2 id="leveling-off">Leveling off</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:1944px;"><p class="vanilla-image-block" style="padding-top:39.40%;"><img id="aTwdyyxwEUejfA9RWRxAEQ" name="Screenshot 2026-07-22 at 10.47.51 AM" alt="Downdetector reports" src="https://cdn.mos.cms.futurecdn.net/aTwdyyxwEUejfA9RWRxAEQ.png" mos="" align="middle" fullscreen="" width="1944" height="766" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector )</span></figcaption></figure><p>For the first time, Downdetector reports on Instagram have updated without a sizable increase. Instead, it went up by less than 100, creating the first leveling of we've seen since the outage started.</p><h2 id="my-experience">My experience</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:4972px;"><p class="vanilla-image-block" style="padding-top:65.75%;"><img id="YJ7gXp3cZmhj4Tbm2ByWWU" name="GettyImages-1039914532.jpg" alt="Instagram hide likes" src="https://cdn.mos.cms.futurecdn.net/YJ7gXp3cZmhj4Tbm2ByWWU.jpg" mos="" align="middle" fullscreen="" width="4972" height="3269" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Aytac Unal/Anadolu Agency/Getty Images)</span></figcaption></figure><p>I've been playing with Instagram DMs on and off between posts, and it seems to still be having problems. When I send a message, it doesn't seem to actually get delivered to the recipient; instead, it sits in the thread unsent. Additionally, when I scroll up in a thread, I'm seeing an unable to load older messages error.</p><p>While some people are saying it's working again, I'm definitely not among those folks, as I'm still having problems. Clearly, Instagram isn't fully operational yet.</p><h2 id="finally-a-big-drop">Finally, a big drop</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:1944px;"><p class="vanilla-image-block" style="padding-top:39.40%;"><img id="BC8S2FjJEt8TViRVeEjgCN" name="Screenshot 2026-07-22 at 11.31.31 AM" alt="Downdetector" src="https://cdn.mos.cms.futurecdn.net/BC8S2FjJEt8TViRVeEjgCN.png" mos="" align="middle" fullscreen="" width="1944" height="766" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Downdetector )</span></figcaption></figure><p>For the first time since the outage began, we're finally seeing a big drop in reports, with Instagram falling to 2,600. This is more than 1,000 reports below the peak, which is a good sign that things are coming back to normal.</p><p>For what it's worth, I was able to send a direct message and receive a response on Instagram, so the trouble seems to be resolved for me.</p><h2 id="reports-are-in-a-steady-decline">Reports are in a steady decline</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="jPZiwUxvsgL5bSjBsCdCvB" name="Instagram.shutterstock_2620925129" alt="Instagram app logo on a phone display" src="https://cdn.mos.cms.futurecdn.net/jPZiwUxvsgL5bSjBsCdCvB.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>Since I last looked at Down Detector, reports have steadily declined dropping from around 3200 to now just under 400. </p><p>We're probably in the clear as the issues resolve but I'll keep an eye on things just a bit longer in case it flares up again. </p><h2 id="calling-it">Calling 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:3405px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="J4EEHYGRdoGNKryBLi9JEf" name="GettyImages-1086354750.jpg" alt="Instagram" src="https://cdn.mos.cms.futurecdn.net/J4EEHYGRdoGNKryBLi9JEf.jpg" mos="" align="middle" fullscreen="" width="3405" height="2270" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: aap Arriens/NurPhoto via Getty Images)</span></figcaption></figure><p>With reports well under 250, we're calling this outage. It doesn't appear that things will flare up again. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ No, the Fold 8 doesn't have an S Pen — but Samsung is ‘exploring’ its return for future Folds ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds</link>
                                                                            <description>
                            <![CDATA[ Samsung executive vice president HS Moon told reporters that the company is open to bringing the S Pen back for the Galaxy Z Fold series. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9STzMdzAyBoWv5RZ2K8hcT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JUVSwuTeFABcGUzkRL8WtU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 14:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;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/JUVSwuTeFABcGUzkRL8WtU-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 6 and S Pen]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 6 and S Pen]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 6 and S Pen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JUVSwuTeFABcGUzkRL8WtU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The last time we saw a Galaxy Z Fold with S Pen support it was the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-6-review-test-results">Galaxy Z Fold 6</a>. But Samsung ditched the digitizer on the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a> in order to make the device as thin as possible.</p><p>The bad news is that the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> don’t bring the S Pen back. Samsung is clearly still prioritizing thinness while also rolling out new innovations like Flex Titanium to make the new foldables close to crease-free.</p><p>But don’t write off the S Pen just yet.</p><h2 id="s-pen-comeback">S Pen comeback?</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="sYNpNxd72GSupzuXkfWfjU" name="Galaxy Z Fold 6 and S Pen-LIST.jpg" alt="Samsung Galaxy Z Fold 6 and S Pen" src="https://cdn.mos.cms.futurecdn.net/sYNpNxd72GSupzuXkfWfjU.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>During a Q&A session with Samsung EVP HS Moon here in London ahead of Galaxy Unpacked, he seemed open to the idea of a stylus returning to the (ahem) Fold.</p><p>“Our decisions are always shaped around the priorities that we have for that generation (of foldable phones), and for this generation, our priorities were about offering foldables that were slimmer, lighter, and basically more portable devices that also offer large viewing experiences,” said Moon through an interpreter.</p><p>Moon said that Samsung will monitor user reactions and that Samsung is "committed to providing the maximum user experience.”</p><p>Here’s the money quote though: “We continue to explore and consider various more innovative technologies that incorporate (a) digitizer and S Pen in an even slimmer form factor,” Moon said.</p><p>What’s great about this statement — to me, anyway — is that Samsung doesn’t seem willing to sacrifice the thinness of the design in order to incorporate S Pen support, even though I’m sure there are some users out there who wouldn’t mind trading 0.1mm of thickness in their foldable for a stylus.</p><h2 id="privacy-display-could-be-coming-to-foldables-too">Privacy Display could be coming to foldables, too</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.05%;"><img id="V4V96LAdqcdUXhzGgCygJM" name="Galaxy S26 Ultra review-10" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/V4V96LAdqcdUXhzGgCygJM.jpg" mos="" align="middle" fullscreen="" width="4032" height="2260" 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>So what about the Privacy Display feature found on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>. Designed to block content from would-be onlookers, it’s one of the best display innovations in years. But this also didn’t make its way to the Galaxy Z Fold 8 series. </p><p>Fortunately, Samsung is keenly aware of the buzz and seems willing to at least probe if it’s possible for the Galaxy Fold lineup.</p><p>“We are very happy to see all of the positive excitement and the user feedback about the (Privacy Display) feature that we offered for the first time in the S26 series,” Moon shared. “We continue to explore various possibilities of expanding our advanced technologies across our lineup, and that would include Privacy Display as well.”</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung just added Automated Tasks and Gemini Notebook to Galaxy Z Fold 8 — here's what these AI features let you do ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/samsung-just-added-automated-tasks-and-gemini-notebook-to-galaxy-z-fold-8-heres-what-these-ai-features-let-you-do</link>
                                                                            <description>
                            <![CDATA[ During this year’s Samsung Galaxy Unpacked event, the tech giant announced its plans to add two AI features to its latest smartphone lineup. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Wm3HrbZ9SPVkyWyQk85uaf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/kxnxvDqWjQPYNdZftdvEUo-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM.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/kxnxvDqWjQPYNdZftdvEUo-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[samsung galaxy z fold 8 ultra ai]]></media:description>                                                            <media:text><![CDATA[samsung galaxy z fold 8 ultra ai]]></media:text>
                                <media:title type="plain"><![CDATA[samsung galaxy z fold 8 ultra ai]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/kxnxvDqWjQPYNdZftdvEUo-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s a whole lot to be excited about if you’ve been using Samsung’s signature lineup of smartphones.</p><p>With all the news emanating from this year’s Samsung Galaxy Unpacked event, it’s easy to see why — there’s a multitude of brand new smartphone models on the way with a host of Android-powered features that push its capabilities beyond the ones you’ve owned thus far. The unveiling of the <a href="https://www.tomsguide.com/phones/samsung-phones/major-samsung-galaxy-z-fold-8-leak-shows-off-the-unreleased-foldables-and-cases-heres-what-you-need-to-know">Samsung Galaxy Z Fold8 Ultra</a>, Fold8, and Flip8 showcased the consumer electronics company’s penchant for releasing some of the most impressive smartphones on the market.</p><p>And as expected, Samsung is tapping into the Google Android ecosystem to bring new forms of AI integration to its newest smartphones. Gemini Intelligence and Gemini Notebook (formerly known as <a href="https://www.tomsguide.com/ai/i-used-notebooklm-to-make-a-family-wiki-and-now-everything-i-need-to-run-the-household-is-a-click-away">NotebookLM</a>) will be a major part of your daily reliance on Samsung’s latest mobile devices, as they look to help you finish your everyday chores, handle extensive research and more.</p><h2 id="gemini-intelligence-and-gemini-notebook-inside-samsung-s-latest-phones">Gemini Intelligence and Gemini Notebook inside Samsung’s latest phones</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:3245px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Rrhyzx7YMraziySwy7dRBX" name="Galaxy Z Fold 8-27" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/Rrhyzx7YMraziySwy7dRBX.jpg" mos="" align="middle" fullscreen="" width="3245" height="1825" 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>Task automation is the central theme when talking about what Gemini Intelligence is bringing to the new Samsung smartphone lineup.</p><p>While in beta, <a href="https://www.tomsguide.com/ai/google-just-revealed-gemini-intelligence-and-it-could-change-android-forever">Gemini Intelligence</a> could fulfill certain requests, such as ordering takeout or requesting a rideshare, through direct support from a group of apps. Now those day-to-day life tasks that you can relegate to Gemini Intelligence are getting even more app assistance, now that more than 40 apps have become compatible with that AI feature. Asking Gemini to order an item from Etsy is now possible, along with a host of other simple tasks — buying concert tickets, making dinner reservations and booking flights are among the many ways this new AI feature will improve your Samsung smartphone experience. </p><p>Gemini will also be able to see and understand what's on your screen as it acknowledges your requests and recognizes complex images as prompts. Plus, you’ll be able to open other apps, close your phone or follow the step-by-step progress of Gemini’s work while it attempts to complete your command. It’s worth noting that you can expand upon your latest prompt with an additional detail, which Gemini has no problem incorporating into its current task. Simply long-pressing the Flex Window’s power button on the Galaxy Z Flip8 lets you quickly access Gemini’s task automation feature.</p><p>As for what Gemini Notebook is bringing to the latest Samsung foldable smartphone collection, this AI tool will come pre-installed. Working with those models’ side-by-side screen as a mini-workspace is now possible with Notebook’s ability to answer questions about the topic you’re researching and the sources connected to that subject. And just like its desktop version, Notebook’s mobile iteration will integrate your uploaded documents, photos, whiteboard images, voice recordings and more into your research projects. Notebook’s chat functionality can take your research and transform it into different forms of study material, such as slide decks, videos, flash cards, quizzes and a podcast.</p><p>To give owners of the Galaxy Z Fold8 Ultra, Fold8 and Flip8 a peek into just how useful Notebook’s AI features can be, Samsung is giving them all a six-month trial of Google AI Pro on those phones. That subscription comes with even more useful Notebook features, which include Audio Overviews, Video Overviews, Slides, and more.</p><p>Other pieces of Samsung gear, such as the Galaxy Watch 9 and intelligent eyewear developed alongside major brands such as Gentle Monster and Warby Parker, will also come with their own Gemini-powered features.</p><h2 id="bottom-line-4">Bottom line</h2><p>With a newly announced array of foldable smartphones that make great use of Gemini Intelligence and Gemini Notebook, its users will be sure to grow accustomed to handling life’s simpler tasks and more complex ones with both AI tools at their disposal. Making one’s daily routine just a little less of a headache and more easily manageable with Google’s AI features makes Samsung’s newest smartphones a worthwhile pickup.</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/google-gemini/i-hate-paying-for-calorie-tracking-apps-so-i-had-gemini-analyze-my-food-photos-instead-heres-what-it-found" target="_blank">I hate paying for calorie-tracking apps, so I had Gemini analyze my food photos instead — here’s what it found</a></li><li><a href="https://www.tomsguide.com/ai/i-replaced-my-notebook-with-an-ai-pen-for-a-month-heres-what-happened" target="_blank">I replaced my notebook with an AI pen for a month — here's what happened</a></li><li><a href="https://www.tomsguide.com/ai/i-used-this-ai-note-taker-to-record-my-meetings-for-a-week-and-it-made-my-workdays-more-focused-and-productive" target="_blank">I used this AI note taker to record my meetings for a week — and it made my workdays more focused and productive</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Fold 8 is the first Galaxy phone with a silicon carbon battery — here's why that's such a big deal ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal</link>
                                                                            <description>
                            <![CDATA[ Samsung is making the switch to silicon carbon batteries, and that means a lot of big things for the new Galaxy foldables. Here's why it matters so much ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rojyU2KcBzFMtT2gKVu8NP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6J9SdWH8KajdLftPCzJFvW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <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/6J9SdWH8KajdLftPCzJFvW-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6J9SdWH8KajdLftPCzJFvW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung's Galaxy Z 8 series foldables are getting a major battery upgrade, and it's not just because of the capacity boost. Samsung has confirmed that it has made the switch to <a href="https://www.tomsguide.com/phones/i-interviewed-honor-and-oneplus-about-their-silicon-carbon-battery-tech-apple-and-google-are-quickly-falling-behind">silicon carbon batteries</a> this year, ditching the traditional lithium ion power packs in favor of something that packs a bit more of a punch.</p><p>It's a surprise to hear that this is happening so soon — given<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-still-has-the-same-battery-tech-as-older-phones-but-silicon-carbon-is-still-in-the-works"> Samsung's previous hesitance</a> to discuss when it might introduce silicon carbon batteries. Considering various brands <a href="https://www.tomsguide.com/phones/i-interviewed-honor-and-oneplus-about-their-silicon-carbon-battery-tech-apple-and-google-are-quickly-falling-behind">have already made the switch</a>, it's great to see that one of the major holdouts has decided now is the time to jump on the bandwagon.</p><p>Here's what you need to know about silicon carbon batteries and what it means for prospective Samsung users.</p><h2 id="what-are-the-benefits-of-silicon-carbon">What are the benefits of silicon carbon?</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="dMNhWVVdEx4Fk8ABZieXAg" name="Galaxy Z Fold 8 Ultra-32" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/dMNhWVVdEx4Fk8ABZieXAg.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 main thing you need to know about batteries is that their capacity is linked to their size. A lot of work has been done to improve the density of lithium ion batteries over the years, but there's only so much you can do to shrink them down. That becomes a problem when you're trying to design devices to be super thin and light.</p><p>Silicon carbon is a whole new kind of battery design that utilizes silicon on the anode instead of pure graphite, and the key benefit is that it offers far better energy density. In other words, you can pack more power into a smaller space compared to traditional lithium ion batteries. That's particularly important for foldables, which pride themselves on being ultra-thin and lightweight — despite essentially being two phones bolted together.</p><p>We've already seen the benefits with the <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-15-review">OnePlus 15</a>, which has offers a 7,300 mA battery without any meaningful increase in size or weight. In fact, not only is the phone only a single gram heavier than the 6,000 mAh <a href="https://www.tomsguide.com/phones/oneplus-phones/oneplus-13-review">OnePlus 13</a>, it's actually 0.8mm thinner than its predecessor.</p><p>In terms of the Galaxy Z 8 series, we're seeing a 600 mAh jump between the Galaxy Z Fold 7 and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-official-renders-just-leaked-before-unpacked-here-it-is-in-every-single-color">Galaxy Z Fold 8 Ultra </a>— boosting the battery capacity to 5,000 mAh. The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-everything-you-need-to-know-about-the-new-wider-foldable">Galaxy Z Fold 8 </a>is sitting pretty with 4,800 mAh, while the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-everything-we-know-so-far"> Galaxy Z Flip 8</a> is sadly stuck at 4,300 mAh.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5AAnW"></div>                            </div>                            <script src="https://kwizly.com/embed/W5AAnW.js" async></script><h2 id="why-has-samsung-switched-now">Why has Samsung switched now?</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="ejkQswQoRoh8hJSyeLCFdZ" name="Samsung Galaxy Z Flip 8 hands-on" alt="Samsung Galaxy Z Flip 8 hands-on." src="https://cdn.mos.cms.futurecdn.net/ejkQswQoRoh8hJSyeLCFdZ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Speaking ahead of Unpacked, Kadesh Beckford, Smartphone Specialist Product Manager at Samsung, said the switch to silicon carbon batteries has all been about improving the customer experience — thanks to the ability to offer more power in a smaller space. </p><p>In fact the switch to Silicon Carbon is one of the main ways Samsung has been able to add larger batteries to the Z8 series without increasing their size or weight. In fact, the Galaxy Z Fold 8 Ultra is almost identical in size and shape to the Galaxy Z Fold 7, and the Z Fold 8 is the lightest book-style foldable ever released.</p><p>That said, this decision was not one Samsung took lightly. Back in February Sung-Hoon Moon Samsung's Executive VP and Head of Smartphone R&D, admitted that silicon carbon batteries had not passed Samsung's "very rigorous validation standards." </p><p>Beckford also emphasized that Samsung had done its due diligence before adopting silicon carbon. He also emphasized the fact that silicon carbon was how Samsung added such large batteries to the Galaxy Z 8 series, and how much battery life was being improved as a result. Which is a pretty obvious benefit for the end user.</p><p>The caution is somewhat understandable from Samsung's perspective. Next month marks the 10th anniversary of the launch of the Galaxy Note 7, which was an unmitigated disaster for Samsung due to various flaws in the phone's (then) new battery design. The absolute last thing Samsung needs is to make the switch to silicon carbon and have something similar happen again.</p><p>The good news is that silicon carbon has already proven itself across a multitude of devices, even if the likes of Apple and Google have so far chosen to stick with a traditional lithium ion battery design. </p><p>Here's hoping that Samsung's switch gives them an incentive to jump on the bandwagon themselves — especially since the<a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-tipped-to-be-heaviest-iphone-ever-heres-3-reasons-why-thats-a-good-thing"> iPhone 18 Pro Max is rumored to be the heaviest iPhone ever</a>, weighing in with a gargantuan 240 grams (8.4 ounces).</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/samsung-phones/how-to-watch-summer-galaxy-unpacked-2026-galaxy-z-fold-8-fold-8-ultra-flip-8-and-more">How to watch Summer Galaxy Unpacked 2026 — Galaxy Z Fold 8, Fold 8 Ultra, Flip 8 and more</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-card-takes-aim-at-apple-card-with-way-more-perks-and-rewards-heres-what-you-get">Samsung Galaxy Card takes aim at Apple Card with way more perks and rewards — here’s what you get</a></li><li><a href="https://proof.vanilla.tools/tomsguide/articles/edit/qaiPHbDZH7NpWPPnBu3nW5">Light just announced a $299 flip phone to cure screen addiction — and its</a> <a href="https://proof.vanilla.tools/tomsguide/articles/edit/qaiPHbDZH7NpWPPnBu3nW5">co-founder convinced me to embrace being bored again</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Pompeii: Out of Time With Tom Hiddleston' online from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/watch-pompeii-out-of-time-with-tom-hiddleston</link>
                                                                            <description>
                            <![CDATA[ The Marvel actor takes us back to 79CE for a history lesson - here's how to watch "Pompeii: Out of Time With Tom Hiddleston" online from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Ad8PpiR2k9MXdLRbzs9fyW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nDtrYTDjhrHjn6FZJeHDgS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.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/nDtrYTDjhrHjn6FZJeHDgS-1280-80.jpg">
                                                            <media:credit><![CDATA[National Geographic]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tom Hiddleston in promotional image for &quot;Pompeii: Out of Time&quot;]]></media:description>                                                            <media:text><![CDATA[Tom Hiddleston in promotional image for &quot;Pompeii: Out of Time&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Tom Hiddleston in promotional image for &quot;Pompeii: Out of Time&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nDtrYTDjhrHjn6FZJeHDgS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>What better way to learn about history than to have Tom Hiddleston guiding us through time to discover the truth about the tragedy of Pompeii?</p><p>Below is our guide to how to watch "Pompeii: Out of Time With Tom Hiddleston" from anywhere — live or on demand — including <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>how to tune in with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Pompeii: Out of Time With Tom Hiddleston' release date and time</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Pompeii: Out of Time With Tom Hiddleston" premieres on Wednesday, July 22, 2026 at 8 p.m. ET.<br><strong>• WATCH LIVE </strong>— <strong>National Geographic </strong>live via <a data-analytics-id="inline-link" href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>YouTube TV</strong></a><strong> </strong><br><strong>• U.S. </strong>— Stream on <a data-analytics-id="inline-link" href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2aivFEQ&offerid=1589248.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow">Hulu</a> from July 23<br><strong>• Global </strong>— Stream on <a data-analytics-id="inline-link" href="https://www.disneyplus.com/">Disney+</a><br><strong>• Watch anywhere </strong>— try <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk free</strong></a></p></div></div><p>This documentary is split into three parts, with Hiddleston investigating how the warning signs for the eruption of Mount Vesuvius was missed by Ancient Romans, before diving into what actually happened as the disaster occurred.</p><p>Hiddleston wraps up the series by looking at those who survived as ash and fire descended on Pompeii, with new evidence detailing the experience of three real Romans at the time.</p><p>If you're keen to learn more about this period of history, check out the following information regarding <strong>how to watch "Pompeii: Out of Time With Tom Hiddleston"</strong> with live viewing and streaming options available.</p><h3 class="article-body__section" id="section-how-to-watch-pompeii-out-of-time-with-tom-hiddleston-for-free"><span>How to watch 'Pompeii: Out of Time With Tom Hiddleston' for FREE</span></h3><p>"Pompeii: Out of Time With Tom Hiddleston" is available to watch live and free even if you don't have cable.</p><p>You can watch the doc via <a href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow">YouTube TV</a> and and <a href="https://www.fubo.tv/" target="_blank" rel="nofollow">Fubo</a> which give you access to linear TV and cable channels like National Geographic. You can get a free trial on both which will cover the full three-episode airing of "Pompeii: Out of Time With Tom Hiddleston" on the channel.</p><p>Remember, you'll need a VPN to watch if you're not in the U.S. right now. We recommend <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>.</p><h2 class="article-body__section" id="section-watch-pompeii-out-of-time-with-tom-hiddleston-from-anywhere"><span>Watch 'Pompeii: Out of Time With Tom Hiddleston' from anywhere</span></h2><p>Traveling when "Pompeii: Out of Time With Tom Hiddleston" airs? A <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a>, or virtual private network, can make your device appear to be back in your home country so you can log in to the streaming services you already pay for while you’re away.</p><p>We’ve tested all the major options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> remains one of the best VPN services right now. It’s fast, easy to use, and works across phones, laptops, tablets, streaming sticks, and smart TVs. There’s also a 30-day money-back guarantee, so you can try it with very little risk.</p><div class="product"><a data-dimension112="a2d6ce84-7f7f-11f1-acd2-0fed1c52b4f1" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="a2d6ce84-7f7f-11f1-acd2-0fed1c52b4f1" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25=""><strong>NordVPN deal: 3 Months Extra FREE</strong></a><br><br>Boasting lightning -fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><strong></strong><br><strong>✅ 3 months extra FREE!</strong><br><strong>✅ 75% off usual price</strong><br><br>Use Nord to unblock your usual streaming service and watch "Pompeii: Out of Time With Tom Hiddleston" from anywhere in the world.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="a2d6ce84-7f7f-11f1-acd2-0fed1c52b4f1" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25="">View Deal</a></p></div><p>Using a VPN is incredibly simple.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favourite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you're outside the U.S. but want to watch the show as usual, you'd select a U.S. server from the list.</p><p><strong>3. Sit back and enjoy the action. </strong>Head over to <a href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2aivFEQ&offerid=1589248.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>Hulu</strong></a> and watch "Pompeii: Out of Time With Tom Hiddleston" as normal.</p><h2 class="article-body__section" id="section-watch-pompeii-out-of-time-with-tom-hiddleston-in-the-u-s"><span>Watch 'Pompeii: Out of Time With Tom Hiddleston' in the U.S.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="UHZYAaZCSyV7FkHxYGxtJ6" name="TG_US_Flag_1920_400_shutterstock.jpg" alt="US flag" src="https://cdn.mos.cms.futurecdn.net/UHZYAaZCSyV7FkHxYGxtJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>In the U.S., "Pompeii: Out of Time With Tom Hiddleston" airs on Nat Geo. It premieres on Wednesday, July 22, at 8 p.m. ET, with three one-hour episodes airing back-to-back.</p><p>You can stream NatGeo live through services such as <a href="https://www.fubo.tv/" target="_blank" rel="nofollow">Fubo</a>, <a href="https://click.linksynergy.com/fs-bin/click?id=kXQk6*ivFEQ&offerid=966271.482&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow">Hulu + Live TV</a> and <a href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow">YouTube TV</a>, with <a href="https://www.sling.com/" target="_blank" rel="nofollow">Sling Blue</a> carrying the channel in select markets. </p><p>But, what if you miss the live broadcast? The three-part doc lands on <a href="https://www.hulu.com/welcome" target="_blank" rel="nofollow"><strong>Hulu</strong></a> the next day, starting <strong>Thursday, July 23</strong>.</p><p>If you're outside the U.S. when the show airs, you can use a VPN such as <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> to access your usual services while traveling.</p><h3 class="article-body__section" id="section-watch-pompeii-out-of-time-with-tom-hiddleston-in-canada"><span>Watch 'Pompeii: Out of Time With Tom Hiddleston' in Canada</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="eByagaoLZki73CLtYaRPMG" name="TG_Canada_Flag_1920_400_shutterstock.jpg" alt="Canada Flag" src="https://cdn.mos.cms.futurecdn.net/eByagaoLZki73CLtYaRPMG.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>In Canada, you can stream "Pompeii: Out of Time With Tom Hiddleston" on <a href="https://www.disneyplus.com" target="_blank" rel="nofollow"><strong>Disney+</strong></a>.</p><p>The cheapest subscription plan starts at CA$8.99/month.</p><p>Travelers from the U.S. visiting Canada can also <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>use a VPN</strong></a> to access their home subscriptions.</p><h3 class="article-body__section" id="section-how-to-watch-pompeii-out-of-time-with-tom-hiddleston-in-the-u-k"><span>How to watch 'Pompeii: Out of Time With Tom Hiddleston' in the U.K.</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="ttCSpj8r9kHj68j7NhsBL9" name="TG_British_Flag_1920_400_shutterstock.jpg" alt="British flag" src="https://cdn.mos.cms.futurecdn.net/ttCSpj8r9kHj68j7NhsBL9.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>You can stream "Pompeii: Out of Time With Tom Hiddleston" on <a href="https://www.disneyplus.com/" target="_blank" rel="nofollow"><strong>Disney</strong>+</a> in the U.K. from Thursday, July 23.</p><p>Prices start at £5.99/month in the U.K..</p><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> can help you sign in to Disney+ if you're outside Blighty at the moment.</p><h3 class="article-body__section" id="section-how-to-watch-pompeii-out-of-time-with-tom-hiddleston-in-australia"><span>How to watch 'Pompeii: Out of Time With Tom Hiddleston' in Australia</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="R4wb8TX7wmafWv7eBYfay3" name="TG_australia_Flag_1920_400_shutterstock.jpg" alt="Australia flag" src="https://cdn.mos.cms.futurecdn.net/R4wb8TX7wmafWv7eBYfay3.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>It is the same process in Australia, with "Pompeii: Out of Time With Tom Hiddleston" set to stream on-demand on <a href="https://www.disneyplus.com/" target="_blank" rel="nofollow"><strong>Disney+</strong></a> from July 23.</p><p>Disney+ starts at AU$9.99/month in Australia.</p><p>If you're traveling and already subscribe to a service carrying the show in your home region, a VPN like <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is the easiest way to keep watching without disruption.</p><h2 id="pompeii-out-of-time-with-tom-hiddleston-trailer">'Pompeii: Out of Time With Tom Hiddleston' - trailer</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/7k52aJRs3gA" allowfullscreen></iframe></div></div><h2 id="pompeii-out-of-time-with-tom-hiddleston-episode-guide">'Pompeii: Out of Time With Tom Hiddleston' - Episode Guide</h2><ol start="1"><li><strong>Tremors: </strong>Will anyone recognize the warning signs before it's too late?</li><li><strong>Eruption: </strong>As chaos erupts, who will flee, and who will step up to lead?</li><li><strong>Survival: </strong>In the final moments, what does it truly mean to survive?</li></ol><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/how-to-watch-the-real-wolf-of-wall-street">How to watch 'The Real Wolf of Wall Street’ online</a></li><li><a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">The best streaming services to subscribe to right now</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-salisbury-poisonings-a-spy-next-door">How to watch 'The Salisbury Poisonings: A Spy Next Door' online</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ IKEA just dropped a sleek cooler that will be my summer essential — and it's just $40 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/outdoors/ikea-just-dropped-a-sleek-cooler-that-will-be-my-summer-essential-and-its-just-usd40</link>
                                                                            <description>
                            <![CDATA[ I discovered this sleek IKEA cooler basket that will instantly spruce up my summer outings — here's why. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FDEsv4YkLwGXAMBnzpSaaB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yjocrBu9qkFUmQW6RjTSR6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 10:39:12 +0000</pubDate>                                                                                                                                <updated>Wed, 22 Jul 2026 10:50:26 +0000</updated>
                                                                                                                                            <category><![CDATA[Outdoors]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.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/yjocrBu9qkFUmQW6RjTSR6-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Ikea store]]></media:description>                                                            <media:text><![CDATA[Ikea store]]></media:text>
                                <media:title type="plain"><![CDATA[Ikea store]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yjocrBu9qkFUmQW6RjTSR6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer has arrived, and I’m already planning my favorite activities — from scenic park picnics and road trips to various outdoor excursions. And there’s no doubt that having one of the <a href="https://www.tomsguide.com/best-picks/best-coolers">best coolers</a> is ideal to keep all your beverages and snacks chilled and refreshing. </p><p>The trouble I find is that most of them are either bulky and cumbersome (read: boring-looking), or simply too expensive. Plus, I needed something compact that wasn't too heavy to carry around, only for a few essential items. </p><p>That’s why this new I<a href="https://www.ikea.com/us/en/p/soluppgang-cooler-basket-bamboo-00630278/" target="_blank" rel="nofollow">KEA SOLUPPGÅNG Cooler basket</a> instantly caught my attention. Made from a bamboo design, this basket is not only sleek and lightweight to carry but does a good job of disguising the fact that it’s actually a cooler. </p><p>What’s more, this limited-edition essential is a steal at just $40, and I’d say it’s a worthwhile investment for the summer.</p><p>So if you’re looking to spruce up your outings or need a budget-friendly way to chill your drinks, here’s why I’ll be grabbing this cooler basket today.</p><div class="product"><a data-dimension112="35c726d6-85b0-11f1-a8ca-f3595589e7f3" data-action="Deal Block" data-label="With its natural bamboo texture and sleek dimensions of 14 x 13 x 8cm, this cooler basket can hold up to 4 gallons. This is adequate for drinks, snacks, and other items. It also comes with separate compartments inside to keep your food, beverages, and ice packs separate and well protected. Not bad for $40." data-dimension48="With its natural bamboo texture and sleek dimensions of 14 x 13 x 8cm, this cooler basket can hold up to 4 gallons. This is adequate for drinks, snacks, and other items. It also comes with separate compartments inside to keep your food, beverages, and ice packs separate and well protected. Not bad for $40." data-dimension25="$40" href="https://www.ikea.com/us/en/p/soluppgang-cooler-basket-bamboo-00630278/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:750px;"><p class="vanilla-image-block" style="padding-top:112.13%;"><img id="xwgrwfnL5HBCwx68bYBtJK" name="IKEA SOLUPPGÅNG Cooler basket, bamboo" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xwgrwfnL5HBCwx68bYBtJK.jpg" mos="" align="middle" fullscreen="" width="750" height="841" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With its natural bamboo texture and sleek dimensions of 14 x 13 x 8cm, this cooler basket can hold up to 4 gallons. This is adequate for drinks, snacks, and other items. It also comes with separate compartments inside to keep your food, beverages, and ice packs separate and well protected. Not bad for $40. <a class="view-deal button" href="https://www.ikea.com/us/en/p/soluppgang-cooler-basket-bamboo-00630278/" target="_blank" rel="nofollow" data-dimension112="35c726d6-85b0-11f1-a8ca-f3595589e7f3" data-action="Deal Block" data-label="With its natural bamboo texture and sleek dimensions of 14 x 13 x 8cm, this cooler basket can hold up to 4 gallons. This is adequate for drinks, snacks, and other items. It also comes with separate compartments inside to keep your food, beverages, and ice packs separate and well protected. Not bad for $40." data-dimension48="With its natural bamboo texture and sleek dimensions of 14 x 13 x 8cm, this cooler basket can hold up to 4 gallons. This is adequate for drinks, snacks, and other items. It also comes with separate compartments inside to keep your food, beverages, and ice packs separate and well protected. Not bad for $40." data-dimension25="$40">View Deal</a></p></div><h3 class="article-body__section" id="section-why-the-new-ikea-cooler-will-be-my-summer-go-to"><span>Why the new IKEA Cooler will be my summer go-to</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:891px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="FqXUnTKHcBGJJ35rwVhC2W" name="IKEA SOLUPPGÅNG Cooler basket, bamboo" alt="IKEA SOLUPPGÅNG Cooler basket, bamboo" src="https://cdn.mos.cms.futurecdn.net/FqXUnTKHcBGJJ35rwVhC2W.jpg" mos="" align="middle" fullscreen="" width="891" height="501" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">IKEA SOLUPPGÅNG Cooler basket, bamboo </span><span class="credit" itemprop="copyrightHolder">(Image credit: IKEA)</span></figcaption></figure><p>Perhaps one of the key selling points for me is that this IKEA find resembles a chic picnic basket rather than a typical, clunky cooler. But unlike most baskets, this is lightweight to carry around, thanks to a sturdy, solid bamboo handle.</p><div><blockquote><p>This IKEA find resembles a chic picnic basket rather than a typical, clunky cooler.</p></blockquote></div><p>It also has a four-gallon capacity, which is adequate to keep a few large bottles and tasty snacks chilled for the afternoon. The cooler also features a dedicated insulating liner, while individual sections ensure that your snacks, drinks, and cooling elements are all separated.</p><p>Another feature I love is the detachable bamboo lid, which only adds to the basket’s overall chic aesthetic.</p><p>What’s more, it’s compact enough for car travel or storing in tight spots — plus its attractive design does a great job of disguising its true purpose. Not bad for just $40, which won’t break the bank. </p><p>Be it going on beach trips or park music festivals, I’ll certainly be making the most of this cooler this summer.  </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/ive-just-found-12-ikea-storage-ideas-that-are-perfect-for-my-tiny-entryway-all-under-usd20">I’ve just found 12 IKEA storage ideas that are perfect for my tiny entryway — all under $20</a></li><li><a href="https://www.tomsguide.com/home/i-just-found-this-clever-ikea-hack-that-turns-a-classic-storage-staple-into-a-stylish-coffee-bar">I just found this clever IKEA hack that turns a classic storage staple into a stylish coffee bar</a></li><li><a href="https://www.tomsguide.com/home/i-just-discovered-5-ikea-outdoor-essentials-for-your-yard-this-summer-that-are-so-underrated">5 IKEA outdoor essentials for your yard this summer that are so underrated</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Should you lease your next iPhone? What you need to know about the rumored 'Apple Upgrade' program ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/should-you-lease-your-next-iphone-what-you-need-to-know-about-the-rumored-apple-upgrade-program</link>
                                                                            <description>
                            <![CDATA[ A new rumor suggests Apple is ending its iPhone upgrade plan for a new 'leasing' program. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qaiPHbDZH7NpWPPnBu3nW5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qJL3bookpxHcLaHpqtC4YQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/qJL3bookpxHcLaHpqtC4YQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 13 on display inside Apple Store]]></media:description>                                                            <media:text><![CDATA[iPhone 13 on display inside Apple Store]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 13 on display inside Apple Store]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qJL3bookpxHcLaHpqtC4YQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple is reportedly planning on ditching its long-running iPhone Upgrade plan for a new "leasing" program. The new "Apple Upgrade" program is allegedly going to launch at the end of the month.</p><p>According to <a href="https://www.bloomberg.com/news/articles/2026-07-21/apple-to-launch-upgrade-device-leasing-program-with-klarna-to-spur-sales" target="_blank">Bloomberg's Mark Gurman</a>, the new plan will be similar to how a car lease works with options to upgrade a new device early or keep or return the iPhone at the end of the lease. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X7AA1W"></div>                            </div>                            <script src="https://kwizly.com/embed/X7AA1W.js" async></script><p>One upside of the plan is that it will supposedly cover most Apple devices including iPhones, Mac, iPad and Apple Watch models. Apple is allegedly partnering with <a href="https://www.tomsguide.com/news/klarna-shopping-app-embraces-ai-to-help-shoppers-find-the-best-sales">Klarna</a>, a digital banking platform based out of Sweden. You may be most familiar with Klarna and its "Pay Later" program, similar to offerings from PayPal and Affirm.</p><p>However, entry-level devices like the base model iPad, Apple Watch SE and <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-at-usd699-is-it-still-worthwhile-or-should-you-get-the-new-xps-13-instead">MacBook Neo </a>are reportedly not eligible for the new program. Additionally, Apple is not including AppleCare with the plan, unlike the iPhone Upgrade Program. Unfortunate since <a href="https://appleinsider.com/articles/26/07/21/apples-iphone-upgrade-program-was-great-while-it-lasted">Apple just raised AppleCare subscription prices</a>.</p><h2 id="how-the-apple-upgrade-program-could-work">How the 'Apple Upgrade' program could work</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zfqhHJwLq6gXDG26NbSkVR" name="Apple logo building.jpg" alt="Apple logo on Apple Store" src="https://cdn.mos.cms.futurecdn.net/zfqhHJwLq6gXDG26NbSkVR.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: Getty Images)</span></figcaption></figure><p>Per Gurman, starting July 28 this Apple Upgrade program would replace the iPhone Upgrade plan with 24-month leases for iPhones and Apple Watches, and 36-month leases for iPads and Macs. Apparently, you will need to be approved via a soft credit check. </p><p>Current iPhone Upgrade subscribers can upgrade to the newest model, presuming they've kept up 12 months of payments. Gurman says you'll be able to upgrade to a new model earlier if you want, like a car lease. That would just extend the lease another two years.</p><p>Allegedly, Apple is planning to pitch the change as a way for customers to have lower payments versus current financing programs. Most customers, at least in the U.S., who don't purchase directly from Apple likely lock into contracts with the big three network carriers that offer "free" iPhones, but really it's subsidized into your bill over the contract period.</p><h2 id="what-it-replaces">What it replaces</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:1500px;"><p class="vanilla-image-block" style="padding-top:68.53%;"><img id="3bZjH7a8bvBvfWpssjowee" name="iPhone-6s-Plus-front.jpg" alt="iPhone 6s Plus" src="https://cdn.mos.cms.futurecdn.net/3bZjH7a8bvBvfWpssjowee.jpg" mos="" align="middle" fullscreen="" width="1500" height="1028" attribution="" endorsement="" class="inline"></p></div></div></figure><p>The iPhone Upgrade Program has existed since 2015 as a way for Apple-buyers to upgrade to the premium iPhone at a lower monthly cost than the upfront price. It is (or was) marketed as a first-party program directly through Apple.</p><p>Importantly, the iPhone Upgrade program let you get a new iPhone every year (after 12 installments) without being tied to one carrier. Apple also threw in its AppleCare+ warranty, which includes up to two years of hardware repairs, software support and up to two incidents of accidental damage coverage (subject to an additional service fee). </p><p>Beyond that, it means Apple is operating through a new partner, Klarna, instead of Citizens One in the U.S. and Barclays in the U.K. It mostly means that Apple continues not having to bear the risk of financing. </p><p>It's not clear from Gurman's report if current subscribers to the iPhone Upgrade Program will be pushed over to the new Apple Upgrade plan, especially with the lack of AppleCare. </p><h2 id="lease-to-own">Lease to own?</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="eZEvet7jKWwYRdfnbLDBfB" name="HP laptop subscription" alt="Screenshot of HP laptop subscription page" src="https://cdn.mos.cms.futurecdn.net/eZEvet7jKWwYRdfnbLDBfB.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: HP)</span></figcaption></figure><p>One of the fears surrounding the ongoing RAM crisis is that companies will force you to rent your computers instead owning them moving forward. This does feel like Apple attempting to build their version of that concept. </p><p>Earlier this year, <a href="https://www.tomsguide.com/computing/thats-not-going-to-last-jeff-bezos-believes-ai-will-force-you-to-rent-your-pc-from-the-cloud-and-the-ram-crisis-is-accelerating-it">comments made by Amazon's Jeff Bezos </a>resurfaced when he claimed that computing wasn't going to be something rented off the grid. "That's not going to last. It makes no sense. You're going to buy compute off the grid. That's AWS," Bezos predicted.</p><p>In February, <a href="https://www.tomsguide.com/computing/laptops/hp-wants-you-to-rent-your-next-laptop-heres-why-thats-a-terrible-idea">HP launched a laptop subscription service</a> that lets you pay a monthly fee for an AI-powered PC that starts around $34.99 per month. We did the math and found that after three years, you'd be overpaying for the laptops. </p><p>Phones and laptops are expensive, with starting prices for a decent model starting around $700. For many, having that kind of scratch on hand can be tough, but a phone and laptop are nearly essential in today's world. </p><p>Plus, as <a href="https://www.tomsguide.com/gaming/a-playstation-6-without-a-disc-drive-im-done-with-sony">we've repeatedly found</a> with<a href="https://www.tomsguide.com/gaming/pc-gaming/steam-now-confirms-youre-buying-a-license-not-a-game-heres-why-that-sucks"> digital games</a>, movies and ebooks, it means<a href="https://www.tomsguide.com/computing/microsoft-365-more-like-microsoft-364-why-yesterdays-outage-proves-these-companies-dont-yet-have-a-backup-plan-for-the-internet"> you don't own the product</a>, which also means companies can take them away whenever they want. </p><p>The next big fight in tech between the little guy and big corporations may be over the right to own the things we pay 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/phones/iphones/ios-27-beta-4-is-now-here-all-the-newest-features-for-your-iphone">iOS 27 beta 4 is now here — all the newest features for your iPhone</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-card-takes-aim-at-apple-card-with-way-more-perks-and-rewards-heres-what-you-get">Samsung Galaxy Card takes aim at Apple Card with way more perks and rewards — here’s what you get</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/apple-made-every-macbook-more-expensive-heres-how-id-buy-one-without-paying-the-ai-tax">The ultimate guide to buying a MacBook after Apple's RAM crisis price surge</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Introducing the Tom’s Guide Computing & Gaming Awards 2026: Here’s how to enter ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/introducing-the-toms-guide-computing-and-gaming-awards-2026-heres-how-to-enter</link>
                                                                            <description>
                            <![CDATA[ Nominations are now open for the Tom’s Guide Computing and Gaming Awards 2026 and this is everything brands need to know about categories, eligibility, fees and deadlines. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">QJ4ve742H7UmjsFFnYSgd3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3gpssojDmYaDR5uPnSnHWj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 10:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 22 Jul 2026 15:06:58 +0000</updated>
                                                                                                                                            <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&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/3gpssojDmYaDR5uPnSnHWj-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A desktop PC and a monitor on a table with a Tom&#039;s Guide Computing and Gaming Awards 2026 badge]]></media:description>                                                            <media:text><![CDATA[A desktop PC and a monitor on a table with a Tom&#039;s Guide Computing and Gaming Awards 2026 badge]]></media:text>
                                <media:title type="plain"><![CDATA[A desktop PC and a monitor on a table with a Tom&#039;s Guide Computing and Gaming Awards 2026 badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3gpssojDmYaDR5uPnSnHWj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>From ultra-portable laptops and beefy gaming PCs to the essential accessories that make your daily setup faster and easier, we’re spoiled for choice when it comes to computing today.</p><p>That’s why Tom’s Guide is officially opening nominations for our Computing & Gaming Awards 2026. This year, we're putting the spotlight on the most innovative devices and technologies on the market — from premium flagships to unmatched value picks. If you think your product has what it takes to outshine the competition, <strong>now is the time to </strong><a href="https://future.swoogo.com/tomsguideawards2026/begin?reg_type_id=1117790"><strong>submit it</strong></a><strong> to our team for consideration.</strong></p><p>We’ll be crowning winners across nine distinct categories, ranging from everyday laptops and gaming rigs to mice, displays and peripherals. Winners will be selected based on our extensive testing and hands-on experience. Plus, with multiple award opportunities within each category, there’s more than one chance to win.</p><p>Read on for a breakdown of each category to learn what our editors are looking for and to find out how to submit your entry.</p><h3 class="article-body__section" id="section-award-categories"><span>Award categories</span></h3><p>We’re currently seeking entries across nine major categories including laptops, gaming laptops, gaming PCs, mini PCs, monitors, keyboard, mice, webcams and value picks. We reserve the right to modify these categories based on the submissions — especially if we see a number of similar entries in one category or not enough in another.</p><h2 id="laptops">Laptops</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pN7BQ5Lshb7rpPgiwrZE2k" name="Asus ROG Zephyrus G14 (2025)" alt="Asus ROG Zephyrus G14 (2025)" src="https://cdn.mos.cms.futurecdn.net/pN7BQ5Lshb7rpPgiwrZE2k.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>From ultra-portable Copilot+ PCs and sleek 2-in-1s to high-refresh gaming rigs packed with heavy-duty GPUs, today's notebooks are pushing boundaries on every front. Whether designed for all-day battery life, sleek portability or high-frame-rate gaming on the go, this category honors the laptops that get the balance right without compromise. </p><h2 id="gaming-pcs">Gaming PCs</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="RAJNKBSGMvRBmpbB4FutR4" name="HP Omen 35L-05" alt="HP Omen 35L" src="https://cdn.mos.cms.futurecdn.net/RAJNKBSGMvRBmpbB4FutR4.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>From high-end prebuilt rigs to smartly designed desktop systems, this category is for PCs that deliver the speed, graphics and uncompromised performance gamers expect. Whether pushing 4K frame rates or handling heavy live streaming, these are the desktops that set the standard for power. </p><h2 id="monitors">Monitors</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="DpJKKxhxAGedk6EysavKJQ" name="BenQ_designVue_.JPG" alt="A photo of the BenQ PD3226G monitor in a blue-walled studio" src="https://cdn.mos.cms.futurecdn.net/DpJKKxhxAGedk6EysavKJQ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Whether built for high-refresh competitive gaming, ultra-color-accurate creative work or massive multitasking across an ultrawide canvas, we're looking for screens that make everything look and feel better. This category highlights the displays setting new benchmarks in panel tech, ergonomics and visual clarity. </p><h2 id="peripherals">Peripherals</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="vMGpmubyydhZ3u2CbUbHMW" name="Keychron Q11 Ultra-1-LEDE" alt="The Keychron Q11 Ultra split mechanical keyboard next to a vertical mouse and a mini PC on a desk" src="https://cdn.mos.cms.futurecdn.net/vMGpmubyydhZ3u2CbUbHMW.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>From mechanical favorites and ergonomic mice to high-def webcams, this category celebrates the gear that makes typing, gaming, navigating and video calling feel smoother, sharper and more precise. We want to highlight the everyday desk heroes, comfort-first devices and streaming cameras people don't want to replace. </p><h2 id="value-picks">Value picks</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="7yMAy3Qzy3opbJtxKum4va" name="Asus Chromebook CX15" alt="Asus Chromebook CX15" src="https://cdn.mos.cms.futurecdn.net/7yMAy3Qzy3opbJtxKum4va.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>Great tech doesn't always need a flagship price tag. This category is dedicated to the budget-friendly standout products that manage to deliver premium features, reliable performance and exceptional quality without breaking the bank. </p><h3 class="article-body__section" id="section-how-to-enter"><span>How to enter </span></h3><p><strong>Brands can submit products via our </strong><a href="https://future.swoogo.com/tomsguideawards2026/begin?reg_type_id=1117790"><strong>online entry form</strong></a> by selecting the appropriate category and following the “Enter Now” buttons on the awards site.</p><p><strong>Entry fee:</strong> $250 per product, per category<br><br>No limit on submissions and products can be entered into multiple categories (additional $250 per category).  </p><p><strong>Deadline: July 29, 2026</strong></p><p>Category winners will be announced in late August.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Prime Video top 10 shows — here’s the 3 worth binge-watching this week (July 22-28) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-shows-heres-the-3-worth-binge-watching-this-week-july-22-28</link>
                                                                            <description>
                            <![CDATA[ Our weekly guide on the three shows currently dominating Prime Video’s top 10 list, including a new action-comedy series sitting in the No. 1 spot. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">euBqBwaneh8jdZDfwcAD6a</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RBEkPX8MHun7dvqTrBme8Y-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 09:44:39 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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.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/RBEkPX8MHun7dvqTrBme8Y-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a green leafy background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a green leafy background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a green leafy background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RBEkPX8MHun7dvqTrBme8Y-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With August knocking on the door next week, 2026 feels like it’s flying by. As summer starts to slip away, many people are probably making the most of the last warm evenings outdoors, but those looking to cool off indoors with a great binge-watch will want to check out <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video’s</a> top 10. The streamer’s trending list offers a quick guide to what’s currently capturing viewers’ attention and what’s worth adding to your watchlist.</p><p>Prime Video’s chart has plenty of great shows to stream this week. The lineup includes a new action-comedy series that has already claimed the No. 1 spot, a sci-fi thriller set inside a 144-story underground bunker, and a romance packed with emotional drama. So, if you’re looking for your next binge, here are three Prime Video shows worth watching right now.</p><p><em><strong>This list is based on the Prime Video U.S. top 10 shows as of Wednesday, July 22, 2026.</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxxBO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxxBO.js" async></script><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h3 class="article-body__section" id="section-best-shows-in-the-prime-video-top-10"><span>Best shows in the Prime Video top 10</span></h3><h2 id="ride-or-die">‘Ride or Die’ </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/QFGAxkTRAG8" allowfullscreen></iframe></div></div><p>Prime Video's latest No. 1 show is the action-comedy “Ride or Die,” which I can only describe as “Thelma & Louise” meets “James Bond.” It's a high-energy, fast-paced buddy caper centered on the hilarious and deeply relatable ups and downs of a lifelong female friendship. If you’re looking for a fun, bingeable summer watch with incredible lead chemistry, sleek car chases, and stylish fight choreography, “Ride or Die” deserves a spot on your watchlist.</p><p>“Ride or Die” follows lifelong best friends Debbie Claybourne (Octavia Spencer) and Judith Burton (Hannah Waddingham), whose lives quickly change when Debbie discovers that Judith has secretly spent years working as an international assassin. After a mission goes disastrously wrong, the pair are forced to flee across Europe while being pursued by dangerous criminals and figures from Judith’s past. The series also stars Bill Nighy, Ed Skrein, and Calam Lynch.</p><p><em><strong>Watch "Ride or Die" on </strong></em><a href="https://www.amazon.com/Ride-or-Die-Season-1/dp/B0DNSTJRC8" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="silo">‘Silo’</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/8ZYhuvIv1pA" allowfullscreen></iframe></div></div><p>There’s no better time to watch “Silo” now that season 3 is streaming on Apple TV. Based on Hugh Howey’s Wool book trilogy, this sci-fi thriller will appeal to fans of mystery-box shows like “Severance,” “Lost,” and “Snowpiercer.” Packed with huge twists and memorable characters, “Silo” is a benchmark for dystopian television. Apple TV has also proven its confidence in the show by renewing it for a fourth and final season, ensuring the story will receive the complete ending it deserves.</p><p>In a ruined future, the last 10,000 humans reside inside a self-sustaining, 144-story subterranean bunker known as the Silo. Bound by strict laws designed to protect them from a toxic surface world, the inhabitants live without knowledge of who built their home or why. When the local sheriff breaks a cardinal rule and residents begin dying under mysterious circumstances, Juliette (Rebecca Ferguson), a pragmatic engineer from the lowest mechanical levels, takes up the badge. </p><p><em><strong>Watch "Silo" season 1 on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0DG8P2VQ3" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> and seasons 2-3 on </strong></em><a href="https://tv.apple.com/us/show/silo/umc.cmc.3yksgc857px0k0rqe5zd4jice" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><h2 id="the-summer-i-turned-pretty">‘The Summer I Turned Pretty’</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/LPNs5kKeEgE" allowfullscreen></iframe></div></div><p>Summer has always been the perfect time to binge a romance series, and “The Summer I Turned Pretty” is one I regularly go back to when I’m in need of a mood-booster. Based on the bestselling young-adult book trilogy written by Jenny Han, this series became a massive social media phenomenon when its first season aired in 2022 (we all loved the yearning). Following the three-season TV run, Prime Video greenlit a continuation movie rather than another season to give the story’s final major milestone a cinematic scale.</p><p>“The Summer I Turned Pretty” follows Isabel “Belly” Conklin (Lola Tung), a teenager who spends every summer at a Cousins Beach house with her mother, brother, and her mother’s best friend, Susannah (Rachel Blanchard). Susannah’s two teenage sons, Conrad (Christopher Briney) and Jeremiah (Gavin Casalegno), have always treated Belly like a younger sister.  Everything changes the summer Belly turns 16. Having matured, she catches the romantic attention of both brothers, pulling her into a dangerous love triangle.</p><p><em><strong>Watch "The Summer I Turned Pretty" on </strong></em><a href="https://www.amazon.com/Summer-Turned-Pretty-Season/dp/B09NF4J7XW" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-prime-video-top-10-shows-right-now"><span>Prime Video top 10 shows right now</span></h3><p>1. "Ride or Die" (2026)<br>2. Elle" (2026)<br>3. "Off Campus" (2026)<br>4. "Every Year After" (2026)<br>5. "Spider-Noir" (2026)<br>6. "Murder 101" (2026)<br>7. "See You at Work Tomorrow" (2026)<br>8. "The Summer I Turned Pretty" (2022)<br>9.  "Silo" (2023)<br>10. "The Boys" (2019)</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/prime-video/5-best-prime-video-movies-to-stream-now-before-they-leave-in-july-2026">5 Prime Video movies to stream before they leave in July 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-usd150-million-disaster-movie-about-the-moon-falling-out-of-orbit-july-21-27">3 new to Prime Video thriller movies to stream this week</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-must-watch-classic-movies-just-added-to-prime-video-including-clint-eastwoods-iconic-western-trilogy">5 must-watch classic movies just added to Prime Video</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget iPhone 18 Pro — iPhone 20 tipped to get Apple’s biggest screen upgrade ever ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/forget-iphone-18-pro-iphone-20-tipped-to-get-apples-biggest-screen-upgrade-ever</link>
                                                                            <description>
                            <![CDATA[ Rumors of next year's iPhone 20 are already eclipsing what the 18 Pro could offer in September. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XHEV2kvKE9wmtjpWmGfo7g</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 09:29:21 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/r2pW7STcGyqWJttRcb5SAH-1280-80.jpg">
                                                            <media:credit><![CDATA[AppleTrack]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 20 render]]></media:description>                                                            <media:text><![CDATA[iPhone 20 render]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 20 render]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The iPhone 18 Pro models are right around the corner, but September's models may be merely a stopgap until the 20th anniversary next year. </p><p>We're expecting <a href="https://www.tomsguide.com/phones/iphones/iphone-20-leak-reveals-7-jaw-dropping-features-for-the-20th-anniversary-model">big changes to come with the iPhone 20</a>, and one of them may include an increased display size.</p><p>Regular Apple tipster<a href="https://weibo.com/6048569942/R9G4trdtx" target="_blank"> Digital Chat Station</a> (DCS) posted on Weibo that Apple is testing out a 7-inch display for the iPhone 20. Which, admittedly, is more of a step than a leap over the existing 6.9-inch iPhone 17 Pro Max, but it would still be the largest iPhone display to date.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdRR2e"></div>                            </div>                            <script src="https://kwizly.com/embed/OdRR2e.js" async></script><p>"An exclusive and forward-looking information shows Apple is proofing a super-large screen with a physical size of 6.96 inches and a standard size of 7 inches," DCS wrote (machine translated).</p><p>In response to a comment, DCS claimed that the aspect ratio would be similar to the iPhone 17 Pro Max "making it comfortable to hold." </p><p>It's an interesting rumor with the caveat that we're <strong>more than a year away from the anniversary edition</strong> and Apple is known to test new features all the time, even if they don't make it into the next phone.</p><h2 id="borderless-display">Borderless display</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:1355px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="66rdtKsZd3eqsFETAE5tiM" name="Screenshot 2025-08-11 150943" alt="iphone all glass design patent, possibly iphone 20 like design" src="https://cdn.mos.cms.futurecdn.net/66rdtKsZd3eqsFETAE5tiM.png" mos="" align="middle" fullscreen="" width="1355" height="762" 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>Notable Samsung leaker <a href="https://x.com/UniverseIce/status/2079536979193290823" target="_blank">Ice Universe posted a similar rumor</a> about the iPhone 20 yesterday, July 21. They suggested that Apple will achieve this larger size by decreasing the bezels on the display. </p><p>Both DCS and Ice Universe's posts seem to lend credence to<a href="https://www.tomsguide.com/phones/iphones/iphone-20s-all-glass-design-sounds-like-a-sight-to-behold-and-prototypes-might-already-exist"> previous rumors</a> that Apple is working on a <a href="https://www.tomsguide.com/phones/iphones/apples-20th-anniversary-iphone-could-use-four-edge-bending-technology-heres-what-that-means">quad-curved screen</a> for the 2027 iPhone. This means the iPhone 20 could have an all-glass design that wraps around the phone to the already glass and ceramic rear panel. The illusion will be that the <a href="https://www.tomsguide.com/phones/iphones/apple-just-revealed-what-the-all-glass-iphone-of-the-future-could-look-like-and-its-something-to-behold">iPhone 20 is completely made of glass</a>.</p><h2 id="a-few-more-iphone-20-rumors">A few more iPhone 20 rumors</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="txq3KdVwhYyxHjEbMKvcy7" name="iPhone 18 Pro render 1" alt="iPhone 18 Pro render showing punch hole camera" src="https://cdn.mos.cms.futurecdn.net/txq3KdVwhYyxHjEbMKvcy7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Front Page Tech)</span></figcaption></figure><p>With so much time in between and the iPhone 18 family likely just over a month away, we don't know much about the 20th anniversary iPhone beyond the recurring rumors of an all-glass design. </p><p>A few other tidbits have suggested that there may be <a href="https://www.tomsguide.com/phones/iphones/iphone-20-may-come-with-two-different-screen-sizes-and-launch-alongside-iphone-ultra-2">two iPhone 20 models</a> that would replace the Pro and Pro Max iterations. But it's not clear if that means the base models would also disappear. </p><p>Bloomberg's Mark Gurman has also reported that the iPhone 20 will run on a 2nm A21 chipset, meaning it will certainly be more efficient and more powerful than the current 3nm A series. We'll have to wait until we can test it ourselves to find just how powerful it is though.</p><p>Alongside the expanded display, rumors suggest <a href="https://www.tomsguide.com/phones/iphones/20th-anniversary-iphone-could-get-the-design-weve-all-been-waiting-for">Apple may ditch the cutout </a>for the front camera and Face ID in favor of under-glass versions. To be clear, this rumor has been circulating for every iPhone going back to the iPhone 14, so take this one with a grain of salt.</p><p>Other rumors suggest we may see <a href="https://www.tomsguide.com/phones/iphones/no-more-buttons-iphone-20-design-just-leaked">solid-state buttons with haptic feedback</a>, a <a href="https://weibo.com/5143897135/QDPJEnAFL" target="_blank">stronger version</a> of Ceramic Shield and a 6,000 mAh battery.</p><p>In the meantime, you can check what's happening with this year's fall event by checking out our official hubs for the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pro</a>, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> and<a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone"> iPhone Ultra.</a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/apple-made-every-macbook-more-expensive-heres-how-id-buy-one-without-paying-the-ai-tax">The ultimate guide to buying a MacBook after Apple's RAM crisis price surge</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-card-takes-aim-at-apple-card-with-way-more-perks-and-rewards-heres-what-you-get">Samsung Galaxy Card takes aim at Apple Card with way more perks and rewards — here’s what you get</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-beta-4-is-now-here-all-the-newest-features-for-your-iphone">iOS 27 beta 4 is now here — all the newest features for your iPhone</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Unpacked recap: Everything on the Galaxy Z Fold 8, Flip 8, smart glasses, Galaxy Watch 9, and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live</link>
                                                                            <description>
                            <![CDATA[ Samsung’s summer Galaxy Unpacked 2026 event showcased a major expansion with foldables like the passport-style Galaxy Z Fold 8, the flagship Galaxy Z Fold 8 Ultra, and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ABekgDrg6yRh5um5fro26T</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TKMig5M6ZDMsoYWAtLdguM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 08:06:50 +0000</pubDate>                                                                                                                                <updated>Wed, 22 Jul 2026 22:27:14 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <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/TKMig5M6ZDMsoYWAtLdguM-1280-80.jpg">
                                                            <media:credit><![CDATA[Future / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Unpacked 2026.]]></media:description>                                                            <media:text><![CDATA[Galaxy Unpacked 2026.]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Unpacked 2026.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TKMig5M6ZDMsoYWAtLdguM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-unpacked-2026-preview-galaxy-z-fold-8-z-flip-8-intelligent-eyewear-and-more">Galaxy Unpacked</a> is just wrapped up, but we have all the latest news about Samsung's announcement. This year’s reveal comes with a big surprise:  Samsung is introducing three brand-new foldables — the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a>, and <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a>.</p><p>Beyond being arguably be some of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> this year, Samsung also used the opportunity to detail the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-9-and-ultra-2-rumors-everything-weve-heard-so-far">Galaxy Watch 9</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Watch 2 Ultra</a>. And given the recent buzz around <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-saw-the-future-of-android-xr-smart-glasses-and-meta-and-apple-are-in-trouble">Android XR</a>, it's no surprise we got a teaser for the <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-hands-on-with-the-new-samsung-smart-glasses-heres-why-id-pick-them-over-meta">Samsung Galaxy Glasses</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYddRO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYddRO.js" async></script><h2 class="article-body__section" id="section-hands-on-with-the-galaxy-z-fold-8-and-z-fold-8-ultra"><span>Hands on with the Galaxy Z Fold 8 and Z Fold 8 Ultra</span></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/oFT-YOrakEg" allowfullscreen></iframe></div></div><p>We got our hands on the Galaxy Z Fold 8 and Z Fold 8 Ultra. Stay up to date with all the details as we cover every device Samsung announced today. </p><h2 class="article-body__section" id="section-samsung-galaxy-unpacked-2026-biggest-announcements"><span>Samsung Galaxy Unpacked 2026: Biggest announcements</span></h2><p>Samsung’s foldable phones and wearables have been the cornerstone of its summer Unpacked events, so it's no surprise it's no different this time. Here’s everything announced at Samsung Galaxy Unpacked 2026.</p><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review"><strong>Galaxy Z Fold 8:</strong></a> This is the “wide” version, featuring a passport-esque shape when closed that opens to reveal a main display with a slightly more rectangular ratio.</li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review"><strong>Galaxy Z Fold 8 Ultra:</strong></a> While the Ultra moniker implies it’s the top-of-the-line foldable, it’s actually the direct successor to last year's Galaxy Z Fold 7, complete with a thin design, triple cameras, and silicon carbon battery.</li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review"><strong>Galaxy Z Flip 8:</strong></a> Aesthetically, the Z Flip 8 looks a lot like its predecessor, but there's a reductions in thickness, weight, and bezel size.</li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-9-and-ultra-2-rumors-everything-weve-heard-so-far"><strong>Galaxy Watch 9:</strong></a><strong> </strong>This year’s updated wearable retain the squarish-circle case design, but packing a new Snapdragon Wear Elite chipset for faster on-device AI processing and improved battery efficiency.</li><li><a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review"><strong>Galaxy Watch Ultra 2:</strong></a> Samsung’s rugged flagship wearable is gets a brighter display that reaches up to 4,000 nits, the power-efficient Snapdragon Wear Elite chip and even more AI.</li><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-hands-on-with-the-new-samsung-smart-glasses-heres-why-id-pick-them-over-meta"><strong>Samsung Galaxy Glasses:</strong></a> Built on the Android XR platform with deep Gemini AI integration, Samsung's upcoming smart glasses are shaping up to be one of Unpacked's most intriguing teasers.</li></ul><h3 class="article-body__section" id="section-samsung-galaxy-unpacked-2026-live-updates"><span>Samsung Galaxy Unpacked 2026: Live Updates</span></h3><h2 id="the-countdown-to-unpacked-has-begun">The countdown to Unpacked has begun</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:894px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="u89fzKqJkr9AkbkGQU8uCF" name="Galaxy1.png" alt="samsung galaxy unpacked" src="https://cdn.mos.cms.futurecdn.net/u89fzKqJkr9AkbkGQU8uCF.png" mos="" align="middle" fullscreen="" width="894" height="503" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>We're mere hours away from the start of Galaxy Unpacked, and if history tells us anything, this is prime time for a bunch of last minute rumors and leaks to make their way online. So those of you that are too impatient to wait until 9 a.m. ET / 2 p.m. BST should keep an eye on your feeds for those 11th hour reveals.</p><p>That said, Tom's Guide will be at Unpacked bringing you live coverage of everything Samsung reveals on stage. So be sure to check back here to hear the biggest news and reveals as they happen.</p><h2 id="things-are-changing-this-year">Things are changing this year</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6kLR5TcVmSPDqEd7kcDncQ" name="Samsung Galaxy Z Fold 8 leaked render" alt="Samsung Galaxy Z Fold 8 leaked render" src="https://cdn.mos.cms.futurecdn.net/6kLR5TcVmSPDqEd7kcDncQ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android Headlines)</span></figcaption></figure><p>The Summer Unpacked event usually features two new foldable phones: A book-style Z Fold and the compact Z Flip. Things are a little different this year, because Samsung is expected to reveal three new Galaxy foldables at today's event.</p><p>This year marks the debut of a new foldable design, which is shorter and wider than previous Z Fold devices. While this was originally referred to as the Galaxy Z Fold Wide, leaks suggest that the new phone <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-could-get-a-name-change-and-i-think-the-iphone-fold-may-be-the-reason-why">will actually bear the name Galaxy Z Fold 8</a>. Meanwhile what we thought was the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-everything-you-need-to-know-about-the-new-wider-foldable">Galaxy  Z Fold 8</a>, is now supposedly called <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-last-minute-rumors-release-date-price-specs-and-all-the-biggest-upgrades">the Galaxy Z Fold 8 Ultra</a> — bringing Samsung's naming conventions a little more in line with the fold-free Galaxy S series.</p><p>As for the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-everything-we-know-so-far"> Galaxy Z Flip 8</a>, that's expected to arrive as normal with no real surprises. </p><h2 id="this-could-be-the-end-of-the-samsung-flip-foldable">This could be the end of the Samsung flip-foldable</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="H3Esn2X3KfwiSxkyWnTCEB" name="Samsung-Galaxy-Z-Flip-7" alt="In-hand image of the Samsung Galaxy Z Flip 7 with garden in the background" src="https://cdn.mos.cms.futurecdn.net/H3Esn2X3KfwiSxkyWnTCEB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Z Flip 8 has been leaked to death, so we know that it's going to be unveiled at Unpacked as expected, but that might be the end for Samsung's foldable flip phones. The prominent Samsung rumor-mongers believe that <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-tipster-says-galaxy-z-flip-9-could-be-cancelled-heres-why-thats-a-terrible-idea">we won't actually see a Z Flip 9 next year</a>. Apparently it could be down to rising costs, lack of interest in the Z Flip line-up and the fact that Samsung has let flip phone design stagnate for the past several years.</p><p>But how do they know? While there's never any guarantee, the leakers have noted the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-could-be-samsungs-last-flip-phone-heres-what-we-know">suspicious lack of chatter</a> related to the 2027 Z Flip. Since phone production begins over a year before release, the apparent lack of progress suggests that Samsung isn't bothering to make one.</p><h2 id="it-s-not-just-about-phones">It's not just about phones</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="muNV9cRT2ECxzVrL69d4Ho" name="Galaxy Watch Ultra metrica.jpg" alt="Galaxy Watch Ultra on a person's wrist showing exercise metrics, including duration, distance, steps and heart rate" src="https://cdn.mos.cms.futurecdn.net/muNV9cRT2ECxzVrL69d4Ho.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 new Galaxy foldables might be getting a lot of attention, there's more coming to Unpacked than just new smartphones. Samsung is also expected to unveil two new smartwatches: The <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-9-and-ultra-2-rumors-everything-weve-heard-so-far">Galaxy Watch 9</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-rumors-heres-everything-we-expect-from-samsungs-next-gen-rugged-smartwatch">Galaxy Watch Ultra 2</a>.</p><p>There's a lot we don't actually know about these devices, but we should expect the usual slew of upgrades at the very least. That means better screens, longer battery life and more powerful hardware — plus a bunch of extra health and fitness features.</p><p>On top of that we're expecting to hear more about the Galaxy Glasses, which were first announced at Google I/O bearing the name "<a href="https://www.tomsguide.com/computing/smart-glasses/i-tested-googles-intelligent-eyewear-and-found-the-smart-glasses-that-will-defeat-ray-ban-meta">Intelligent Eyewear</a>."</p><h2 id="is-a-new-samsung-tracker-coming">Is a new Samsung tracker 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="ECT3cGcGiLbLQyn52JQush" name="Samsung SmartTag 2-LIST.jpg" alt="samsung Galaxy SmartTag 2 chained to a carabiner" src="https://cdn.mos.cms.futurecdn.net/ECT3cGcGiLbLQyn52JQush.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: Future)</span></figcaption></figure><p>One rumor that's popped up in recent weeks claims that Samsung is gearing up to release a brand new SmartTag at some point later this year. We probably shouldn't expect to see the the Bluetooth tracker at Unpacked though, since <a href="https://bsky.app/profile/did:plc:qicvhaddltmw5jeupfi73dqu/post/3mqbss2xnvk2i?ref_src=embed&ref_url=https%253A%252F%252F9to5google.com%252F2026%252F07%252F14%252Fsamsung-galaxy-smarttag-3-reportedly-coming-later-this-year%252F" target="_blank">Roland Quandt</a> believes that it will launch alongside the Samsung Galaxy S26 FE.</p><p>The lower-cost version of the S26 isn't likely to arrive until September at the earliest, which means we have a little bit of a wait.</p><p>There's no word on what to expect from the SmartTag 3, but considering the nature of the device there isn't a lot that Samsung can do. Adding Ultra Wideband connectivity and support for Google's FindHub should be top of Samsung's priorities, though. Otherwise there's little point in releasing a new one.</p><h2 id="some-real-competition-is-on-the-way">Some real competition is on the 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:1992px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="hxWF8JHH73hydhmk2vQ4mY" name="iPhone Fold" alt="A render of the potential upcoming iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/hxWF8JHH73hydhmk2vQ4mY.jpg" mos="" align="middle" fullscreen="" width="1992" height="1121" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The feeling we're getting ahead of Unpacked is that Samsung is putting a lot of effort into this particular launch event. The last couple of weeks have seen Samsung confirm a bunch of key details about the phones, including the all-important <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex titanium</a> display upgrade.</p><p>It shouldn't be a huge surprise, though. Despite some competition from the likes of Motorola and Google in recent years, Samsung has absolutely dominated the foldable phone market. But that might change with the release of the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a> later this year. </p><p>iPhones are popular and sell in incredible numbers every year, and taking even a fraction of that success into the foldable business should be enough to make Samsung nervous. Especially since Apple is reportedly <a href="https://www.tomsguide.com/phones/iphones/apple-expects-10-million-people-to-buy-a-usd2-500-iphone-ultra-and-its-a-huge-gamble">producing up to 10 million iPhone Ultras</a> — compared to the<a href="https://www.tomsguide.com/phones/samsung-phones/massive-samsung-leak-reveals-official-galaxy-z-fold-8-fold-8-ultra-and-flip-8-images-ahead-of-unpacked"> 6.3 million Z Fold and Z Flip units</a> reportedly being produced by Samsung.</p><h2 id="be-warned-samsung-might-hike-prices-again">Be warned, Samsung might hike prices again</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:3939px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Mf2BxjHNS5hd7MJ7AYiEHS" name="Galaxy Fold 7-LIST4" alt="Samsung Galaxy Z Fold 7 shown in hand" src="https://cdn.mos.cms.futurecdn.net/Mf2BxjHNS5hd7MJ7AYiEHS.jpg" mos="" align="middle" fullscreen="" width="3939" height="2216" 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>Samsung has a habit of raising foldable phone prices very frequently, and the Galaxy Z Fold 8 could be about to suffer the same fate <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-could-get-another-usd100-price-hike-this-year-for-the-third-time-in-a-row">with a $100 price hike</a>. For those keeping count, this would be the third year in a row Samsung has increased Z Fold prices in this manner. Which is not ideal for our bank accounts.</p><p>According to the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-could-get-another-usd100-price-hike-this-year-for-the-third-time-in-a-row">report from SE Daily</a>, the Galaxy Z Fold 8 Ultra could start at $2,099, with prices rising if you want more than 256GB of storage. As for the wider Galaxy Z Fold 8, those prices are reportedly starting at $1,899, which is the same price as the Galaxy Z Fold 6 at launch.</p><p>There's no word on how much the Z Flip 8 might cost in the U.S., but leaked European pricing <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-and-galaxy-watch-9-may-suffer-some-serious-price-increases-heres-what-we-know">suggests a €100 price hike as well</a>. If that translates to U.S. dollars, it means the flip phone could also see a $100 price hike. Or, in other words, a starting price of $1,199. </p><h2 id="flex-titanium-is-confirmed-here-s-why-it-matters">Flex titanium is confirmed — here's why it matters</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="zML8QkZbJj7gv5eES4uWCm" name="z fold 8 feature" alt="Galaxy Z Fold 7 next to Samsung Flex Titanium Display for Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/zML8QkZbJj7gv5eES4uWCm.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/Samsung)</span></figcaption></figure><p>Samsung has already revealed that the Z Fold 8 will feature a new display type, featuring what it calls "<a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">flex titanium.</a>" This means the display features a titanium plate and a flexible layer of titanium alloy. The benefits of this are improved strength, a thinner design and the elimination of the air gap beneath the display.</p><p>This means that Samsung has reduced the crease even further than previous attempts, with some rumors suggesting that Samsung may have eliminated it completely. That should offer a more immersive and uninterrupted viewing experience on the foldable display, while also directly competing with the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-creaseless-display-could-make-it-a-day-1-purchase-theres-just-one-problem">rumored crease-free display on the iPhone Ultra.</a></p><h2 id="galaxy-z-fold-8-lightest-foldable-ever">Galaxy Z Fold 8: Lightest Foldable Ever?</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:1154px;"><p class="vanilla-image-block" style="padding-top:67.50%;"><img id="JZvukygzXbtTGv2vkTPcj5" name="Galaxy-Z-Wide-Fold8-5K1-1154x779" alt="Leaked renders of the Samsung Galaxy Z Fold 8 Wide" src="https://cdn.mos.cms.futurecdn.net/JZvukygzXbtTGv2vkTPcj5.jpg" mos="" align="middle" fullscreen="" width="1154" height="779" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android Headlines / OnLeaks)</span></figcaption></figure><p>Those of you that can't stand the bulk and weight of flagship phones might want to pay attention to the Galaxy Z Fold 8. The new phone is <a href="https://9to5google.com/2026/06/02/samsung-galaxy-z-fold-8-weight-spec-leaks/" target="_blank">tipped to weigh just 201 grams (7.09 ounces)</a>, which would make it the lightest book-style foldable to be released. For comparison the Galaxy Z Fold 7 weighs 215 grams, while Huawei's wide-design foldable, the Pura X Max, weighs 229 grams (8.08 ounces).</p><p>Meanwhile the iPhone 18 Pro Max is <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-tipped-to-be-heaviest-iphone-ever-heres-3-reasons-why-thats-a-good-thing">expected to weigh 240 grams (8.46 ounces)</a> when it arrives later this year, and that only features a single screen. In other words, if you're looking for light and sleek, the new passport-style Z Fold 8 might be the phone for you.</p><h2 id="what-about-the-s-pen">What about the S Pen?</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="usUJR6bcnMymN3QBB3MfJg" name="Galaxy Z Fold 5 and S Pen-2.jpg" alt="Galaxy Z Fold 5 with S Pen" src="https://cdn.mos.cms.futurecdn.net/usUJR6bcnMymN3QBB3MfJg.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 question many long-time Z Fold fans might be asking this year is whether the S Pen will be making a comeback. Samsung removed the stylus-powering digitizer layer from the Z Fold 7's display to reduce the thickness, much to the chagrin of users.</p><p>While there have been rumors that Samsung is <a href="https://www.tomsguide.com/phones/galaxy-z-fold-7-ditched-the-s-pen-but-samsungs-working-on-a-new-version-for-future-foldables">developing a stylus that doesn't require the digitizer layer</a>, there's been no word on whether that new technology might debut on the Z Fold 8. In fact, all the<a href="https://www.tomsguide.com/phones/samsung-phones/every-samsung-device-from-this-months-unpacked-just-leaked-heres-your-full-look-at-the-entire-lineup"> leaked renders and accessories</a> we've seen have been remarkably devoid of the stylus.</p><p>So, in other words, I wouldn't get your hopes up.</p><h2 id="i-like-big-batteries-and-i-can-not-lie">I like big batteries, and I can not lie</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:496px;"><p class="vanilla-image-block" style="padding-top:85.48%;"><img id="nTxkcexEBv7hyGQngusHmQ" name="Screenshot 2026-07-20 105352" alt="samsung foldable 2026 leaked marketing materials" src="https://cdn.mos.cms.futurecdn.net/nTxkcexEBv7hyGQngusHmQ.png" mos="" align="middle" fullscreen="" width="496" height="424" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass)</span></figcaption></figure><p>One of the most important things in any smartphone is a long-lasting battery. It's something that Samsung's non-folding phones have made big improvements upon, but the foldable options haven't been so lucky. Fortunately that might be about to change.</p><p>Word is that the Z Fold 8 Ultra will pack in a 5,000 mAh battery, the same size as the Galaxy S26 Ultra, which recent marketing rumors claim can handle <a href="https://www.tomsguide.com/phones/samsung-phones/massive-samsung-leak-reveals-official-galaxy-z-fold-8-fold-8-ultra-and-flip-8-images-ahead-of-unpacked">27 hours of video playback</a>. Meanwhile, the Z Fold 8 is supposed to be coming with<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-tipped-for-a-major-charging-upgrade-iphone-fold-should-take-notes"> a 4,800 mAh battery </a>and an estimated 26 hours of video playback. That's quite a big leap from the 4,400 mAh batteries in the Z Fold 7 and Z Fold 6.</p><p>We're not entirely sure how long the Galaxy Z Flip 8 will last on a single charge, but prepare to be a little disappointed. Leaked marketing materials claim that it will have the <a href="https://www.tomsguide.com/phones/samsung-phones/massive-samsung-leak-reveals-official-galaxy-z-fold-8-fold-8-ultra-and-flip-8-images-ahead-of-unpacked">same 4,300 mAh-sized battery</a> as the Galaxy Z Flip 7.</p><h2 id="better-cameras-but-no-major-leaps-forward">Better cameras, but no major leaps forward</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1726px;"><p class="vanilla-image-block" style="padding-top:45.77%;"><img id="G2ARpHcivk6o5rJkyKsViQ" name="Screenshot 2026-07-15 104600" alt="samsung galaxy z fold 8, z flip 8 & fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/G2ARpHcivk6o5rJkyKsViQ.png" mos="" align="middle" fullscreen="" width="1726" height="790" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Android Headline)</span></figcaption></figure><p>The Galaxy Z Fold 7 made headlines by including the 200MP main camera, finally bringing the foldables more in line with phones like Galaxy S25 Ultra. The Z Fold 8 series isn't expected to do anything quite so severe, but we should still see some notable upgrades. </p><p>Both the Z Fold 8 and Z Fold 8 Ultra are tipped to<a href="https://www.galaxyclub.nl/samsung/galaxy-z-fold-8/" target="_blank"> feature a 50MP ultrawide angle camera lens</a>, though only the Ultra model will feature the 200MP main lens. The regular 8, which only has a pair of rear cameras, will <a href="https://www.tomsguide.com/phones/samsung-phones/massive-samsung-leak-reveals-official-galaxy-z-fold-8-fold-8-ultra-and-flip-8-images-ahead-of-unpacked">instead have a 50MP main shooter.</a> </p><p>We've no idea what kind of cameras will be on the Z Flip 8, but given Samsung's past unwillingness to boost resolution it's safe to assume that it will come with a 50MP main camera and 12MP ultrawide.</p><h2 id="we-re-on-the-ground-at-unpacked">We're on the ground at Unpacked!</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/EeCRt7CEfJKCaqKHekcQj.jpg" alt="Mark at Unpacked" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9RrPBDA5NhMQokZPGCEPu.jpg" alt="Mark at Unpacked" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Vm7K6Y9HMPuKgq4jwE9s4o.jpg" alt="Mark at Unpacked" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Galaxy Unpacked doesn't kick off for another couple of hours, but we're already pretty eager to get ready to hear what Samsung has to reveal. Tom's Guide Global Editor in Chief Mark Spoonauer is already on site, eagerly waiting for the event to begin. We're not even sure what time the doors open, so he may have a bit of a wait.</p><p>Me? I've only just left Reading, and just had to run across the train station to avoid missing my connection. So I'm not even halfway there. </p><p>Kudos for your punctuality, Mark. Galaxy Unpacked kicks off at 2 p.m. London time, which is 9 a.m. Eastern and 6 a.m. Pacific. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@mspoonyg/video/7665303133937061134" data-video-id="7665303133937061134" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@mspoonyg" href="https://www.tiktok.com/@mspoonyg">@mspoonyg</a>                            <p></p><a target="_blank" title="♬ original sound - CT Resin Studio" href="https://www.tiktok.com/music/original-sound-7648463848512539405">♬ original sound - CT Resin Studio</a></section>                    </blockquote></div>                <h2 id="how-to-train-your-snap-dragon">How to train your (Snap)dragon</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="Z6KnUFpjAqKymxFpvFa7b4" name="Qualcomm Snapdragon 8 Elite" alt="Qualcomm Snapdragon 8 Elite held in hand" src="https://cdn.mos.cms.futurecdn.net/Z6KnUFpjAqKymxFpvFa7b4.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>Another big change we know is coming to the Galaxy Z Fold 8 is the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-just-confirmed-the-most-obvious-galaxy-z-fold-8-upgrade-but-im-still-surprised"> inclusion of the Snapdragon 8 Elite Gen 5  for Galaxy chipset</a> — the same chip that can be found in the Galaxy S26 Ultra. This is important, because it's the first time Samsung has utilized this custom chip inside a foldable phone. In the past, the Z Fold and Z Flip devices were instead stuck with the standard, off-the-shelf Qualcomm chips.<br><br>The main benefit here is that the For Galaxy chips offer more power than their mainstream counterparts, which means a massive boost to raw performance. So if you're into gaming, video editing or other resource-hungry activities, this is the chip you want. Plus, because the chips have been custom-made for Galaxy phones, they are more efficient due to improved optimization.<br><br>Obviously, we don't know how much of an impact this will have compared to Z Fold 7 performance, but it should prove to be major win for Galaxy foldables going forward.</p><h2 id="conditions-in-london-are-warm-today">Conditions in London are warm today</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="Uio4aNEMUSzR7a8f9VP89j" name="IMG_2648" alt="Samsung Unpacked July launch event" src="https://cdn.mos.cms.futurecdn.net/Uio4aNEMUSzR7a8f9VP89j.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>As we wait for the day's events to get started, Samsung has been busy handing out umbrellas. It's not because of the famous British rain, but actually because it's a warm day for the U.K. capital.</p><p>Temperatures are set to hit 25°C / 77<strong>°</strong>F with little cloud cover and nobody wants to get sunstroke while they're waiting for the venue doors to open. </p><h2 id="samsung-reportedly-betting-big-on-a-redesigned-z-fold-8">Samsung reportedly betting big on a redesigned Z Fold 8</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:3612px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="S8t5mMarRVseLsXE7SEnw3" name="Galaxy Z Fold 7 vs Galaxy Z Fold 6" alt="Galaxy Z Fold 7 and Galaxy Z Fold 6 shown on a stone wall" src="https://cdn.mos.cms.futurecdn.net/S8t5mMarRVseLsXE7SEnw3.jpg" mos="" align="middle" fullscreen="" width="3612" height="2032" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We don't know how the world will react to Samsung's big design change to the Fold 8 but the company itself seems confident in demand for the wider model.</p><p>According to reports from industry sources (and collaborated by leaker Ice Universe), Samsung has set a production target of 2.8 million Galaxy Z Fold 8 devices. That's compared to two million units of the Z Fold 8 Ultra and 1.5 million units of the Z Flip 8.</p><p>These is apparently a big pivot from earlier projections that had the Z Fold 8 and Z Fold 8 Ultra at roughly the same production level.</p><h2 id="will-it-be-truly-crease-free">Will it be truly 'crease-free'?</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="5P6fyW2FdH3HGodAqZAAHk" name="Samsung-Galaxy-Z-Fold-7-1" alt="A semi-folded Samsung Galaxy Z Fold 7 displayed on a counter" src="https://cdn.mos.cms.futurecdn.net/5P6fyW2FdH3HGodAqZAAHk.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the biggest questions we all want answered is how much crease is going to be visible on Samsung's new foldables? We know all about the "<a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">flex titanium</a>" display at this point, but how it looks IRL will be the clincher.</p><p>Rumors have suggested Samsung has been able to eliminate the crease completely from this year's foldables. With strong competition from Oppo's Find N6 and the specter of Apple's iPhone Fold appearing in September, Samsung better have brought its A-game. </p><p>Meanwhile, check out this video of Tom's Guide's Mark Spoonauer in Korea to get a look inside Samsung's display developments.</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/QhSHTJId_Io" allowfullscreen></iframe></div></div><h2 id="we-re-in-line-and-getting-ready-to-head-inside">We're in line and getting ready to head inside!</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="2eBNZtviMscbYKpDNbe87" name="IMG_2654" alt="Influencer line at Samsung Unpacked" src="https://cdn.mos.cms.futurecdn.net/2eBNZtviMscbYKpDNbe87.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: Tom's Guide)</span></figcaption></figure><p>We're about ready to head inside for today's event. The line has formed and there's plenty of excitement over what Samsung has in store. Alongside the standard line, there's a separate queue just for the influencers (pictured above).</p><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">Live look outside Samsung Galaxy Unpacked in London. Heading in soon to see Galaxy Z Fold 8… #samsung #galaxyunpacked pic.twitter.com/64fvGhJl8i<a href="https://twitter.com/cantworkitout/status/2079897181088014368">July 22, 2026</a></p></blockquote><div class="see-more__filter"></div></div><h2 id="we-re-through-the-door">We're through the door!</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="EGzKdeHd43sXZoA5yYRuEF" name="IMG_2664" alt="Samsung Unpacked July 2026" src="https://cdn.mos.cms.futurecdn.net/EGzKdeHd43sXZoA5yYRuEF.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: Tom's Guide)</span></figcaption></figure><p>Samsung has opened the doors for today's Unpacked event and we're both inside AND in the front row. To recap, we're a little under an hour from the keynote getting underway. The event officially kicks off at 2 p.m. BST / 9 a.m. ET / 6 a.m. PT here in London.</p><p>With word that we'll see the new Galaxy Z Fold 8, Z Fold 8 Ultra and a couple of new Galaxy Watches, there's a lot to look forward to today.</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:1737px;"><p class="vanilla-image-block" style="padding-top:177.78%;"><img id="kwfiKUzGqhTfNYPpgCyWWa" name="IMG_2659" alt="Samsung Unpacked event" src="https://cdn.mos.cms.futurecdn.net/kwfiKUzGqhTfNYPpgCyWWa.jpg" mos="" align="middle" fullscreen="" width="1737" height="3088" 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><h2 id="will-samsung-s-galaxy-glasses-make-an-appearance">Will Samsung's Galaxy Glasses make an appearance?</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:1154px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="5Ns6d26SPZharFFUjYNL2n" name="Exclusive-Samsung-Galaxy-Glasses-AH-2-1154x649" alt="Leaked render of Samsung Galaxy Glasses" src="https://cdn.mos.cms.futurecdn.net/5Ns6d26SPZharFFUjYNL2n.jpg" mos="" align="middle" fullscreen="" width="1154" height="649" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OnLeaks / Android Headlines)</span></figcaption></figure><p>Samsung has already confirmed it plans to launch a pair of smart glasses at some point in 2026 and back in April we got some <a href="https://www.tomsguide.com/computing/smart-glasses/samsung-galaxy-glasses-renders-just-leaked-heres-what-they-look-like">leaked renders of a potential design</a>. The renders were made by <a href="https://x.com/OnLeaks/status/2048756062468161548" target="_blank">OnLeaks , </a>who teamed up with Android Headlines to design them based on "real life pictures of a testing stage unit."</p><p>We know that today's event is going to focus on the phones and the wearables, but an official reveal of the "Galaxy Glasses" today would just be the sprinkles on the sundae.</p><h2 id="say-hello-to-the-new-galaxy-z-fold-8">Say hello to the new Galaxy Z Fold 8!</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:3499px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="9s5WNKYMv2wNE5FNQFSTTX" name="Galaxy Z Fold 8-LIST1" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/9s5WNKYMv2wNE5FNQFSTTX.jpg" mos="" align="middle" fullscreen="" width="3499" height="1968" 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>Even though Samsung's event just started, we already got a hands-on look at the long awaited <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a>, which features a wider aspect ration when opened and a passport-like shape when closed. It's a totally different looking and feeling tablet from what Samsung has released and it's so refreshing.</p><h2 id="samsung-smart-glasses-take-center-stage">Samsung smart glasses take center stage</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="fvJgiYFJ9QyXYTGjFqoFp7" name="Galaxy Unpacked July 2026_ Official Livestream 1-4-52 screenshot" alt="AI glasses at Summer Samsung Galaxy Unpacked 2026" src="https://cdn.mos.cms.futurecdn.net/fvJgiYFJ9QyXYTGjFqoFp7.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Before getting into its new foldable phones, Samsung teases its new <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-hands-on-with-the-new-samsung-smart-glasses-heres-why-id-pick-them-over-meta">smart glasses</a>, which are designed in collaboration with <a href="https://www.tomsguide.com/tag/google">Google</a>, Warby Parker and Gentle Monster. According to James Choi, who heads Samsung's XR R&D, the company subjected these glasses to drop tests, water tests, high temperatures and sweat. It's meant to handle a lot of wear and tear, but it's how Gemini AI takes center stage where it truly stands out.</p><h2 id="samsung-galaxy-z-flip-8-it-s-a-much-thinner-and-design">Samsung Galaxy Z Flip 8: it's a much thinner and design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jdgj4DaDXyxg8nWLBrN5fZ" name="Samsung Galaxy Z Flip 8 hands-on" alt="Samsung Galaxy Z Flip 8 hands-on." src="https://cdn.mos.cms.futurecdn.net/jdgj4DaDXyxg8nWLBrN5fZ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>We already got out hands-on look at the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a> and while it looks aesthetically the same as before, it's thinner and lighter than before. There's still a dual camera setup on the back with the same identical specs as before, but there are a couple of new Flipsuit cases that make it more personalized than ever before.</p><h2 id="flex-titanium-adds-more-durability-to-galaxy-z-fold-8-ultra">Flex titanium adds more durability to Galaxy Z Fold 8 Ultra</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="DeK4d4AyyzwhR5ezy76oLh" name="Galaxy Unpacked July 2026_ Official Livestream 1-10-6 screenshot" alt="Galaxy Z Fold 8 at Summer Samsung Galaxy Unpacked 2026" src="https://cdn.mos.cms.futurecdn.net/DeK4d4AyyzwhR5ezy76oLh.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Samsung wastes no time to talk about its top-of-the-line foldable: the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a>. What sets this one apart is the new Flex Titanium and Armor FlexHinge that allows it to be more durable and have a crease-less display. If that's not enough, this thin and light foldable is packing a new 5,000 mAh silicon-carbon battery without introducing any additional thickness or weight.</p><h2 id="galaxy-z-fold-8-vs-galaxy-z-fold-8-ultra-what-s-the-difference">Galaxy Z Fold 8 vs Galaxy Z Fold 8 Ultra: What's the difference?</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/oFT-YOrakEg" allowfullscreen></iframe></div></div><p>Besides the obvious physical differences, we break down everything that's different between the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a>. From the cameras, Galaxy AI features, and battery capacities, there's actually a fair amount of unique characteristics about each one.</p><h2 id="watching-videos-is-way-better-with-the-galaxy-z-fold-8">Watching videos is way better with the Galaxy Z Fold 8</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:2936px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="wu79gVE3Bzue9Efqdk47fW" name="Galaxy Z Fold 8-39" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/wu79gVE3Bzue9Efqdk47fW.jpg" mos="" align="middle" fullscreen="" width="2936" height="1651" 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 immediate things that caught our attention with the Galaxy Z Fold 8 is its "wider" aspect ratio when it's opened. The new <a href="https://www.tomsguide.com/entertainment/movies/avengers-doomsday-first-trailer-with-steve-rogers-is-here-and-it-comes-with-a-surprising-twist">Avengers Doomsday</a> and <a href="https://www.tomsguide.com/news/live/spider-man-brand-new-day-trailer-live">Spider-Man: Brand New Day</a> trailers looks way better on it than the Z Fold 8 Ultra, mainly because there's less dead space around the video.</p><h2 id="a-great-screen-is-only-part-of-the-experience">'A great screen is only part of the experience'</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="wNtJGFRChAa2yF3jMEqofG" name="Galaxy Unpacked July 2026_ Official Livestream 1-27-8 screenshot" alt="Galaxy Z Fold 8 gaming" src="https://cdn.mos.cms.futurecdn.net/wNtJGFRChAa2yF3jMEqofG.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>While the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8's</a> unique shape is getting all the buzz, you can't forget about all the other unique qualities about this new foldable. For starters, it's super thin and light, with a 4,800 mAh battery, and more.</p><h2 id="galaxy-z-fold-8-is-priced-at-1-899-is-it-just-right">Galaxy Z Fold 8 is priced at $1,899: Is it just right?</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:3500px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ic937BdgqQSEM7V9XYxjGX" name="Galaxy Z Fold 8-13" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/ic937BdgqQSEM7V9XYxjGX.jpg" mos="" align="middle" fullscreen="" width="3500" height="1969" 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>Samsung just revealed the price of the "wide" <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a>. With a starting price of $1,899, it's less than the previous Galaxy Z Fold 7. While it does have a new look, do you think it's worth the value considering how it has two cameras instead of three?</p><h2 id="flexwindow-gets-a-big-upgrade-with-the-galaxy-z-flip-8">FlexWindow gets a big upgrade with the Galaxy Z Flip 8</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="HxbVBZ3u3B2DsaauqWCF3G" name="Galaxy Unpacked July 2026_ Official Livestream 1-34-2 screenshot" alt="Galaxy Z Flip 8" src="https://cdn.mos.cms.futurecdn.net/HxbVBZ3u3B2DsaauqWCF3G.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Before talking about the hardware, Samsung spends time talking about the FlexWindow with the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a>. Even though the design looks practically the same, One UI 9 gives the FlexWindow some new tricks, access to more AI features, and a revised interface that's easier to use.</p><h2 id="galaxy-z-flip-8-gets-a-hefty-1-199-price-tag">Galaxy Z Flip 8 gets a hefty $1,199 price tag</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="Ccm2J5Yxsv9EfHDK7sX3dZ" name="Samsung Galaxy Z Flip 8 hands-on" alt="Samsung Galaxy Z Flip 8 hands-on." src="https://cdn.mos.cms.futurecdn.net/Ccm2J5Yxsv9EfHDK7sX3dZ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Ouch! The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a> now costs $100 than before, making it $1,199. That puts it in flagship phone territory, like the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>. Would you pay this much for a flip phone with one less camera lens and a smaller battery?</p><h2 id="ned-craves-the-multitasking-of-the-galaxy-z-fold-8-ultra">Ned craves the multitasking of the Galaxy Z fold 8 Ultra</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="B9ZsnXSDjn2H2QHVwTYMUH" name="Galaxy Unpacked July 2026_ Official Livestream 1-40-21 screenshot" alt="Ned using a Samsung foldable at Summer Samsung Galaxy Unpacked 2026" src="https://cdn.mos.cms.futurecdn.net/B9ZsnXSDjn2H2QHVwTYMUH.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Jacob Batalon takes stage at Galaxy Unpacked to talk about the upcoming film, <a href="https://www.tomsguide.com/news/live/spider-man-brand-new-day-trailer-live">Spider-Man: Brand New Day </a>, but he dials into the multitasking aspect of the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a>. However, we think that the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Z Fold 8</a> is better suited for it because it gains the three apps side-by-side multitasking like on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-trifold-review">Galaxy Z TriFold</a>.</p><h2 id="samsung-galaxy-card-beats-apple-card-with-its-rewards">Samsung Galaxy Card beats Apple Card with its rewards</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:6097px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="h6axTuH2RFxbuCTbWi8Swg" name="Samsung Galaxy Card" alt="Samsung Galaxy Card." src="https://cdn.mos.cms.futurecdn.net/h6axTuH2RFxbuCTbWi8Swg.jpg" mos="" align="middle" fullscreen="" width="6097" height="3430" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-card-takes-aim-at-apple-card-with-way-more-perks-and-rewards-heres-what-you-get">Samsung Galaxy Card</a> takes aim at the Apple Card, with generous rewards that give you cash back on your purchases. Issued by BarClays, this Visa Card will give you a fair amount back when you purchase Samsung products directly from the company, including its new foldables. Here's the breakdown of how it compares to the Apple Card.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Card</strong></p></td><td  ><p><strong>Apple Card</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Annual Fee</strong></p></td><td  ><p>$0</p></td><td  ><p>$0</p></td></tr><tr><td class="firstcol " ><p><strong>Issuer</strong></p></td><td  ><p>Barclays </p></td><td  ><p>Goldman Sachs</p></td></tr><tr><td class="firstcol " ><p><strong>Card Type</strong></p></td><td  ><p>Visa</p></td><td  ><p>Mastercard</p></td></tr><tr><td class="firstcol " ><p><strong>Direct Brand Purchases</strong></p></td><td  ><p>5% cash rewards</p></td><td  ><p>3% cash rewards</p></td></tr><tr><td class="firstcol " ><p><strong>Mobile Wallet Purchases</strong></p></td><td  ><p>3% via Samsung Wallet</p></td><td  ><p>2% via Apple Pay (3% at select merchants)</p></td></tr><tr><td class="firstcol " ><p><strong>Streaming Services</strong></p></td><td  ><p>2% cash rewards</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>All Other Purchases</strong></p></td><td  ><p>1% cash rewards</p></td><td  ><p>1% cash rewards</p></td></tr><tr><td class="firstcol " ><p><strong>Sign-Up Bonus</strong></p></td><td  ><p>$200 after $2,000 spent in first 90 days</p></td><td  ><p>$75 when you spend $75 within the first 30 days</p></td></tr></tbody></table></div><h2 id="galaxy-watch-9-gets-a-price-bump-but-has-deepener-fitness-metrics">Galaxy Watch 9 gets a price bump, but has deepener fitness metrics</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="QsGZPSox4ftakxUYEwLCPg" name="Galaxy Unpacked July 2026_ Official Livestream 1-52-25 screenshot" alt="Galaxy Watch 9" src="https://cdn.mos.cms.futurecdn.net/QsGZPSox4ftakxUYEwLCPg.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Samsung's newly announced <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">Galaxy Watch 9</a> carries over the exact exterior design and screen specs of its predecessor, while introducing a $30 price hike across the line to start at $379.</p><p>The hardware changes focus on refinements like a faster Snapdragon chipset and slightly larger batteries, though notably without a rotating-bezel Classic variant this generation. Instead, the update leans heavily into software and tracking, debut features like a unified Vitals dashboard, Cardio Load recovery insights, and more.</p><h2 id="galaxy-watch-ultra-2-is-the-most-rugged-smartwatch-samsung-has-released">Galaxy Watch Ultra 2 is the most rugged smartwatch Samsung 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:4043px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="epc4o6iQmt6rjHFos7nLnd" name="GalaxyWatchUltra2-Gemini" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/epc4o6iQmt6rjHFos7nLnd.jpg" mos="" align="middle" fullscreen="" width="4043" height="2275" 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>The <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Samsung Galaxy Watch Ultra 2</a> gets meaningful hardware upgrades that makes it more rugged than ever, boosting maximum screen brightness to an ultra-bright 5,000 nits, and adding official scuba diving support.</p><p>There's also a larger 800 mAh battery that pushes runtimes to roughly 60 hours per charge, while its software gains new multi-metric health features like the Vitals dashboard and Cardio Load tracking. There's a $50 price increase to $699.</p><h2 id="agentic-ai-on-the-galaxy-z-lineup-gets-expanded-gemini-task-automation">Agentic AI on the Galaxy Z lineup gets expanded Gemini Task automation</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:2955px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="MrDnXiJSzcsUQ9GoBW5XEX" name="Galaxy Z Fold 8-28" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/MrDnXiJSzcsUQ9GoBW5XEX.jpg" mos="" align="middle" fullscreen="" width="2955" height="1662" 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>If ordering Dunkin' Donuts with the Galaxy S26 was impressive when we tried it out earlier this year, Samsung's new foldables are getting deeper Agentic AI features, like how Gemini Intelligence brings end-to-end <a href="https://www.tomsguide.com/ai/samsung-just-added-automated-tasks-and-gemini-notebook-to-galaxy-z-fold-8-heres-what-these-ai-features-let-you-do">task automation supported by over 40 compatible apps</a>.</p><p>This will let users perform complex commands like ordering food, booking flights, or buying event tickets right from their screen or Flex Window.</p><h2 id="snapdragon-8-elite-gen-5-powers-samsung-s-new-foldables">Snapdragon 8 Elite Gen 5 powers Samsung's new foldables</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RDygz6hHCvnSAsnZPthtz" name="Galaxy Unpacked July 2026_ Official Livestream 2-15-19 screenshot" alt="Snapdragon Wear Elite on Galaxy Watch Ultra 2" src="https://cdn.mos.cms.futurecdn.net/RDygz6hHCvnSAsnZPthtz.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Not surprisingly, Samsung's new foldables are all powered by the Snapdragon 8 Elite Gen 5 for Galaxy SoC. We already know these will deliver greater performance gains, but it should also help improve their battery life. Combined with the new silicon-carbon battery that Samsung's using, it should give users extended time than ever before.</p><h2 id="samsung-partners-with-gentle-monster-and-warby-parker-for-its-smart-glasses">Samsung partners with Gentle Monster and Warby Parker for its smart glasses</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="AurYo4DsAnVdYBpj5EkB9H" name="Galaxy Unpacked July 2026_ Official Livestream 2-18-2 screenshot" alt="Intelligent Eyewear at Summer Samsung Galaxy Unpacked 2026" src="https://cdn.mos.cms.futurecdn.net/AurYo4DsAnVdYBpj5EkB9H.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>If you've want alternatives to Meta's lineup of smart glasses, Samsung has something compelling with its new smart glasses. They're designed in collaboration with Warby Parker and Gentle Monster.</p><p>Obviously, these are AI-centric glasses meant to give users a deeper level of interaction. It also works seamlessly with Samsung's ecosystem, like how navigating can also be done with a Galaxy Watch. You also get up to 9 hours of battery life with a single charge. The big unknown right now is price.</p><h2 id="samsung-smart-glasses-dorky-or-stylish">Samsung smart glasses: dorky or stylish?</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/RkQtGnSGbpyTmbf9oPafKH.jpg" alt="Galaxy Unpacked smart glasses." /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/c83B66sZbRwmrEhLcDAYLH.jpg" alt="Galaxy Unpacked smart glasses." /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ndWF7NgSn5PNs8ae32UQMH.jpg" alt="Galaxy Unpacked smart glasses." /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iie8toM9BPTkPsrtZPLvHH.jpg" alt="Galaxy Unpacked smart glasses." /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2SYn5Uw5Qqtzuen5PXBgFH.jpg" alt="Galaxy Unpacked smart glasses." /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>So, what do you think about the design of these new smart glasses from Samsung? Would you wear them all the time, or only when you need to use them? There are a couple of styles, including one that almost resembles the Wayfarer design of Ray-Ban.</p><h2 id="that-s-a-wrap-what-are-you-most-excited-about">That's a wrap! What are you most excited about?</h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYddRO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYddRO.js" async></script><p>And just like that, Galaxy Unpacked is over. Samsung clearly focused on its new foldables, but also spent time talking about its new smart glasses. Out of all the stuff it unveiled, which are you most excited for?</p><h2 id="galaxy-z-fold-8-ultra-is-the-top-of-the-line-foldable-but-is-it-worth-2-099">Galaxy Z Fold 8 Ultra is the top-of-the-line foldable, but is it worth $2,099?</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="L2gDUfPS57VcAQNvND5D5g" name="Galaxy Z Fold 8 Ultra-7" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/L2gDUfPS57VcAQNvND5D5g.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 <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> is here, and while it has that prestigious title of being the top-of-the-line model, its $2,099 price tag may be hard to swallow. While it continues Samsung's trend of delivering an ultra-thin design paired with a robust triple camera system, a few new AI tricks, and a new battery tech, does its $100 price hike make you reconsider buying it over perhaps the cheaper <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a>?</p><h2 id="galaxy-z-flip-8-quietly-gets-a-couple-of-new-flipsuit-cases">Galaxy Z Flip 8 quietly gets a couple of new Flipsuit cases</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="uBYejgYYqRCFtnQ9ebJNdC" name="Samsung Galaxy Z Flip 8 - Flipsuit.GIF" alt="Samsung Galaxy Z Flip 8 Flipsuit case." src="https://cdn.mos.cms.futurecdn.net/uBYejgYYqRCFtnQ9ebJNdC.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: Tom's Guide / John Velasco)</span></figcaption></figure><p>Samsung didn't show it off at its live event, but the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a> gets a couple of new Flipsuit cases that add a more personalized look to the new foldable. We got hands-on time on them and just as before, these covers are lined with LEDs that animate alongside the FlexWindow when they're opened.</p><h2 id="the-coolest-new-foldable-isn-t-the-ultra-or-flip">The coolest new foldable isn't the Ultra or Flip</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:2797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="jDQR6ZY2cx8T5NxgCddxW" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/jDQR6ZY2cx8T5NxgCddxW.jpg" mos="" align="middle" fullscreen="" width="2797" height="1573" 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>Now that you know everything about Samsung's new foldable lineup, it does beg the question about which one is the best? I got some hands-on time with all three models and there's no denying that the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 </a>gets my vote.</p><p>Yes, its wider aspect ratio when opened is certainly a refreshing take on the form factor, but it's the level of productivity you get from it that seals the deal for me. Multitasking is way more suitable on its canvas, with up to four apps running simultaneously.</p><h2 id="no-magnetic-charging-in-sight-but-a-case-can-do-it">No magnetic charging in sight, but a case can do it</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3310px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Dc7VGfBuWXAZW3kAuMRZm" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/Dc7VGfBuWXAZW3kAuMRZm.jpg" mos="" align="middle" fullscreen="" width="3310" height="1862" 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>By now, I've been clamouring for Samsung to give its phones MagSafe-like charging, but it appears we'll have to wait again. While the <a href="https://www.tomsguide.com/phones/google-pixel-phones/ive-been-using-the-pixel-10-pro-for-6-months-heres-what-i-love-and-hate">Pixel 10</a> lineup remains to be the only Android phones with support for magnetic Qi2 wireless charging, you'll need to buy a case to gain the same functionality with the new Galaxy Z lineup. It's a bummer because early leaks indicated that magnetic charging was perhaps a possibility.</p><h2 id="is-the-galaxy-z-flip-8-a-big-letdown-i-think-so">Is the Galaxy Z Flip 8 a big letdown? I think so</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="ep7rK5BneH2Zjon73aEybZ" name="Samsung Galaxy Z Flip 8 hands-on" alt="Samsung Galaxy Z Flip 8 hands-on." src="https://cdn.mos.cms.futurecdn.net/ep7rK5BneH2Zjon73aEybZ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>If you read my <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 hands-on review</a>, I drill right into why I think it's a letdown. From a specs standpoint, it's clearly the most inferior of the bunch, but that's not the reason.</p><p>It just feels like Samsung's abandoned the flip style completely, which is why it looks more or less the same. There are a few  notable changes, like its Snapdragon 8 Elite Gen 5 for Galaxy chip, thinner design, and lighter weight. However, the fact that the camera specs are identical to its predecessor and its design language remains unchanged, makes this model feel more like an iterative update than an revolutionary one like the Z Fold 8.</p><h2 id="galaxy-z-fold-8-vs-galaxy-z-fold-8-ultra-which-one-would-you-get">Galaxy Z Fold 8 vs. Galaxy Z Fold 8 Ultra: Which one would you get?</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:2830px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mMjRux8dbw7Li6FYhuiYCW" name="Galaxy Z Fold 8-31" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/mMjRux8dbw7Li6FYhuiYCW.jpg" mos="" align="middle" fullscreen="" width="2830" height="1592" 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>This is the matchup I've been mulling over for the past couple of days now after spending time with both phones. On one hand, the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Z Fold 8</a> gets my attention for its wider design and how it's more suitable for watching video, but the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Ultra</a> gets the triple camera system I crave more. What makes it even tougher is the $200 difference between the two.</p><h2 id="this-is-samsung-going-on-the-offensive">"This is Samsung going on the offensive"</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:2815px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="UE7vF2KkL5TSfkRQHCheS" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/UE7vF2KkL5TSfkRQHCheS.jpg" mos="" align="middle" fullscreen="" width="2815" height="1583" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We spoke with Francisco Jeronimo, an analyst at IDC who shared his thoughts on the Galaxy Z Fold 8. </p><p>"The new Galaxy Z Fold8, a new passport-style format, will allow Samsung to address different user needs, defending the more premium price point and reducing the risk that a single Fold design has to satisfy every potential buyer," Jeronimo said. This is Samsung going on the offensive."</p><p>He added that the wider foldable allows Samsung to define the market ahead of Apple's rumored reveal of its own foldable later this year.</p><p>"With Apple's announcement coming, this is the first Unpacked where Samsung has to defend the category it created, and that's why it cannot play it safe."</p><p>Though he noted that Samsung has to articulate how the Z Fold 8 is a "deliberately different product rather than an oddly proportioned replacement."</p><h2 id="first-look-at-the-galaxy-watch-ultra-2">First look at the Galaxy Watch Ultra 2</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/BghYgs2oGbY" allowfullscreen></iframe></div></div><p>As a reminder, Tom's Guide is on both YouTube and <a href="https://www.tiktok.com/@tomsguide" target="_blank">TikTok </a>where you can see all of Samsung's new devices in action.</p><p>As an example, take a look at the new Galaxy Watch Ultra 2 above as we unbox and compare it to the original. </p><h2 id="a-big-change-that-could-alter-your-next-smartphone">A big change that could alter your next smartphone</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="F5gpsuPVgm8BkfsN49Xfb3" name="Galaxy Unpacked July 2026_ Official Livestream 1-11-21 screenshot" alt="Galaxy Z Fold Ultra batteries" src="https://cdn.mos.cms.futurecdn.net/F5gpsuPVgm8BkfsN49Xfb3.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>For the first time,<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal"> Samsung is putting silicon-carbon-based batteries </a>in one of its smartphones. It means Samsung is replacing its traditional lithium-ion power packs in favor of a new type of battery.</p><p>Silicon-carbon batteries provide more capacity of lithium ion in the same size. With the race toward smaller and lighter devices, that distinction means a lot.</p><p>I'm curious now if Samsung's mainline S series phones will now get the new-ish battery technology.</p><h2 id="galaxy-ring-world-s-first-fda-cleared-smart-ring-for-sleep-apnea">Galaxy Ring world's first FDA-cleared smart ring for sleep apnea</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="tZoJWofH5Cqozmrju6RdD4" name="Samsung Galaxy Ring" alt="Samsung Galaxy Ring" src="https://cdn.mos.cms.futurecdn.net/tZoJWofH5Cqozmrju6RdD4.png" 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: Future)</span></figcaption></figure><p>In all the hullabaloo about Samsung's foldable phones, a<a href="https://www.tomsguide.com/wellness/smart-rings/the-samsung-galaxy-ring-is-about-to-be-the-worlds-first-fda-cleared-smart-ring-for-sleep-apnea"> major smart ring announcement</a> just came through. </p><p>The current Samsung Galaxy Ring may become the first FDA approved smart ring for tracking sleep apnea. </p><p>The new feature is supposed to be unlocked this fall.</p><h2 id="samsung-glasses-teased">Samsung Glasses teased</h2>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7665364542435724558" data-video-id="7665364542435724558" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ original sound - Tom’s Guide" href="https://www.tiktok.com/music/original-sound-7665364689564371726">♬ original sound - Tom’s Guide</a></section>                    </blockquote></div>                <p>Samsung has been dripfeeding news about its pending AI glasses and we got a little more information at Unpacked today.</p><p>We also got a little <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-hands-on-with-the-new-samsung-smart-glasses-heres-why-id-pick-them-over-meta">hands on time with the spectacles</a> and found them mighty impressive.</p><h2 id="don-t-forget-about-the-z-flip-8">Don't forget about the Z Flip 8</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="KxeBeeo9JdRXSTb8usxoZZ" name="Samsung Galaxy Z Flip 8 hands-on" alt="Samsung Galaxy Z Flip 8 hands-on." src="https://cdn.mos.cms.futurecdn.net/KxeBeeo9JdRXSTb8usxoZZ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>While the headlines are about the wider Z Fold 8 and the new Z Fold 8 Ultra, Samsung also announced the new version of the Z Flip 8. </p><p>We'll have a full review in the coming weeks, but we were able to get some <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">hands-on time with Samsung's new flip phone</a>. It's snappy, lighter, and solidly built. It is bogged down by a $100 price hike and a similar design.</p><h2 id="what-you-need-to-know-about-the-galaxy-watch-9">What you need to know about the Galaxy Watch 9</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:1744px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="e2tBcV5r7FAg2X2NPSNyYj" name="GalaxyWatch9-01" alt="Samsung Galaxy Watch 9 close-up" src="https://cdn.mos.cms.futurecdn.net/e2tBcV5r7FAg2X2NPSNyYj.jpg" mos="" align="middle" fullscreen="" width="1744" height="981" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>In all, the Samsung Galaxy Watch 9 is a minor upgrade over the Watch 8. However, it does have a ton of new health and fitness features and some upgrades.</p><p>We found <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9"><strong>5 things you need to know about the new Samsung Galaxy Watch 9</strong></a><strong>.</strong></p><h2 id="the-galaxy-watch-ultra-2-is-a-dive-computer-that-you-need-to-pay-for">The Galaxy Watch Ultra 2 is a dive computer that you need to pay for</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:4613px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="u4HGWUFwc8QuKbaWkCz6NZ" name="GalaxyUltra2-dive-02" alt="Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background" src="https://cdn.mos.cms.futurecdn.net/u4HGWUFwc8QuKbaWkCz6NZ.jpg" mos="" align="middle" fullscreen="" width="4613" height="2595" 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>The high-end Galaxy Watch Ultra 2 brings a lot to the table including <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-turned-the-galaxy-watch-ultra-2-into-a-fully-fledged-dive-computer-but-theres-a-catch">legit features for divers</a> or high-impact water sports. However, there is a catch.</p><p>Samsung and the popular Mares diving app have teamed up to turn the Ultra 2 into a strong dive computer. But you'll need to subscribe to the app for $8.99 a month or $69.99 a year.</p><h2 id="reviews-are-coming-but-in-the-meantime-check-out-our-first-impressions">Reviews are coming but in the meantime check out our first impressions</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="LkPU2SsNDbPKyu5eqffmDj" name="Galaxy Unpacked July 2026_ Official Livestream 2-21-52 screenshot" alt="Intelligent Eyewear is better as part of the Galaxy ecosystem" src="https://cdn.mos.cms.futurecdn.net/LkPU2SsNDbPKyu5eqffmDj.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>We've already started reviewing every device that Samsung announced at Unpacked today, but full reviews won't arrive for a minute. </p><p>In the meantime, we do have first impressions if you want some early thoughts.:</p><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review"><strong>Galaxy Z Fold 8</strong></a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review"><strong>Galaxy Z Fold 8 Ultra</strong></a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review"><strong>Galaxy Z Flip 8</strong></a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-9-and-ultra-2-rumors-everything-weve-heard-so-far"><strong>Galaxy Watch 9</strong></a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review"><strong>Galaxy Watch Ultra 2</strong></a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-hands-on-with-the-new-samsung-smart-glasses-heres-why-id-pick-them-over-meta"><strong>Samsung Galaxy Glasses</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'My Grandfather Charles Manson' online — stream the Sophia Maddox documentary from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/watch-my-grandfather-charles-manson</link>
                                                                            <description>
                            <![CDATA[ All the ways to watch "My Grandfather Charles Manson" online from anywhere, as Sophia Maddox embarks on a helter-skelter journey of self-discovery. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WevgHHtNDUS37zwdBa6vyk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bk7HRt2CqzohdLQ4a9oUm5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 08:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 08:05:39 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Disney +]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Aatif Sulleyman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/ikPsMQjEgxFXeWRgg5zHe8.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/bk7HRt2CqzohdLQ4a9oUm5-1280-80.jpg">
                                                            <media:credit><![CDATA[Bettmann via Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Charles Manson leaving court after deferring a plea on the Tate-LaBianca murder charges]]></media:description>                                                            <media:text><![CDATA[Charles Manson leaving court after deferring a plea on the Tate-LaBianca murder charges]]></media:text>
                                <media:title type="plain"><![CDATA[Charles Manson leaving court after deferring a plea on the Tate-LaBianca murder charges]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bk7HRt2CqzohdLQ4a9oUm5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You know all about the 'Manson Family', but Charles Manson's flesh and blood has largely kept a low profile — until Sophia Maddox discovered that she was related to one of the most notorious criminals in American history. “My Grandfather Charles Manson" chronicles the aspiring Hollywood actor's helter-skelter journey of self-discovery.</p><p>Here's how to watch “My Grandfather Charles Manson" online <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'My Grandfather Charles Manson' release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"My Grandfather Charles Manson" premieres on Wednesday, July 22.<br><strong>• U.S. </strong>— Stream on <a data-analytics-id="inline-link" href="https://www.disneyplus.com/" target="_blank" rel="nofollow">Disney+</a> or <a data-analytics-id="inline-link" href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2AivFEQ&offerid=763711.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow">Hulu</a><br><strong>• International</strong> — <a data-analytics-id="inline-link" href="https://www.disneyplus.com/" target="_blank" rel="nofollow">Disney+</a><br><strong>• Watch anywhere — </strong>try <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk free</strong></a></p></div></div><p>Sophia's father Daniel Arguelles, who bears an uncanny resemblance to Manson, broke the news to her in 2022. He'd been brought up by his mother Darlene, who at the age of 17 had had a fling with a man she'd met at a bus station. Daniel was 10 years old when Manson was arrested for orchestrating the Tate-LaBianca murders in 1969.</p><p>It was then that Darlene understood that the man who'd introduced himself to her as 'Charlie Dear' was in fact the cult leader who'd later claim to be the devil incarnate. She'd take the secret to her grave. However, Daniel uncovered the truth when a genealogy test matched him with Michael Brunner, one of several known sons of Manson.</p><p>It's fair to deduce that they took the news very differently. Whereas Daniel connected with Michael and embarked on a period of quiet self-reflection, Sophia spiraled, wholly convinced that she could go on to reflect her grandfather's image. </p><p>They fell out during the making of this film, which sees Sophia study Manson's traumatic upbringing, his mental health issues including schizophrenia and paranoid delusional disorder, and his sensationalist portrayal in the media. She also speaks with former members of the Manson’s Family, including Lynette “Squeaky” Fromme and Manson's last known girlfriend Stephanie Schram.</p><p>Read on as we explain how to watch "My Grandfather Charles Manson" online from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-my-grandfather-charles-manson-in-the-u-s"><span>How to watch 'My Grandfather Charles Manson' in the U.S.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="UHZYAaZCSyV7FkHxYGxtJ6" name="TG_US_Flag_1920_400_shutterstock.jpg" alt="US flag" src="https://cdn.mos.cms.futurecdn.net/UHZYAaZCSyV7FkHxYGxtJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" 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>In the U.S., "My Grandfather Charles Manson" premieres on <a href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2AivFEQ&offerid=763711.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>Hulu</strong></a> on Wednesday, July 22. </p><p>A subscription starts at $11.99/month, but you'll get more bang for your buck by bundling it with Disney+ and/or ESPN Select or ESPN Unlimited.</p><p>For instance, the Hulu & Disney+ bundle costs $12.99/month — just $1 more than Hulu on its own.</p><p><strong>Abroad when it's on?</strong> <a href="https://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=33286" target="_blank" rel="nofollow"><strong>Use a VPN</strong></a> to get around the geo-restrictions that will prevent your favorite streamer from working. Read on for all the details.</p><h2 class="article-body__section" id="section-how-to-watch-my-grandfather-charles-manson-from-anywhere"><span>How to watch 'My Grandfather Charles Manson' from anywhere</span></h2><p>Away from home at the moment and blocked from watching "My Grandfather Charles Manson" on your preferred service?</p><p>You can still tune in as normal thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a> (Virtual Private Network). The software allows your devices to appear as if they're back in your home country regardless of where in the world you are. Ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a>. It's the best on the market:</p><div class="product"><a data-dimension112="f190dfcc-84e5-11f1-8d16-d1b9940cda77" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" data-dimension112="f190dfcc-84e5-11f1-8d16-d1b9940cda77" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25=""><strong>NordVPN deal: 3 Months Extra FREE</strong></a>﻿﻿<br><br>Boasting lightning-fast speeds, great features, streaming power, and class-leading security, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our #1 VPN.<br><br><strong>✅ 3 months extra FREE!</strong><br><strong>✅ 75% off the usual price</strong><br><strong>✅ Unlocks streaming services</strong></p><p>Use Nord to unblock your usual streaming service and watch "My Grandfather Charles Manson" from abroad.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="f190dfcc-84e5-11f1-8d16-d1b9940cda77" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-how-to-watch-my-grandfather-charles-manson-in-the-u-k-australia-and-canada"><span>How to watch 'My Grandfather Charles Manson' in the U.K., Australia and Canada</span></h2><p>"My Grandfather Charles Manson" will be available to watch on <a href="https://www.tomsguide.com/reviews/disney-plus" target="_blank" rel="nofollow"><strong>Disney+</strong></a> in the U.K., Australia, Canada and elsewhere from Friday, July 24. </p><p><strong>Prices are as follows in each country:</strong></p><ul><li><strong>U.K.:</strong> £4.99/month</li><li><strong>Australia:</strong> AU$9.99/month</li><li><strong>Canada:</strong> CA$8.99/month</li></ul><p>Those abroad can access their Disney+ catalogue using <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>.</p><h2 class="article-body__section" id="section-my-grandfather-charles-manson-need-to-know"><span>'My Grandfather Charles Manson' — Need to Know</span></h2><h2 id="my-grandfather-charles-manson-trailer">'My Grandfather Charles Manson' trailer</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/fiLFIKW7LQI" allowfullscreen></iframe></div></div><section class="article__schema-question"><h3>Who is Sophia Maddox?</h3><article class="article__schema-answer"><p>Sophia Maddox is an actor known for starring in films "Hart of the Wild Bunch", "Saturday School", "Complicated Order", "Devil's Gate", "From Ashes" and "Precipice", TV show "Bunheads", and stage productions "Nutcracker", "Sleeping Beauty" and "Art of Dance". </p></article></section><section class="article__schema-question"><h3>Is Charles Manson still alive?</h3><article class="article__schema-answer"><p>Charles Manson died at the age of 83 on November 19, 2017. </p></article></section><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/apple-tv/watch-cape-fear">How to watch 'Cape Fear' — stream Apple TV's psychological thriller from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/disney-plus/disney-is-finally-merging-your-hulu-profile-into-the-streaming-service-heres-what-you-need-to-know">Disney+ is finally merging your Hulu profile into the streaming service — here's what you need to know</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-deli-boys-season-2">How to watch 'Deli Boys' season 2 online — stream all new episodes of the hit sitcom from anywhere</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 best Prime Video movies to stream now before they leave in July 2026 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/prime-video/5-best-prime-video-movies-to-stream-now-before-they-leave-in-july-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the five best Prime Video movies to watch now before they leave at the end of July 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dyvLPswyCU8RW2w2VU6TME</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cCihscdkCdGsnVu2KX5FSb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 04:01:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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.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/cCihscdkCdGsnVu2KX5FSb-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on an orange circles background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on an orange circles background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on an orange circles background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cCihscdkCdGsnVu2KX5FSb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As July draws to a close, streaming platforms are preparing to rotate their libraries, leaving movie fans with a short window to catch several titles before they disappear. While it’s surreal how quickly summer has flown by, the warm weather provides the perfect excuse to kick back with a great film. If you’re looking to unwind after spending the day outdoors, you’ll want to prioritize these <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> movies leaving by the end of the month.</p><p>As we approach the end of July next week, Prime Video is making it your last chance to stream a few standout titles before they get removed, including a gripping mystery-horror and a psychological thriller starring Jake Gyllenhaal. So, here are five movies worth streaming right now before they leave Prime Video.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePaVgW"></div>                            </div>                            <script src="https://kwizly.com/embed/ePaVgW.js" async></script><h2 id="held-2020">‘Held’ (2020)</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/_pZ7AhmPRbA" allowfullscreen></iframe></div></div><p>If you’re a horror fan, make “Held” a priority this week. This indie horror-thriller uses a home invasion setup, smart-home technology, and plenty of psychological suspense to put you on the edge of your seat. Set almost entirely in one location, the film creates most of its tension through its isolated setting. It’s a great pick for fans of contained thrillers like “Ex Machina” and “The Invisible Man” that turn modern technology into a source of fear.</p><p>Emma (Jill Awbrey) and Henry (Bart Johnson) are a married couple who travel to a secluded luxury rental home in an attempt to reconnect. After arriving, their getaway takes a disturbing turn when they discover they are unable to leave and are being monitored by an unknown figure. A mysterious voice begins issuing instructions while revealing personal details about their relationship, forcing the couple to uncover who is behind their confinement. </p><p><em><strong>Watch "Held" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G56RQ4F2" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> until July 25</strong></em></p><h2 id="ice-age-2002">‘Ice Age’ (2002)</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/i4noiCRJRoE" allowfullscreen></iframe></div></div><p>I think we all know that “Ice Age” is a landmark animated adventure film. I grew up with these films, and they remain some of the most nostalgic movies from my childhood. The original film officially put Blue Sky Studios on the map as a major animation powerhouse and launched one of the highest-grossing animated franchises of all time. Plus, it introduced Scrat, the acorn-obsessed saber-toothed squirrel who went on to become the franchise’s adorable (but unfortunate) mascot.</p><p>“Ice Age” follows Manny (Ray Romano), a woolly mammoth who prefers travelling alone, Sid (John Leguizamo), a talkative sloth, and Diego (Denis Leary), a saber-toothed tiger, as they go on a journey to return a human baby to his family. After discovering the child separated from his tribe, the unlikely group sets out across a changing prehistoric landscape while facing dangerous obstacles along the way, determined to reunite the baby with his father.</p><p><em><strong>Watch "Ice Age" on </strong></em><a href="https://www.amazon.com/Ice-Age-Chris-Wedge/dp/B000I9U8KK" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> until July 31</strong></em></p><h2 id="the-blackcoat-s-daughter-2015">‘The Blackcoat's Daughter’ (2015)</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/pRc_-iK3RVE" allowfullscreen></iframe></div></div><p>Next up is the atmospheric psychological horror “The Blackcoat’s Daughter,” written and directed by Osgood “Oz” Perkins, marking his feature directorial debut before films like “Gretel & Hansel” and “Longlegs.” The film uses a non-linear structure to slowly reveal how its characters’ stories connect, creating a dark and unsettling experience. Horror fans will also appreciate the deeply disturbing score from Elvis Perkins, which only adds to the film’s real sense of tension.</p><p>“The Blackcoat's Daughter” centers around two students, Kat (Kiernan Shipka) and Rose (Lucy Boynton), who remain behind at their secluded boarding school during winter break after their classmates leave. As the pair wait for their parents to arrive, strange events begin unfolding around the empty campus. Meanwhile, a young woman named Joan (Emma Roberts) travels toward the school after being picked up by a couple on the road. </p><p><em><strong>Watch "The Blackcoat's Daughter" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FKVRRNW5" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> until July 31</strong></em></p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="love-lies-bleeding-2024">‘Love Lies Bleeding’ (2024)</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/BF_J3-DmiS0" allowfullscreen></iframe></div></div><p>“Love Lies Bleeding” is a neon-drenched neo-noir thriller that is a pulpy homage to late-1980s crime cinema. It’s essentially a mix of romance, violent revenge, and obsession, which is one of the reasons it earned a strong reception from critics. This dark romantic thriller delivers the same unsettling energy found throughout Rose Glass’ previous work, while pushing things even further with its strange, unpredictable twists and some truly memorable moments.</p><p>Lou (Kristen Stewart) is a quiet gym manager living in a small New Mexico town, whose life changes when she meets Jackie (Katy O'Brian), an ambitious bodybuilder passing through on her way to a competition in Las Vegas. They soon find themselves drawn into a dangerous situation involving Lou’s estranged family and their criminal connections. With events quickly spiraling out of control, Lou and Jackie must confront the secrets surrounding those closest to them. </p><p><em><strong>Watch "Love Lies Bleeding" on </strong></em><a href="https://www.amazon.com/Love-Lies-Bleeding-Rose-Glass/dp/B0CVXZBBQ4" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> until July 31</strong></em></p><h2 id="enemy-2013">‘Enemy’ (2013)</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/aVvgt3jIUsc" allowfullscreen></iframe></div></div><p>One of Denis Villeneuve’s most overlooked films in recent years is “Enemy,” a psychological thriller loosely adapted from José Saramago’s 2002 novel. Widely considered one of Villeneuve’s most eerie, surreal, and atmospheric works, it’s a film that deserves more attention. Rather than relying on action, it delivers a deeply symbolic story exploring identity and fear of commitment. Anyone who has seen it will know about the shocking ending, which has inspired plenty of speculation online.</p><p>“Enemy” follows Adam Bell (Jake Gyllenhaal), a quiet history professor who discovers an actor named Anthony Claire who looks exactly like him after spotting him in a movie. Curious about the stranger’s existence, Adam begins investigating his double and soon finds their lives becoming increasingly connected. As he searches for answers, he meets Anthony’s wife Helen (Sarah Gadon) and discovers more about the actor’s personal life. </p><p><em><strong>Watch "Enemy" on </strong></em><a href="https://www.amazon.com/Enemy-Denis-Villeneuve/dp/B0FZ754CSN" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> until July 31</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/entertainment/prime-video/prime-video-just-added-5-gripping-movies-you-can-stream-for-free-and-one-is-an-action-packed-western-film">Prime Video added 5 gripping movies you can stream for free</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-must-watch-classic-movies-just-added-to-prime-video-including-clint-eastwoods-iconic-western-trilogy">5 must-watch classic movies just added to Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-july-20-26-2026">5 best new Netflix movies and shows to stream this week</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Author Dave Eggers says ChatGPT is 'silencing an entire generation' — here's why parents should pay attention ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/author-dave-eggers-says-chatgpt-is-silencing-an-entire-generation-heres-why-parents-should-pay-attention</link>
                                                                            <description>
                            <![CDATA[ Author Dave Eggers says ChatGPT is "silencing an entire generation." As a parent and AI writer, here's why I think his warning deserves a closer look. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vhv8w7EpAnjbTSHn7BwuUE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CzCUMMTkQ3frmKWaW2B6Q-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 17:08:13 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Jul 2026 19:33: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.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/CzCUMMTkQ3frmKWaW2B6Q-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Teens stand in a circle, each looking at their phones with smiles on their faces]]></media:description>                                                            <media:text><![CDATA[Teens stand in a circle, each looking at their phones with smiles on their faces]]></media:text>
                                <media:title type="plain"><![CDATA[Teens stand in a circle, each looking at their phones with smiles on their faces]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CzCUMMTkQ3frmKWaW2B6Q-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I write about AI for a living. I use <a href="https://www.tomsguide.com/ai/i-added-one-sentence-to-every-chatgpt-prompt-i-write-and-the-results-were-immediately-better">ChatGPT</a> almost every day and a plethora of other AI tools are integrated into my workflow. But after reading what author Dave Eggers recently told OpenAI employees, I found myself thinking even more about how AI affects my own kids.</p><p>Originally reported by <a href="https://www.theverge.com/ai-artificial-intelligence/967630/dave-eggers-openai-chatgpt-silencing-an-entire-generation" target="_blank">The Verge</a>, OpenAI CEO Sam Altman invited Eggers to speak to roughly 200 employees at the company last year. Given Eggers' reputation as an acclaimed novelist, founder of McSweeney's and longtime advocate for literacy, many probably expected a conversation about storytelling or creativity.</p><p>Instead, he delivered a blunt critique of generative AI's impact on education.</p><p>"The effect of ChatGPT on educators' lives is catastrophic," Eggers reportedly said. "If students are using it to compose... they'll never learn to write. And their voice is stolen from them... That's silencing an entire generation or two."</p><p>It's a dramatic statement, and while I don't agree with every part of it, it does raise questions that every parent should be asking. </p><h2 id="writing-isn-t-just-about-producing-words">Writing isn't just about producing words</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="hYQvvJRmTZEMRtfS3A3Rhc" name="3_WJS227.24_25_how_to.gettyimages_1639821021_16x9" alt="A young girl is doing homework, writing in her notepad while also working on her laptop" src="https://cdn.mos.cms.futurecdn.net/hYQvvJRmTZEMRtfS3A3Rhc.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: Getty Images)</span></figcaption></figure><p>One of the biggest misconceptions about AI is that writing is simply about creating a finished product. But it is not that easy. Writing is how we organize our thoughts and how we figure out what we actually believe. It's also how we learn to make an argument, explain an idea and communicate with other people.</p><p>Anyone who's ever stared at a blank page knows that the hardest part isn't typing the words, but actually<a href="https://www.tomsguide.com/ai/i-put-chatgpt-to-the-test-after-a-new-study-revealed-how-ai-tricks-our-brains"> doing the thinking </a>that comes before them.</p><p>That's the part I'm most concerned about. If students immediately turn to ChatGPT to generate an essay, summarize a novel or answer every homework question, they're skipping the mental work that helps those skills develop in the first place. </p><p>I believe that's what Dave Eggers is worried about, too. While the finished assignment might look and sound better than what a child could have written, it's only a shell because arguably the child didn't learn anything. </p><h2 id="i-don-t-think-schools-should-ban-ai">I don't think schools should ban AI</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:1533px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="MRCD5tDM3sJXsCTdVUgHiL" name="Modern classroom" alt="Students in a modern classroom" src="https://cdn.mos.cms.futurecdn.net/MRCD5tDM3sJXsCTdVUgHiL.png" mos="" align="middle" fullscreen="" width="1533" height="862" 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>Still, I don't think pretending ChatGPT doesn't exist is realistic. By the time today's elementary school students graduate from high school, AI will likely be as common as Google is today. Knowing how to use it responsibly will probably become an important life skill.</p><p>I think there's a big difference between using ChatGPT as a tutor and using it as a replacement for your own thinking.</p><p>For example, AI can be incredibly helpful for:</p><ul><li><strong>explaining a difficult concept in simpler language</strong></li><li><strong>brainstorming ideas before you start writing</strong></li><li><strong>checking grammar or spelling after you've written something</strong></li><li><strong>helping you study for a test</strong></li><li><strong>giving feedback on a first draft</strong></li></ul><p>Those uses still require you to do the work. The line gets blurrier when AI writes the first draft for you, which is where Eggers' criticism has merit.</p><p>I have three children, and AI is going to be part of their education whether I like it or not. That means my job isn't to convince them never to use ChatGPT (my sixth grader already does — mostly to generate images of him playing soccer with Ronaldo, but he is still very aware of what it is). My job is to help them understand when they should and should not use it. <br><br>For example, if they're stuck on a math concept, AI can be a great teacher. If they need ideas for a science project, it can be a useful brainstorming partner. But if they immediately ask ChatGPT to write the essay they're supposed to write themselves, they've missed the point of the assignment.</p><h2 id="my-final-thoughts">My final thoughts </h2><p>I don't think ChatGPT will "silence an entire generation." as long as parents stay diligent about how and why are kids use AI. Like every major technological shift before it, AI is a tool and we have to help our children use it safely. </p><p>But Eggers' warning is still worth hearing. As AI becomes more capable, it will become even more tempting to let it think for us instead of with us. That's a habit all of us need to resist. </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/claude/i-found-the-7-easiest-claude-connectors-for-people-over-50-start-with-these">I found the 7 easiest Claude connectors for people over 50 — start with these</a></li><li><a href="https://www.tomsguide.com/ai/i-replaced-my-notebook-with-an-ai-pen-for-a-month-heres-what-happened">I replaced my notebook with an AI pen for a month — here's what happened</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-to-make-my-iphone-more-private-it-found-7-settings-i-wish-id-turned-on-years-ago">I asked ChatGPT to make my iPhone more private — it found 7 settings I wish I'd turned on years ago</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Kitchen Nightmares USA' season 10 online — stream the Gordon Ramsay reality show from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/watch-kitchen-nightmares-usa-season-10</link>
                                                                            <description>
                            <![CDATA[ Gordon Ramsay has more rotten restaurants and calamitous kitchens to inspect - here's how to watch "Kitchen Nightmares USA" season 10 online from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dYdoCToKMBGCjr2Vn2RfsP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/urWURdi6Eu6V3YJwiCyu3G-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 16:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.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/urWURdi6Eu6V3YJwiCyu3G-1280-80.jpg">
                                                            <media:credit><![CDATA[FOX]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Gordon Ramsay in promotional image for &quot;Kitchen Nightmares&quot;]]></media:description>                                                            <media:text><![CDATA[Gordon Ramsay in promotional image for &quot;Kitchen Nightmares&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Gordon Ramsay in promotional image for &quot;Kitchen Nightmares&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/urWURdi6Eu6V3YJwiCyu3G-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Get ready to see Gordon Ramsay taking no prisoners as he tries to help more struggling restaurants in the latest season of "Kitchen Nightmares USA".</p><p>Below is our guide to how to watch "Kitchen Nightmares USA" season 10 from anywhere — live or on demand — including <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>how to tune in with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Kitchen Nightmares USA' S10 release date and time</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Kitchen Nightmares USA" season 10 premieres on Tuesday, July 21, 2026 at 8 p.m. ET on FOX in the U.S.</p><p class="fancy-box__body-text"><strong>• WATCH LIVE </strong>— <strong>FOX</strong> via <a data-analytics-id="inline-link" href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow">YouTube TV</a> <br><strong>• U.S. </strong>— Stream on <a data-analytics-id="inline-link" href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2AivFEQ&offerid=763711.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>Hulu</strong></a> from July 22<br><strong>• Watch anywhere </strong>— try <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk free</strong></a></p></div></div><p>"Kitchen Nightmares USA" season 10 (or the third season of the new reboot) will see Ramsay travel around the American Midwest, with plenty of difficult owners, staff meltdowns, and legitimate health code violations to contend with.</p><p>Highlights will include a visit to Freddy's Steak House in Indiana (which is part of the opening episode), the 40-year-old establishment Boodles Restaurant in Michigan, and the season finale takes us to Italian restaurant Firenze, which will be a fiery affair.</p><p>If you can't wait to see what Gordon Ramsay unearths next, check out the following information regarding <strong>how to watch "Kitchen Nightmares USA" season 10</strong> with live viewing and streaming options available.</p><h3 class="article-body__section" id="section-how-to-watch-kitchen-nightmares-usa-season-10-for-free-without-cable"><span>How to watch 'Kitchen Nightmares USA' season 10 for FREE without cable</span></h3><p>"Kitchen Nightmares USA" season 10 is available to watch live and free thanks to <a href="https://www.fox.com/" target="_blank" rel="nofollow">FOX One's 3-day free trial</a>.</p><p>You could also watch the series via <a href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow">YouTube TV</a> or <a href="https://www.fubo.tv/" target="_blank" rel="nofollow">Fubo</a> which give you access to linear TV and cable channels like Fox. Both offer free-trial periods.</p><p>Remember, you'll need a VPN to watch if you're not in the U.S. right now. We recommend <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>.</p><h2 class="article-body__section" id="section-watch-kitchen-nightmares-usa-season-10-from-anywhere"><span>Watch 'Kitchen Nightmares USA' season 10 from anywhere</span></h2><p>Traveling when "Kitchen Nightmares USA" airs? A <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a>, or virtual private network, can make your device appear to be back in your home country so you can log in to the streaming services you already pay for while you’re away.</p><p>We’ve tested all the major options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> remains one of the best VPN services right now. It’s fast, easy to use, and works across phones, laptops, tablets, streaming sticks, and smart TVs. There’s also a 30-day money-back guarantee, so you can try it with very little risk.</p><div class="product"><a data-dimension112="7ae72f3e-7f63-11f1-8624-5341873d1bc6" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="7ae72f3e-7f63-11f1-8624-5341873d1bc6" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25=""><strong>NordVPN deal: 3 Months Extra FREE</strong></a><br><br>Boasting lightning -fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><strong></strong><br><strong>✅ 3 months extra FREE!</strong><br><strong>✅ 75% off usual price</strong><br><br>Use Nord to unblock your usual streaming service and watch "Kitchen Nightmares USA" season 10 from anywhere in the world.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="7ae72f3e-7f63-11f1-8624-5341873d1bc6" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25="">View Deal</a></p></div><p>Using a VPN is incredibly simple.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favourite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you're outside the U.S. but want to watch the show as usual, you'd select a U.S. server from the list.</p><p><strong>3. Sit back and enjoy the action. </strong>Head over to <a href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2AivFEQ&offerid=763711.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>Hulu</strong></a> and watch "Kitchen Nightmares USA" as normal.</p><h2 class="article-body__section" id="section-watch-kitchen-nightmares-usa-season-10-in-the-u-s"><span>Watch 'Kitchen Nightmares USA' season 10 in the U.S.</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:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="UHZYAaZCSyV7FkHxYGxtJ6" name="TG_US_Flag_1920_400_shutterstock.jpg" alt="US flag" src="https://cdn.mos.cms.futurecdn.net/UHZYAaZCSyV7FkHxYGxtJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>In the U.S., "Kitchen Nightmares USA" season 10 is playing on <strong>FOX</strong> on <strong>Tuesday, July 21 </strong>— <strong>from 8 p.m. ET. </strong>The series starts with a bumper two-hour episode.</p><p>Streaming service, <a href="https://www.fox.com/" target="_blank" rel="nofollow">FOX One</a> is the most simple way to watch FOX. You can also stream FOX live through services such as <a href="https://www.fubo.tv/" target="_blank" rel="nofollow">Fubo</a>, <a href="https://click.linksynergy.com/fs-bin/click?id=kXQk6*ivFEQ&offerid=966271.482&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" rel="nofollow">Hulu + Live TV</a> and <a href="https://www.dpbolvw.net/click-8900245-17161926?sid=hawk-custom-tracking" target="_blank" rel="nofollow">YouTube TV</a>, with <a href="https://www.sling.com/" target="_blank" rel="nofollow">Sling Blue</a> carrying FOX in select markets. </p><p>But, what if you miss the live broadcast? The episodes land on <a href="https://www.hulu.com/welcome" target="_blank" rel="nofollow"><strong>Hulu</strong></a> the next day, starting <strong>Wednesday, July 22.</strong></p><p>If you're outside the U.S. when the show airs, you can use a VPN such as <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> to access your usual services while traveling.</p><h3 class="article-body__section" id="section-watch-kitchen-nightmares-usa-season-10-in-canada"><span>Watch 'Kitchen Nightmares USA' season 10 in Canada</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="eByagaoLZki73CLtYaRPMG" name="TG_Canada_Flag_1920_400_shutterstock.jpg" alt="Canada Flag" src="https://cdn.mos.cms.futurecdn.net/eByagaoLZki73CLtYaRPMG.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>In Canada, you can watch "Kitchen Nightmares USA" season 10 is expected to drop on <a href="https://www.crave.ca/en/ctv" target="_blank" rel="nofollow"><strong>CTV</strong></a>.</p><p>This will also make it available on either <a href="https://www.crave.ca/" target="_blank" rel="nofollow"><strong>Crave</strong></a> or <a href="https://watch.globaltv.com/series/63e9f076-ca44-11ef-9bf0-0242ac110005/collection/bccf08f8-8cb7-11f0-8920-0242ac110003/" target="_blank" rel="nofollow"><strong>Global TV</strong></a>.</p><p>Travelers from the U.S. can also <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>use a VPN</strong></a> to access their home subscriptions.</p><h3 class="article-body__section" id="section-can-you-watch-kitchen-nightmares-usa-season-10-in-the-u-k"><span>Can you watch 'Kitchen Nightmares USA' season 10 in the U.K.?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="ttCSpj8r9kHj68j7NhsBL9" name="TG_British_Flag_1920_400_shutterstock.jpg" alt="British flag" src="https://cdn.mos.cms.futurecdn.net/ttCSpj8r9kHj68j7NhsBL9.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>There is no plan in place for the broadcast of "Kitchen Nightmares USA" season 10 in the U.K. as things stand.</p><p>Past seasons of the show are available on-demand on Channel 4's streaming service, and the latest episodes will likely end up there eventually.</p><p>If you're a U.S. subscriber traveling in the U.K., a VPN such as <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> can help you sign in to FOX or Hulu as you normally would.</p><h3 class="article-body__section" id="section-can-you-watch-kitchen-nightmares-usa-seson-10-in-australia"><span>Can you watch 'Kitchen Nightmares USA' seson 10 in Australia?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="R4wb8TX7wmafWv7eBYfay3" name="TG_australia_Flag_1920_400_shutterstock.jpg" alt="Australia flag" src="https://cdn.mos.cms.futurecdn.net/R4wb8TX7wmafWv7eBYfay3.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>It's fairly similar in Australia, with the latest episodes of "Kitchen Nightmares USA" season 10 likely to arrive on 7Plus eventually, but with no firm release date just yet.</p><p>If you're traveling and already subscribe to a service carrying the show in your home region, a VPN like <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is the easiest way to keep watching without changing accounts or waiting for a local release.</p><h2 id="kitchen-nightmares-usa-season-10-episode-guide">'Kitchen Nightmares USA' season 10 - episode guide</h2><p>While we don't have details of every restaurant Ramsay will visit throughout "Kitchen Nightmares USA" season 10, we do know about three key episodes:</p><ul><li><strong>July 21</strong> - The two-hour season opener will see Ramsay visit two restaurants. The first is Freddy's Steak House in Hammond, Indiana, and he will also see a place called 4 Star Diner in Roland, Oklahoma.</li><li><strong>August 18</strong> - Ramsay travels to Madison Heights, Michigan to scrutinize a 40-year-old establishment renowned for its supper menu and its vintage vibes.</li><li><strong>September 15</strong> - The season finale will see Ramsay take on Firenze, an Italian family-run restaurant in Warren, Michigan.</li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/peacock/watch-married-at-first-sight-season-20">How to watch 'Married at First Sight' season 20 online from anywhere</a></li><li><a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">The best streaming services to subscribe to right now</a></li><li><a href="https://www.tomsguide.com/tvs/fox-is-buying-roku-heres-what-that-could-mean-for-your-living-room">Fox is buying Roku — here's what that could mean for your living room</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Light just announced a $299 flip phone to cure screen addiction — and its co-founder convinced me to embrace being bored again ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/android-phones/light-just-announced-a-usd299-flip-phone-to-cure-screen-addiction-and-its-co-founder-convinced-me-to-embrace-being-bored-again</link>
                                                                            <description>
                            <![CDATA[ I spoke to Light co-founder Kaiwei Tang about the new $299 Light Flip phone, breaking smartphone addiction, and why embracing boredom is the future of tech. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HF8V4r9VVZBBd33qnxYt6g</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2xCCbvSRRekRKjiGbsrfRo-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 15:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <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/2xCCbvSRRekRKjiGbsrfRo-1280-80.jpg">
                                                            <media:credit><![CDATA[Light]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Light Flip]]></media:description>                                                            <media:text><![CDATA[Light Flip]]></media:text>
                                <media:title type="plain"><![CDATA[Light Flip]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2xCCbvSRRekRKjiGbsrfRo-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>“When was the last time you browsed a bunch of TikTok videos, and came out of it feeling better about yourself?” Kaiwei Tang, co-founder of Light Phone asked me while unveiling their latest Light Flip.</p><p>It’s a question that really sat with me. Your smartphone is reliant on your attention to drive value — designed to give you just enough of an emotional response to keep you coming back. </p><p>I thought I was wiser to my phone’s tricks, but I’ve fallen down the rabbit hole. I’m addicted, and the Light Flip could be the rehab and nicotine patch I’ve been looking for. It’s expected to ship in April 2027 for $299, and I got the inside scoop with Tang.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-egKZpe"></div>                            </div>                            <script src="https://kwizly.com/embed/egKZpe.js" async></script><h2 id="light-flip-specs">Light Flip specs</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>4.3 x 2.3 x 0.7 inches (folded)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>5.6 ounces</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>2.8-inch matte OLED (480 x 640 pixels)</p></td></tr><tr><td class="firstcol " ><p><strong>Camera</strong></p></td><td  ><p>50MP rear sensor (12MP image)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>MediaTek MT8773</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>6GB RAM / 128GB storage</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>5G + 4G LTE / GPS / Bluetooth 5.0</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>USB-C, 3.5mm headphone jack</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>1,800 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$299</p></td></tr></tbody></table></div><h2 id="it-s-a-flipping-time-machine">It's a flipping time machine</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="99Xe3tgK4cVwzDa45HcxKo" name="Light Flip" alt="Light Flip" src="https://cdn.mos.cms.futurecdn.net/99Xe3tgK4cVwzDa45HcxKo.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Light)</span></figcaption></figure><p>On the face of it, this is a very simple dumbphone, and that’s entirely by design (as has been the case with every Light phone). You’re getting that same super simple UI with basic apps posed as tools rather than trying to consume all your attention. This is intentional tech to give you more of your time back in the day.</p><p>This goes down to the core of the very millennial design too — with small details that Kaiwei (a former Motorola Razr design staffer) is particularly proud of. The hinge gives you that satisfying tactility to open for starting the job, or closing to dramatically end a call. Plus attention has been paid to the keypad too with nice clickiness and predictive T9 texting (needed because that is not a touchscreen on there). </p><p>Throw in some gorgeous color finishes along with some (on the face of it), a 3.5mm headphone jack (welcome back) and a deliberate choice to not have a front-facing camera, and you start to see the mission here. This is a very focused kind of phone — not trying to be everything to everyone, and just doing the bare essentials to give you your life back.</p><p>For the privilege, you’ll either be paying $39 per month with a 24-month commitment or $299 without a contract. In a world where Apple and Samsung are charging $1,200+ for <a href="https://www.tomsguide.com/phones/phones-need-to-focus-less-on-ai-and-more-on-what-makes-hardware-actually-great-heres-why">AI features we didn't ask for</a>, Light is asking for $299 to actively take features away. And honestly? It might be the best tech bargain of the year.</p><h2 id="just-one-more-feature">“Just one more feature?”</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yyn7ro6pnmBtegpF7xdWS5" name="Light Flip" alt="Light Flip" src="https://cdn.mos.cms.futurecdn.net/yyn7ro6pnmBtegpF7xdWS5.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Light)</span></figcaption></figure><p>Back at the beginning of Light’s journey, the phone was simply that: a phone. No additional features, and across multiple generations, the team’s responded to requests for new tools to improve its arsenal in an intentional way.</p><p>And now, the company is opening things up to allow third-party developers to create tools with an SDK. Of course, there needs to be strict controls as to not compromise the Light phone mission, which Tang is aware of. </p><p>“We will keep it utility focused,” he added. “We will have a tool library that will have to meet our principles, which are <strong>no advertisements and no endless feeds.” </strong>Quite a breath of fresh air to not have an app store packed with software that’s designed to consume all your attention.</p><p>So far, the 2,000+ developers have been looking to build tools like a field recorder, different language keyboards, and even a local subway map. It’s going to be interesting to see how the ecosystem evolves.</p><h2 id="breaking-the-habit">Breaking the habit</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qy3diva6ftFtVbeJg4PJMo" name="Light Flip" alt="Light Flip" src="https://cdn.mos.cms.futurecdn.net/qy3diva6ftFtVbeJg4PJMo.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Light)</span></figcaption></figure><p>But back to my chat with Kaiwei, making these phones is all well and good, and the Gen-Z attraction to going back to simpler times with tech is definitely driving the attraction for millennials like me to go back… But there’s a big difference between reading about it and actually doing it!</p><p>That’s where Light is intervening to help welcome more people into this Luddite community with the Flip Your Life program. With this, you’ll get newsletters, blogs and access to a community center to help you with self-auditing your digital usage, resources and users to connect with, and challenges to push you to reduce your screen time.</p><p>“You don’t just buy a device and kick your addiction, you’ve got to plan for it,” Tang commented. “We’re trying to hold their hand through this behavior change, because to get into the mindset is not a magic pill.”</p><p>One of the key areas that he seems intent to target with this program is what happens with all the extra free time you get. This is usually one of the key moments smartphones will sink their claws into your attention — sitting around waiting for something. </p><p>The Light Flip isn't just a piece of hardware; it’s a psychological gauntlet. Tang told me the ultimate goal here is to realize that “boredom is actually fine.” I don't know about you, but the idea of just standing in line with my own thoughts is currently more terrifying than my daily screen time report.</p><h2 id="outlook-3">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="j2tAxKH5fDewWMTrcSqKNo" name="Light Flip" alt="Light Flip" src="https://cdn.mos.cms.futurecdn.net/j2tAxKH5fDewWMTrcSqKNo.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Light)</span></figcaption></figure><p>In the whirlwind of <a href="https://www.tomsguide.com/phones/samsung-phones/massive-samsung-leak-reveals-official-galaxy-z-fold-8-fold-8-ultra-and-flip-8-images-ahead-of-unpacked">leaked Galaxy Z Fold 8 phones</a> giving us all kinds of new distraction machines/foldables, it sets a rather interesting backdrop to a dumbphone being announced. But them’s the breaks, and it’s a nice change of pace to see a company actively not wanting to consume all of your attention.</p><p>Is it time to go back to intentional tech? Are you interested in seeing more about becoming a Neo-Luddite? I’m already doing the homework to get towards that in my own life, and I’m happy to share any steps to do so! Go ahead and let me know in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-to-watch-summer-galaxy-unpacked-2026-galaxy-z-fold-8-fold-8-ultra-flip-8-and-more">How to watch Summer Galaxy Unpacked 2026 — Galaxy Z Fold 8, Fold 8 Ultra, Flip 8 and more</a></li><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-messages-app-has-a-real-time-translation-feature-heres-how-to-use-it">Your iPhone Messages app has a real-time translation feature — here's how to use it</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/im-not-convinced-crease-free-foldables-like-the-galaxy-z-fold-8-actually-matter-prove-me-wrong">I’m not convinced crease-free foldables like the Galaxy Z Fold 8 actually matter. Prove me wrong.</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ When is 'The Odyssey' streaming? Here's our best guess ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/when-is-the-odyssey-streaming-heres-our-best-guess</link>
                                                                            <description>
                            <![CDATA[ Here's our guess as to when you can buy or rent to watch 'The Odyssey' at home, and when you can stream it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YyTegjhgyFvfwxURkePe29</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EwcuwKBAJHKwAUwJCavrec-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 13:34:26 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Brittany Vincent ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JDgb6vqXHys3nrFJpkRCub.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/EwcuwKBAJHKwAUwJCavrec-1280-80.jpg">
                                                            <media:credit><![CDATA[Universal Pictures]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Odyssey]]></media:description>                                                            <media:text><![CDATA[The Odyssey]]></media:text>
                                <media:title type="plain"><![CDATA[The Odyssey]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EwcuwKBAJHKwAUwJCavrec-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Odysseus is finally making his way home, but when will he make it to yours? Christopher Nolan's "The Odyssey" opened last weekend to $264.1 million worldwide, the biggest live-action debut of the year and the best opening of Nolan's career.</p><p>Matt Damon stars as Odysseus, with Anne Hathaway as Penelope, Tom Holland as Telemachus and Zendaya as Athena, alongside more A-listers rounding out the cast. The R-rated adaptation of Homer's epic runs 2 hours and 52 minutes and is playing in theaters right now, and it's only in IMAX for the first three weeks. But how long will it be before you can watch it from the comfort of your own couch?</p><p>Since it just hit theaters, "The Odyssey" isn't available on any of the best streaming services just yet. Here's the good news, though: Based on Universal's recent release patterns, we can make a solid guess about when you'll be able to rent, buy and stream it at home. If you're curious about when you should start planning for a movie night, we've got the answers right here. Keep reading to find out.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="when-can-we-expect-the-odyssey-to-arrive-on-streaming">When can we expect 'The Odyssey' to arrive on streaming?</h2><p>Ready to head off on an adventure? You'll have to do it at your local cinema. "The Odyssey" is still in theaters after opening nationwide on July 17. If you're waiting on a home release, settle in — this one is going to take a while.</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/Mzw2ttJD2qQ" allowfullscreen></iframe></div></div><p>Universal used to move to streaming faster than any other major studio, sending its films to premium video-on-demand (PVOD) after as little as 17 days. That changed in March, when NBCUniversal chair Donna Langley told the New York Times the studio would guarantee at least five weekends of theatrical exclusivity for the rest of 2026, stretching to seven weekends in 2027. Five weekends from July 17 makes <strong>August 18</strong> the earliest possible date.</p><p>Nolan is not a five-weekend director, though. "Oppenheimer" opened July 21, 2023, and didn't reach digital until November 21, exactly four months later.  "The Odyssey" is playing as an IMAX exclusive through its first three weeks, has no new wide competition until "Spider-Man: Brand New Day" on July 31, and opened to massive box office numbers. Chances are it's going to stay in theaters for quite some time. </p><p>Our best estimate is that you may see the film get a digital release on <strong>November 17, 2026</strong>. Nothing has been announced yet, however. </p><p>The physical release should arrive at the same time. Universal put "Oppenheimer" on 4K UHD, Blu-ray, and DVD the same day it hit digital. We can probably expect the same treatment here, since "The Odyssey" was shot entirely with IMAX film cameras and the 4K disc is the closest most people will get to that.</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:6240px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Zduzehha6V9qeWC6pdhkwF" name="CT-54129_MSG" alt="(L-R) Matt Damon as Odysseus and Zendaya as Athena in "The Odyssey" (2026)" src="https://cdn.mos.cms.futurecdn.net/Zduzehha6V9qeWC6pdhkwF.jpg" mos="" align="middle" fullscreen="" width="6240" height="3510" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Universal Pictures)</span></figcaption></figure><p>As for streaming by subscription, the film has a guaranteed home on Peacock, since the platform is Universal's corporate sibling. "Oppenheimer" took 210 days to get there, landing February 16, 2024, right as Oscar voting opened. The same gap would put "The Odyssey" on Peacock around <strong>February 12, 2027. </strong></p><p>For now, the theater is your only option, and it will be for the foreseeable future. If you want it in IMAX 70mm, don't wait, because those screens have been booking out since presales opened a year ago. In the meantime, the behind-the-scenes special "The Odyssey: The Making of an Epic" is streaming on Peacock right now, so you can get a little taste of what you're missing if you refuse to leave the house. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch ‘The Undeclared War' season 2 online for free — stream the Simon Pegg political thriller from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/watch-the-undeclared-war-season-2</link>
                                                                            <description>
                            <![CDATA[ Simon Pegg is back to stop more cyber attacks in this thrilling drama series - here's how to watch "The Undeclared War" season 2 online and from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KuDrEZqfo5XcMtXPCvf6hM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2bUwVdtooo4BEf4adcmY6Z-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.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/2bUwVdtooo4BEf4adcmY6Z-1280-80.jpg">
                                                            <media:credit><![CDATA[Channel 4]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Simon Pegg in promotional image for &quot;The Undeclared War&quot; Season 2]]></media:description>                                                            <media:text><![CDATA[Simon Pegg in promotional image for &quot;The Undeclared War&quot; Season 2]]></media:text>
                                <media:title type="plain"><![CDATA[Simon Pegg in promotional image for &quot;The Undeclared War&quot; Season 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2bUwVdtooo4BEf4adcmY6Z-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Simon Pegg stars in "The Undeclared War" and it's back for a second season, with more political drama, cyber threats, and klandestine meetings on offer.</p><p>Here, we'll show you how to watch "The Undeclared War" season 2 online <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> — and for free.</strong></p><div  class="fancy-box"><div class="fancy_box-title">"The Undeclared War" S2 free streaming details, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">"The Undeclared War" season 2 premieres July 21, 2026 in the U.K. with the first episode airing at 9 p.m. on Channel 4. <br><strong>•</strong> <strong>WATCH FREE </strong>— <a data-analytics-id="inline-link" href="https://www.channel4.com" target="_blank" rel="nofollow"><strong>Channel 4</strong></a> <strong>(U.K.)</strong><br><strong>•</strong>  <strong>U.S. </strong>— <a data-analytics-id="inline-link" href="https://www.peacocktv.com/" target="_blank" rel="nofollow"><strong>Peacock</strong></a> (August 27 release)<br><strong>•</strong> <strong>Unblock any stream</strong> — <strong>Use </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk free</strong></a></p></div></div><p>Season 1 of "The Undeclared War" left us on a superb cliffhanger, with Vadim's line going dead and us all assuming he has sacrificed himself for the cause, which means when we dive into season 2 we will be picking up the pieces from that potentially huge moment.</p><p>The latest episodes will see Danny Patrick (Simon Pegg) and his team discovering that it's not Russia behind the cyber attack they've been dealing with all along, with a new, unknown threat lurking in the shadows. There's six episodes to come, and lots more plot twists, we're sure.</p><p>If you're ready to be on the edge of your seat and dive into the latest episodes, we'll show you how to watch "The Undeclared War" season 2 online from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-the-undeclared-war-season-2-for-free"><span>How to watch 'The Undeclared War' season 2 for FREE</span></h2><div class="product"><a data-dimension112="6e9ccfb6-8055-11f1-a84d-3f7debd6462e" data-action="Deal Block" data-label="FREE Channel 4 on-demand service" data-dimension48="FREE Channel 4 on-demand service" href="https://www.channel4.com" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="noei6WWs47cCjbgHHuSfkK" name="Channel 4 logo.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/noei6WWs47cCjbgHHuSfkK.png" mos="" align="middle" fullscreen="" width="200" height="200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>You can watch all six episodes of "The Undeclared War" season 2 on the free-to-air <strong>Channel 4</strong> in the U.K. together with its <a href="https://www.channel4.com" target="_blank" rel="nofollow" data-dimension112="6e9ccfb6-8055-11f1-a84d-3f7debd6462e" data-action="Deal Block" data-label="FREE Channel 4 on-demand service" data-dimension48="FREE Channel 4 on-demand service" data-dimension25=""><strong>FREE Channel 4 on-demand service</strong></a>.</p><p>The first episode of the second season will air at 9 p.m. on Channel 4, with subsequent episodes broadcast weekly on linear TV.</p><p>All you need to access Channel 4 and its streaming platform is a U.K. postcode (e.g. HA9 0AA) and a valid TV license.</p><p><strong>Outside the U.K.?</strong> Channel 4 will be blocked. But don't worry, you can still watch “The Undeclared War" season 2 when you <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>download a VPN</strong></a> and change your location back to the U.K.</p></div><h2 class="article-body__section" id="section-watch-the-undeclared-war-season-2-from-anywhere"><span>Watch 'The Undeclared War' season 2 from anywhere</span></h2><p>If you're <strong>away from home</strong> at the moment — whether it be <strong>Australia, Canada, or the U.S.</strong> — and find yourself blocked from watching "The Undeclared War" on your usual subscription, we can help. <a href="https://www.tomsguide.com/how-to/how-to-watch-uk-tv-abroad">Watching U.K. TV abroad</a> isn't always simple, but it is possible. </p><p>You will still be able to watch the show thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn"><strong>VPN</strong></a><strong> (Virtual Private Network)</strong>. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> — we explain why in our <a href="https://www.tomsguide.com/reviews/nordvpn-review">NordVPN review</a>.</p><div class="product"><a data-dimension112="6e9cd16e-8055-11f1-a517-dd4b66abccff" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>🟩 <a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="6e9cd16e-8055-11f1-a517-dd4b66abccff" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25=""><strong>NordVPN deal: 3 Months Extra FREE</strong></a></p><p>Boasting super fast speeds, great features, streaming power and industry-leading security, <a href="https://www.tomsguide.com/reviews/nordvpn-review" target="_blank"><strong>NordVPN</strong> is our #1 VPN</a>.<br><br><strong>✅ Get 3 months extra FREE</strong><br><strong>✅ 30-day money-back guarantee</strong><br><strong>✅ 75% off the usual price</strong></p><p>Use NordVPN to unblock your usual streaming service and watch "The Undeclared War" with this <em>exclusive </em>deal. <a class="view-deal button" href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="6e9cd16e-8055-11f1-a517-dd4b66abccff" data-action="Deal Block" data-label="NordVPN deal: 3 Months Extra FREE" data-dimension48="NordVPN deal: 3 Months Extra FREE" data-dimension25="">View Deal</a></p></div><p>Using a VPN is incredibly simple.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you're in the U.S. and want to view a U.K. service, you'd select United Kingdom from the server list.</p><p><strong>3. Sit back and binge! </strong>Head to <a href="https://www.channel4.com" target="_blank" rel="nofollow">Channel 4</a> and stream "The Undeclared War" season 2.</p><h2 id="can-i-watch-the-undeclared-war-season-2-in-the-u-s">Can I watch 'The Undeclared War' season 2 in the U.S.?</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:20.83%;"><img id="g7scVdo7SGjwad72Vt6s5V" name="UHZYAaZCSyV7FkHxYGxtJ6-1200-80.jpg.jpg" alt="United States of America flag" src="https://cdn.mos.cms.futurecdn.net/g7scVdo7SGjwad72Vt6s5V.jpg" mos="" align="middle" fullscreen="" width="1200" height="250" 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>Yes, you will be able to watch "The Undeclared War" season 2 in the U.S. on <a href="https://www.peacocktv.com/" target="_blank" rel="nofollow">Peacock</a>. </p><p>The only problem is you'll have to wait a bit longer, as it doesn't land in the States until <strong>August 27</strong>.</p><p><strong>Visiting the U.S. from the U.K.?</strong> <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> costs less than a coffee and will unlock Channel 4 today.</p><h2 id="can-you-watch-the-undeclared-war-season-2-in-canada">Can you watch 'The Undeclared War' season 2 in Canada?</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:20.83%;"><img id="eByagaoLZki73CLtYaRPMG" name="TG_Canada_Flag_1920_400_shutterstock.jpg" alt="Canada Flag" src="https://cdn.mos.cms.futurecdn.net/eByagaoLZki73CLtYaRPMG.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" 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>There is currently no broadcast or streaming plan for "The Undeclared War" season 2 in Canada.</p><p><strong>The solution?</strong> U.K. viewers can sign up to <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a> and access their streaming services wherever they are in the world. </p><h2 id="can-i-watch-the-undeclared-war-season-2-in-australia">Can I watch 'The Undeclared War' season 2 in Australia?</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:20.83%;"><img id="R4wb8TX7wmafWv7eBYfay3" name="TG_australia_Flag_1920_400_shutterstock.jpg" alt="Australia flag" src="https://cdn.mos.cms.futurecdn.net/R4wb8TX7wmafWv7eBYfay3.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" 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>It's a similar situation in Australia, where there is no release plan for "The Undeclared War" season 2.</p><p>Season 1 was available on <strong>Stan</strong>, so we expect to it release there when it arrives in Oz.</p><p>If you're traveling around, using a service like <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help bypass geo-restrictions and get you on your usual streaming apps.</p><h2 id="the-undeclared-war-season-2-cast">'The Undeclared War' season 2 - cast</h2><ul><li>Hannah Khalique-Brown as Saara Parvin</li><li>Simon Pegg as Danny Patrick</li><li>Maisie Richardson-Sellers as Kathy Freeman</li><li>Siân Brooke as Barbara Patrick</li><li>Alex Jennings as David Neal</li><li>Danny Sapani as Charlie Francis</li><li>Chloe Pirrie as LT Colonel Roz Cavendish</li><li>Ed Stoppard as Richard Marston</li><li>German Segal as Vadim Trusov</li></ul><h2 id="the-undeclared-war-season-2-trailer">'The Undeclared War' season 2 - trailer</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/F5pq_j_FJSw" allowfullscreen></iframe></div></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/entertainment/streaming/how-to-watch-ride-or-die">How to watch 'Ride or Die' online — stream the Hannah Waddingham action-comedy series from anywhere</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">The best streaming VPN</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-watch-uk-tv-abroad">How to watch UK TV abroad: BBC iPlayer, ITVX, Channel 4 and more</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Expert shares unusual household item to prevent ants from invading your home this summer ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/expert-shares-unusual-household-item-to-prevent-ants-from-invading-your-home-this-summer</link>
                                                                            <description>
                            <![CDATA[ Dealing with pesky ants? Homeowners are being told to use this one bathroom item that could help stop ants in your home this summer. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mzgeZ8dCCTUmbdaftFLAYi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/D9cYcp2nt9AqSeFZX95XTe-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 11:24:57 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Jul 2026 12:35:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.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/D9cYcp2nt9AqSeFZX95XTe-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Ants on baseboard]]></media:description>                                                            <media:text><![CDATA[Ants on baseboard]]></media:text>
                                <media:title type="plain"><![CDATA[Ants on baseboard]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/D9cYcp2nt9AqSeFZX95XTe-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer has arrived, bringing with it the inevitable nuisance of seasonal pests like ants. Whether you are dealing with a handful of scouts or a full-scale invasion, trying to <a href="https://www.tomsguide.com/home/how-do-i-know-what-kind-of-ants-i-have-in-my-home-and-why-it-matters-i-ask-the-pest-experts">get rid of ants </a>is often a frustrating task. </p><p>Not only do these tiny critters reproduce quickly, but they can also cause structural damage in extreme circumstances.</p><p>And if you don’t want to use toxic sprays around your home, there are plenty of <a href="https://www.tomsguide.com/how-to/how-to-get-rid-of-ants">natural ways to get rid of ants without chemicals</a>.</p><p>An expert has revealed an unusual bathroom essential that could be the key to deterring ants this summer. Best of all, you likely already have this affordable staple tucked away in your cabinet, and it only takes a few moments to use — <strong>talcum powder.</strong></p><h3 class="article-body__section" id="section-why-is-talcum-powder-a-good-ant-repellent"><span>Why is talcum powder a good ant repellent?</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:5463px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZF8Q8JDNo2Rg9MevtRpzWP" name="Talcum powder - crop.jpg" alt="Talcum powder on surface" src="https://cdn.mos.cms.futurecdn.net/ZF8Q8JDNo2Rg9MevtRpzWP.jpg" mos="" align="middle" fullscreen="" width="5463" height="3073" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Talcum powder on surface  </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Although typically associated with soothing diaper rash, it turns out that there are so many clever uses for talcum powder — notably deterring ants. The reason this works is that the powder’s composition disrupts the pheromone paths ants rely upon, literally stopping them in their tracks. </p><p>“It might sound a bit random, but the idea is that talcum powder can interfere with the scent trails ants use to find their way to food and back again,” explains expert Glen Peskett from <a href="https://tracking.us.nylas.com/l/ba284fcf7f0e4e2d943c507be14e635b/0/5c399e2620f1ac1d2be98a14d6d978419ea545e0980e655010a8e59bec510421?cache_buster=1784614100" target="_blank">Saxton Blades Multi Tools</a>.</p><p>“Ants follow scent trails, so when one finds food it leaves a kind of path for the rest of the colony. The idea with talcum powder is that it can mess with those trails and make it harder for them to keep finding their way back. </p><p>"It is not going to wipe them out or deal with a big infestation, but some people find it helps cut down what they are seeing in certain spots.”</p><h3 class="article-body__section" id="section-how-to-use-talcum-powder-to-repel-ants"><span>How to use talcum powder to repel ants</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:6230px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LimU57QWJ7ShvBba22yRma" name="shutterstock_2174594601 (1).jpg" alt="Ants eating crumbs in a kitchen" src="https://cdn.mos.cms.futurecdn.net/LimU57QWJ7ShvBba22yRma.jpg" mos="" align="middle" fullscreen="" width="6230" height="3504" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Ants eating crumbs in a kitchen </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><div><blockquote><p>Talcum powder can interfere with the scent trails ants use to find their way to food and back again</p><p>Glen Peskett, Director, Saxton Blades Multi Tools</p></blockquote></div><p>So how can you apply talcum powder in your home? Simply sprinkle a small layer of talcum powder along the baseboards, window frames, crevices, or any areas where ants are getting into your kitchen or home.</p><p>Additionally, you could keep ants away from outdoor picnics or play areas with a layer of powder. </p><p>Essentially, this should create a light barrier that helps disrupt the pheromone trail they’re following — and you should see a decline in tiny visitors. </p><p>Of course, it always helps to take preventative measures and be aware of the key<a href="https://www.tomsguide.com/how-to/7-things-that-are-attracting-ants-to-your-home"> things that are attracting ants to your home</a>. “A lot of the time, ants are just going after an easy food source,” Peskett adds.</p><p>“You can try different tricks, but if there’s food left out, they’ll keep coming back. Keeping things clean and properly sealed up makes the biggest difference.” </p><p>Keeping your kitchen countertops and floors clean and disinfected at all times will make all the difference. </p><p>It is worth noting that while this bathroom staple works as a quick and affordable hack for tackling a few stragglers, it is not a solution for a major pest problem. If you suspect an infestation, it’s advisable to contact your local professional pest services. </p><p>In any case, this expert-recommended trick is an excellent way to halt those annoying summer guests before they become a permanent fixture in your home.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xj3Gae"></div>                            </div>                            <script src="https://kwizly.com/embed/Xj3Gae.js" async></script><h3 class="article-body__section" id="section-top-tips-to-prevent-ants"><span>Top tips to prevent ants</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:3928px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="xzsn5fnpoHAQTHaAJrksoi" name="shutterstock_2357277675" alt="Carpenter ants on wooden surface" src="https://cdn.mos.cms.futurecdn.net/xzsn5fnpoHAQTHaAJrksoi.jpg" mos="" align="middle" fullscreen="" width="3928" height="2210" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Carpenter ants on wooden surface </span><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Prevention is the key, so always inspect your walls and doors for any cracks or gaps for potential entryways. Seal up such gaps with caulk to prevent ants from returning.</p><p>Check that your window and door screens are correctly installed and sit flush against the frames. If not or they show signs of damage, be sure to replace these immediately.</p><p>Avoid leaving residual food and crumbs around your home, including dirty dishes in the kitchen sink. And ensure you dust and vacuum regularly to remove any crumbs which may have spilled on the floor, as the scent lures ants into your home.</p><p>Make sure pantry food is sealed in airtight containers, so ants can’t reach them. Plus,  once your pets have finished their meal, rinse out the bowl immediately so there’s no residual food here. At floor level, this is very easy to access for ants.</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/how-to/7-things-that-are-attracting-ants-to-your-home">7 things that are attracting ants to your home</a></li><li><a href="https://www.tomsguide.com/features/7-ant-repellent-plants-to-keep-your-home-pest-free">7 ant-repellent plants</a> </li><li><a href="https://www.tomsguide.com/how-to/7-things-that-attract-roaches-to-your-home-and-how-to-fix-it">Things that attract roaches to your home — and how to fix it</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Garmin Cirqa Smart Band launch: Garmin debuts a screen-free Whoop and Fitbit Air competitor ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor</link>
                                                                            <description>
                            <![CDATA[ Garmin's long-rumored Cirqa fitness tracker has finally been announced, but can it really beat the Fitbit Air or Whoop 5.0? We intend to find out. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">g3vCvQXhmaxGHpzNRyaXkL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ehLfvMLtc89egfv55WkLCQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 11:19:16 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Jul 2026 12:04:55 +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.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/ehLfvMLtc89egfv55WkLCQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Garmin]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of the Garmin Cirqa]]></media:description>                                                            <media:text><![CDATA[a photo of the Garmin Cirqa]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of the Garmin Cirqa]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ehLfvMLtc89egfv55WkLCQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Garmin's long-rumored screenless fitness tracker, the Garmin Cirqa, has finally been unveiled. Pricier than the beginner-friendly <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> but more affordable than the pro-level <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a>, the Cirqa aims to offer the best of both in a lightweight, discreet package.</p><p>We checked out the new Garmin Cirqa on launch day; find out hands-on impressions below to learn more about the cost, design, features, battery life, and outlook for the new Garmin Cirqa. </p><h3 class="article-body__section" id="section-garmin-cirqa-cheat-sheet"><span>Garmin Cirqa: Cheat sheet</span></h3><ul><li><strong>Price: </strong>$199/£179, no subscription required</li><li><strong>Design:</strong> Lightweight, screen-free fitness-tracking band</li><li><strong>Key features: </strong>Basic health and fitness tracking insights, including 24/7 heart rate tracking, Sp02, nightly sleep reports, women's health tracking</li><li><strong>Battery life</strong>: Up to 10 days</li><li><strong>Launch date:</strong> July 24, 2026</li></ul><h3 class="article-body__section" id="section-garmin-cirqa-price-and-availability"><span>Garmin Cirqa: price and availability </span></h3><p>The Garmin Cirqa fitness tracker will be available on July 24 for $199/ £179. The device is subscription-free, but for additional insights, users can optionally sign up for Garmin Connect+ for $6.99 per month or $69.99 per year.</p><p>By comparison, the Fitbit Air is just $99 and also subscription-optional. The Whoop 5.0, meanwhile, ranges from $199, $239, or $359 per year depending on your membership tier. However, the device itself is free. </p><h3 class="article-body__section" id="section-garmin-cirqa-design"><span>Garmin Cirqa: Design</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:2200px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="Br5dC48ohmoX2Pe36DuP4e" name="CIRQA_Smart_Band_Photo" alt="a photo of the Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/Br5dC48ohmoX2Pe36DuP4e.jpg" mos="" align="middle" fullscreen="" width="2200" height="1237" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Garmin)</span></figcaption></figure><p>The Garmin Cirqa looks a whole lot like the Whoop 5.0, a design choice I can only assume was intentional. Users can choose between four band colors, including Black, Captain Blue, Mauve, and French Gray. </p><p><a href="https://www.garmin.com/en-US/p/1970320/pn/010-14472-00/" target="_blank" rel="nofollow">Additional bands</a> are available at $49.99/$59.99, depending on whether you want to wear the band around your wrist or upper arm, and include three additional colors: Citron Gray, Dark Olive, and French Blue.</p><p>The device comes in two sizes, small/medium and large/extra large. </p><p>The tracker itself is held securely within the fabric loop with no screen and just a single button on the side.</p><h3 class="article-body__section" id="section-garmin-cirqa-health-and-fitness"><span>Garmin Cirqa: Health and fitness </span></h3><p>The Garmin Cirqa sports the brand's Elevate V4 sensor, which is one generation out from the latest/greatest. Onboard health tools include 24/7 heart rate tracking, Sp02 readings, body temperature monitoring, and women's health tracking. </p><p>Like the<a href="https://www.tomsguide.com/best-picks/best-garmin-watch"> best Garmin watches </a>in 2026, the Cirqa provides detailed nightly sleep reports and can automatically track a range of common workout types.  </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:5547px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hNj2VkC65xdUAHProcSZ2o" name="CIRQA_Smart_Band_HERO_1" alt="a photo of the Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/hNj2VkC65xdUAHProcSZ2o.jpg" mos="" align="middle" fullscreen="" width="5547" height="3120" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Garmin)</span></figcaption></figure><h3 class="article-body__section" id="section-garmin-cirqa-battery"><span>Garmin Cirqa: Battery</span></h3><p>Battery life for the Cirqa is rated at up to 10 days.</p><p>By comparison, the Fitbit Air lasts right around one week per charge, while the Whoop 5.0 is good for closer to two weeks per charge. </p><h3 class="article-body__section" id="section-garmin-cirqa-vs-whoop-vs-fitbit-air"><span>Garmin Cirqa vs Whoop vs Fitbit Air</span></h3><p>Like any screen-free wearable, whether we're talking about the <a href="https://www.tomsguide.com/wellness/fitness-trackers/best-smart-rings">best smart rings</a> or the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a>/bands, the companion app can make or break the overall experience. With that in mind, the Garmin Connect app is comprehensive enough, though for first-time users, insights can feel a bit scattered and overwhelming. </p><p>Ultimately, I look forward to testing the new Garmin Cirqa head-to-head versus both the $99 Fitbit Air and higher-end Whoop 5.0. If it can offer just a little more, holistic-insight-wise, than the Fitbit Air, then it very well may be worth the extra $100.</p><p>Stay tuned for my full Garmin Cirqa review.</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/fitness-trackers/ive-tested-over-100-fitness-trackers-head-to-head-3-workout-stats-i-trust-the-least">I’ve tested over 100 fitness trackers head-to-head — 3 workout stats I trust the least</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/3-reasons-why-google-should-make-an-oura-ring-alternative">It's time for a Fitbit Ring — 3 reasons why Google should make an Oura Ring alternative</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iOS 27 beta 4 is now here — all the newest features for your iPhone ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/ios-27-beta-4-is-now-here-all-the-newest-features-for-your-iphone</link>
                                                                            <description>
                            <![CDATA[ iOS 27 beta 4 just landed for developers, and with it comes a bunch of new upgrades and improvements. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pWyN95qD84sRSYmrfi7NnA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 10:31:44 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <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/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Apple/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:description>                                                            <media:text><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:text>
                                <media:title type="plain"><![CDATA[iOS 27 icon shown on an iPhone screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/K5SQbjBSv85JzgqYxoY5Lm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Following the launch of the <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-is-now-live-9-features-you-need-to-try-first">iOS 27 public beta early last week</a>, the fourth iteration of the developer beta is now rolling out as well. Since the developer beta is slightly ahead of the public option, this means there are a bunch of new features coming to those of you that signed up. </p><p>This update isn't particularly extravagant — offering a few small upgrades and fixes rather than a bunch of new features. However, the changes are important quality of life updates, which should improve your overall iOS 27 experience — either as a beta tester or once the official version lands later this year.</p><p>Here's what's changed in iOS 27 beta 4.</p><h2 id="new-features-in-ios-27-beta-4">New features in iOS 27 beta 4</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="WQiLV7FvGzBjapgcdgpeCB" name="siri" alt="ios 27 beta 4 new features" src="https://cdn.mos.cms.futurecdn.net/WQiLV7FvGzBjapgcdgpeCB.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>Changes have come to Siri, with the most noticeable update being a new "splash screen" that appears when you summon the AI from either the Dynamic Island or your home screen. This features a little more information about the "<a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">All-New Siri</a>" and gives a brief explainer for those users who may not be familiar with what the changes to Siri mean.</p><p>The recent apps menu in the pull-down menu has also been fixed with this new update, with the app options no longer appearing grayed 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="vuAjrwfwe4xsygnWLcAN6B" name="siri2" alt="ios 27 beta 4 new features" src="https://cdn.mos.cms.futurecdn.net/vuAjrwfwe4xsygnWLcAN6B.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p><a href="https://www.tomsguide.com/phones/iphones/the-robot-voice-is-gone-how-to-make-siri-sound-truly-human-in-ios-27">Siri's Expressive Voice </a>feature has been drip feeding us updates over the course of multiple beta updates. <a href="https://www.tomsguide.com/phones/iphones/ios-27-beta-3-just-landed-siri-expressive-voices-live-recognition-apple-intelligence-at-home-and-more">Beta 3</a> added the ability to change the pace and expressiveness for two distinct voices. iOS 27 beta 4 adds new voices and an array of new English-language accents that you can choose from. However, the customization options are still limited to those original two American accents for the time being.</p><p>Siri's settings now include a feature to adjust the length of previews in the Siri app too. This lets you pick anywhere between zero lines of preview and five.</p><p>The Control Center now supports the <a href="https://www.tomsguide.com/audio/airpods/ios-27-beta-3-adds-a-clever-new-control-for-airpods-adaptive-mode">AirPods Pro adaptive mode slider</a>, which was introduced in iOS 27 beta 3. This means you can alter the level of ANC and transparency on your <a href="https://www.tomsguide.com/reviews/airpods-pro-2-review">AirPods Pro 2</a>, <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">Pro 3</a> or <a href="https://www.tomsguide.com/audio/earbuds/apple-airpods-4-review">AirPods 4</a> without necessarily having to go into the AirPods app first.</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="vLg9yDtgtd9qpxoHUoVqCB" name="ios3" alt="ios 27 beta 4 new features" src="https://cdn.mos.cms.futurecdn.net/vLg9yDtgtd9qpxoHUoVqCB.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p><a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV </a>app now includes a toggle that will set Apple TV to automatically download upcoming episodes of your favorite streaming shows. So long as the show is in your "Continue Watching" list, Apple TV will automatically download the next two episodes, and automatically delete old ones once you've finished watching. </p><p>Simply head to <strong>Settings > Apps > TV > Automatic Downloads</strong>. It's a quick process, and means it should be a lot harder to find yourself caught out with no new episodes to watch offline.</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="ikZKBrfMNL8ATVwBrozMAB" name="ios2" alt="ios 27 beta 4 new features" src="https://cdn.mos.cms.futurecdn.net/ikZKBrfMNL8ATVwBrozMAB.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>Other smaller inclusions include a new "Zoom Photos to Fill" toggle in Apple Photos, which automatically fits your photos to match your screen's aspect ratio. The camera app now has an option for ProRes log Format if ProRes is switched on, while Wi-Fi settings give you the choice to turn off Connectivity Assist for individual Wi-Fi networks.</p><p>Sadly Apple has also removed the wallpaper preview in the Notification Center, which lets you see a cutout of your wallpaper's subject as you're swiping down. It's unclear why, but I'd guess that it was probably a bug that wasn't supposed to be there.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/your-iphone-messages-app-has-a-real-time-translation-feature-heres-how-to-use-it">Your iPhone Messages app has a real-time translation feature — here's how to use it</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-to-watch-summer-galaxy-unpacked-2026-galaxy-z-fold-8-fold-8-ultra-flip-8-and-more">How to watch Summer Galaxy Unpacked 2026 — Galaxy Z Fold 8, Fold 8 Ultra, Flip 8 and more</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/massive-samsung-leak-reveals-official-galaxy-z-fold-8-fold-8-ultra-and-flip-8-images-ahead-of-unpacked">Massive Samsung leak reveals official Galaxy Z Fold 8, Fold 8 Ultra, and Flip 8 images ahead of Unpacked</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Wicked: For Good' just landed on Netflix — but these 3 musicals are even better ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/netflix/wicked-for-good-just-landed-on-netflix-but-these-3-musicals-are-even-better</link>
                                                                            <description>
                            <![CDATA[ 'Wicked: For Good' just landed on Netflix, but you should watch these 3 musicals on Netflix instead that are much better. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">RhGXKosF3xHuhGJwbYidR9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VEPeq6ktkPRvBoNFHnRNmn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Netflix]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &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/VEPeq6ktkPRvBoNFHnRNmn-1280-80.jpg">
                                                            <media:credit><![CDATA[Universal Pictures]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(L-R) Cynthia Erivo as Elphaba Thropp and Ariana Grande as Glinda Upland in &quot;Wicked: For Good&quot;]]></media:description>                                                            <media:text><![CDATA[(L-R) Cynthia Erivo as Elphaba Thropp and Ariana Grande as Glinda Upland in &quot;Wicked: For Good&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[(L-R) Cynthia Erivo as Elphaba Thropp and Ariana Grande as Glinda Upland in &quot;Wicked: For Good&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VEPeq6ktkPRvBoNFHnRNmn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's been an unusually rough year for movie musicals, with Paul Rudd and Nick Jonas' "Power Ballad" and the live-action "Moana" both bombing at the box office. There's a glimmer of respite this week with John M. Chu’s 2025 movie adaptation of the Broadway musical, <a href="https://www.tomsguide.com/entertainment/movies/wicked-for-good-review">"Wicked: For Good,"</a> landing on Netflix on July 20. But let's be real: All the best songs are in the first half of "Wicked," and "For Good" was always going to be stuck playing second fiddle. </p><p>That's reflected on Rotten Tomatoes, where "Wicked" (which you can catch on Peacock) earned an 88% critics score while "For Good" drags behind at 66%. However, it's worth noting that both have comparable audience scores: 95% and 92%, respectively. There are plenty of better musicals to be found on Netflix, if you ask me, so I figured now was the perfect time to shout them out. </p><p>If you’re looking for something to sing along to, tap your feet to, or maybe just something to lift your mood in these dark times, here are the best musicals on Netflix to watch right now. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="merrily-we-roll-along-2025">'Merrily We Roll Along' (2025)</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/Ams0ROhWX0w" allowfullscreen></iframe></div></div><p>In my perfect world, all hit Broadway musicals would get the "Hamilton" treatment and eventually make their way to streaming, but until that glorious day, I never tire of getting an excuse to shout out the rare few that do. Directed by Maria Friedman, the acclaimed Broadway revival of “Merrily We Roll Along” stars Jonathan Groff, Daniel Radcliffe, and Lindsay Mendez and won four Tony Awards. </p><p>Spanning three decades, “Merrily We Roll Along” follows composer Franklin Shepard (Groff), writer Mary (Mendez), and lyricist Charley (Radcliffe), a trio of friends whose relationship is put to the test over the years. Originally debuting in 1981, the musical is considered to be among Stephen Sondheim’s finest works. A film adaptation that's been in the works for over two decades is currently in the works, but until it arrives (sometime around 2040), this version is more than worthy of your time.</p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/82719754" target="_blank" rel="nofollow"><em><strong>"Merrily We Roll Along" on Netflix</strong></em></a><em><strong> now</strong></em></p><h2 id="matilda-the-musical-2022">'Matilda: The Musical' (2022)</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/mEEMbNS6fzY" allowfullscreen></iframe></div></div><p>As much nostalgia as I have for Danny DeVito’s 1996 "Matilda" adaptation, the 2022 musical version, based on the hit stage production, is somehow even better. Alisha Weir shines as Matilda, a precocious young girl with telekinetic powers who feels completely out of place in her neglectful family. After she's sent to a dreary school ruled by the terrifying tyrant Miss Trunchbull (Emma Thompson), Matilda inspires her classmates to revolt with the help of the kind-hearted Miss Honey (Lashana Lynch).</p><p>Featuring a score packed with catchy, uplifting songs by Tim Minchin, "Matilda the Musical" bursts with energy thanks to Matthew Warchus' direction. Returning after helming the stage production, Warchus preserves the darker edge and mischievous spirit of Dahl's beloved story while delivering a colorful, crowd-pleasing musical that's just as enchanting for adults as it is for younger viewers.</p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/80993016"><em><strong>"Matilda: The Musical" on Netflix</strong></em></a><em><strong> now</strong></em></p><h2 id="the-portrait-2017">'The Portrait' (2017)</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/Prt1xJw5myA" allowfullscreen></iframe></div></div><p>I adore a movie musical adaptation that goes all out, and "The Portrait" does just that, embracing the spirit of Golden Age Hollywood. Set in the Philippines on the brink of World War II, it's a sweeping musical drama that follows two unmarried, broke sisters (Joanna Ampil and Rachel Alejandro) who face desperate times after their father, a celebrated painter and party host, can no longer work. </p><p>To pay the bills, they take in a shady lodger Tony Javier (Paulo Avelino) and hope that their father's final masterpiece may be the answers to their troubles. Ampil and Alejandro deliver powerful performances as the sisters, whose conviction is put to the test as they cling to the belief that their father's portrait is worth far more than any fortune it could fetch. Clearly made with utmost dedication and care, "The Portrait" impresses with its meticulous production design and polished technical craftsmanship, making every frame feel larger than life. </p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/81684754" target="_blank" rel="nofollow"><em><strong>"The Portrait" on Netflix</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ey6xaW"></div>                            </div>                            <script src="https://kwizly.com/embed/ey6xaW.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/entertainment/netflix/netflix-has-racked-up-17-no-1-movies-in-2026-so-far-but-only-these-5-are-worth-watching">Netflix has racked up 17 No. 1 movies in 2026 (so far) — but only these 5 are worth watching</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-july-20-26-2026">5 best new Netflix movies and shows to stream this week (July 20-26)</a></li><li><a href="https://proof.vanilla.tools/tomsguide/articles/edit/SfaLU8dJs8uuMANuFwCJUb" target="_blank">'The Odyssey’ is the best movie of 2026 so far — and maybe topples my favorite Christopher Nolan film</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch Summer Galaxy Unpacked 2026 — Galaxy Z Fold 8, Fold 8 Ultra, Flip 8 and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/samsung-phones/how-to-watch-summer-galaxy-unpacked-2026-galaxy-z-fold-8-fold-8-ultra-flip-8-and-more</link>
                                                                            <description>
                            <![CDATA[ Samsung Galaxy Unpacked is happening this week, and here's all the information you need to tune in and watch the show live. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uvVs6iqRwuvQFhUsKFcnsa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Uvf5TfFqyifwQ8gsY3myx6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 06:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 22 Jul 2026 11:33:40 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <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/Uvf5TfFqyifwQ8gsY3myx6-1280-80.jpg">
                                                            <media:credit><![CDATA[Credit: Samsung/OnLeaks/Android Headlines/Tom&#039;s Guide/Android Police]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Unpacked 2026]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Unpacked 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Unpacked 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Uvf5TfFqyifwQ8gsY3myx6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><em><strong>Update</strong></em><em>: Follow our </em><a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live" target="_blank"><em>Samsung Galaxy Unpacked live blog</em></a><em> for all the big Galaxy Z Fold 8 news</em>. </p><p>The summer edition of <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-unpacked-2026-preview-galaxy-z-fold-8-z-flip-8-intelligent-eyewear-and-more">Samsung Galaxy Unpacked</a> is almost here, and with it we're expecting to see the next generation of Galaxy Foldables — as well as news about new wearable devices. This year's foldable launch is happening in London, which means it's all going to kick off a little earlier in the day than expected.</p><p>Thankfully, though, there are a variety of different ways to keep up to date with the show — and catch all the announcements as they happen. Not only will we at Tom's Guide be on the ground at Unpacked in London, we'll also be live blogging the entire event as it unfolds.</p><p>If you want to follow along, here's how you can tune in to Galaxy Unpacked to watch everything unfold live.</p><h3 class="article-body__section" id="section-where-can-you-watch-the-galaxy-unpacked-live-stream"><span>Where can you watch the Galaxy Unpacked live stream?</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/Nul7mPL7Nt4" allowfullscreen></iframe></div></div><p>Summer Galaxy Unpacked 2026 is scheduled to take place on Wednesday July 22, with the event officially kicking off at 2 p.m. BST / 9 a.m. ET / 6 a.m. PT. </p><p>The easiest place to watch is via the live stream on<a href="https://www.youtube.com/watch?v=Nul7mPL7Nt4" target="_blank"> Samsung's YouTube channel</a> which we've embedded above. You should also be able to tune in via <a href="http://samsung.com" target="_blank" rel="nofollow">Samsung.com</a> and <a href="https://news.samsung.com/global/" target="_blank" rel="nofollow">Samsung Newsroom</a>, if you want an alternative option.</p><h3 class="article-body__section" id="section-what-to-expect-at-summer-galaxy-unpacked-2026"><span>What to expect at Summer Galaxy Unpacked 2026 </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="989hWAcHVdATC3CykCG473" name="static official release (horizontal 16x9)_1920x1080_WITH text" alt="Samsung Galaxy Unpacked July 2026" src="https://cdn.mos.cms.futurecdn.net/989hWAcHVdATC3CykCG473.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>The main thing to expect at the next Galaxy Unpacked are the new Galaxy foldables, and this year Samsung is expected to mix things up by announcing three new models. So rather than seeing the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-everything-you-need-to-know-about-the-new-wider-foldable">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-everything-we-know-so-far">Z Flip 8</a>, we're expecting to see the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-8-ultra-how-samsungs-next-foldable-could-square-up-with-the-iphone-fold">Galaxy Z Fold 8 Ultra</a> as well.</p><div class="product"><a data-dimension112="47fb5fcc-847d-11f1-a878-8f388cfbcff2" data-action="Deal Block" data-label="You can reserve a new Galaxy Z8 foldable device to receive a $30 Samsung credit during the pre-order windows up to $1,230 in savings. You can also enter a sweepstakes for a chance to win one of 10 $500 Samsung.com gift cards." data-dimension48="You can reserve a new Galaxy Z8 foldable device to receive a $30 Samsung credit during the pre-order windows up to $1,230 in savings. You can also enter a sweepstakes for a chance to win one of 10 $500 Samsung.com gift cards." data-dimension25="$" href="https://www.samsung.com/us/smartphones/the-next-galaxy/reserve/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1731px;"><p class="vanilla-image-block" style="padding-top:87.41%;"><img id="sdADwvvhPbZLgf6c5tWNmQ" name="Screenshot 2026-07-15 104549" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/sdADwvvhPbZLgf6c5tWNmQ.png" mos="" align="middle" fullscreen="" width="1731" height="1513" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>You can reserve a new Galaxy Z8 foldable device to receive a $30 Samsung credit during the pre-order windows up to $1,230 in savings. You can also enter a sweepstakes for a chance to win one of 10 $500 Samsung.com gift cards.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/the-next-galaxy/reserve/" target="_blank" rel="nofollow" data-dimension112="47fb5fcc-847d-11f1-a878-8f388cfbcff2" data-action="Deal Block" data-label="You can reserve a new Galaxy Z8 foldable device to receive a $30 Samsung credit during the pre-order windows up to $1,230 in savings. You can also enter a sweepstakes for a chance to win one of 10 $500 Samsung.com gift cards." data-dimension48="You can reserve a new Galaxy Z8 foldable device to receive a $30 Samsung credit during the pre-order windows up to $1,230 in savings. You can also enter a sweepstakes for a chance to win one of 10 $500 Samsung.com gift cards." data-dimension25="$">View Deal</a></p></div><p>But the big twist is that the Z Fold 8 Ultra is expected to be the successor to the Galaxy Z Fold 7, while the standard Z Fold 8 is a new foldable with a shorter and wider design. It was originally referred to as the Galaxy Fold Wide for a reason.</p><p>The Galaxy Z Flip 8 is expected to be exactly what we expected, with the added possibility of it being the last Samsung flip phone for the immediate future. </p><p>We should also expect to see updated wearables with the reveal of <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-9-and-ultra-2-rumors-everything-weve-heard-so-far">Galaxy Watch 9</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-rumors-heres-everything-we-expect-from-samsungs-next-gen-rugged-smartwatch">Galaxy Watch Ultra 2</a>, alongside more news about Samsung's Galaxy Glasses — which were announced as <a href="https://www.tomsguide.com/computing/smart-glasses/i-tested-googles-intelligent-eyewear-and-found-the-smart-glasses-that-will-defeat-ray-ban-meta">Intelligent Eyewear</a> at <a href="https://www.tomsguide.com/news/live/google-io-2026-live-news-updates">Google I/O</a> back in May. We've heard rumors that Samsung is also working on a new version of its Galaxy Tag Bluetooth tracker, but it's unclear whether that will be appearing at Unpacked or if it's coming at a later date.</p><p>Finally there's One UI 9.5, which is likely to debut on the new foldables. Details on the new software are scant right now, but you can expect to see plenty of foldable-centric optimizations and possibly even some AI upgrades. So expect to hear all about that during the Unpacked event.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-pre-order-deals"><span>Galaxy Z Fold 8 pre-order deals</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:696px;"><p class="vanilla-image-block" style="padding-top:56.61%;"><img id="hMBysPJZniSW3QEz4fLz5R" name="Screenshot 2026-07-20 105328" alt="samsung foldable 2026 leaked marketing materials" src="https://cdn.mos.cms.futurecdn.net/hMBysPJZniSW3QEz4fLz5R.png" mos="" align="middle" fullscreen="" width="696" height="394" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass)</span></figcaption></figure><p>Galaxy Unpacked may not have happened yet, but there are already some early pre-order deals out there for you to take advantage of, if you don't want to wait for an official announcement. </p><p>Samsung is offering buyers the chance to "reserve" a new Galaxy foldable <a href="https://www.samsung.com/us/smartphones/the-next-galaxy/reserve/" target="_blank" rel="nofollow">on its website</a>, which will net you $30 credit on your eventual pre-order and up to $1,230 in trade-in savings. Those of you that sign up will also be entered into a prize draw to win one of 10 $500 Samsung gift cards. </p><p>This is a limited time deal, though, and the offer ends as soon as Galaxy Unpacked begins on Wednesday morning. It's also worth noting that you're not going to be forced to pre-order the phone if you change your mind, or decide that one of the new foldables isn't for you. So if there's even a small chance you might buy one of the new foldables, it just makes sense to sign up.</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/samsung-phones/samsung-galaxy-z-fold-8-wide-vs-fold-8-ultra-heres-the-foldable-im-most-excited-for">Samsung Galaxy Z Fold 8 (Wide) vs Fold 8 Ultra — here's the foldable I'm most excited for</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/massive-samsung-leak-reveals-official-galaxy-z-fold-8-fold-8-ultra-and-flip-8-images-ahead-of-unpacked">Massive Samsung leak reveals official Galaxy Z Fold 8, Fold 8 Ultra, and Flip 8 images ahead of Unpacked</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/im-not-convinced-crease-free-foldables-like-the-galaxy-z-fold-8-actually-matter-prove-me-wrong">I’m not convinced crease-free foldables like the Galaxy Z Fold 8 actually matter. Prove me wrong.</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 10 top new movies to stream this week on Netflix, HBO Max, Prime Video, Hulu and more (July 21-27) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/movies/10-top-new-movies-to-stream-this-week-on-netflix-hbo-max-prime-video-hulu-and-more-july-21-27</link>
                                                                            <description>
                            <![CDATA[ This week's top new movies across the best streaming services include "The Mandalorian" movie, the new "Scary Movie," and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fnMHBj6ZCUQV5F5ohfgA3M</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2BBxi4XKw9kzPB8ePSZPYZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Jul 2026 12:13:27 +0000</updated>
                                                                                                                                            <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.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/2BBxi4XKw9kzPB8ePSZPYZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Universal Pictures; Lucasfilm; Amazon MGM Studios]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:description>                                                            <media:text><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:text>
                                <media:title type="plain"><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2BBxi4XKw9kzPB8ePSZPYZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week’s crop of new movies across the biggest <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> is one of the most packed of the year to date. There are new arrivals on popular platforms like Netflix, HBO Max, Hulu, Apple TV and Peacock. There's also a handful of buzzy newcomers on premium streaming.</p><p>With so much choice, picking a highlight is no easy feat. Star Wars fans will likely flock to the PVOD debut of “The Mandalorian and Grogu,” while anybody looking for a different kind of sci-fi should consider Spielberg’s “Disclosure Day.” Alternatively, Netflix has a new Kevin Hart comedy, HBO Max has a fantasy action sequel, and Hulu has a feature film based on a cult web series that is one of the funniest movies I’ve watched in 2026.   </p><p>You’re really spoilt for choice, so I’ve combed through all the most noteworthy new movies on streaming this week and picked out the ones you need to know about. For more recommendations, check out the <a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-usd150-million-disaster-movie-about-the-moon-falling-out-of-orbit-july-21-27">3 new to Prime Video thriller movies to stream this week</a>.<strong> </strong>And if binge-watching is more your speed, here’s a guide to all the <a href="https://www.tomsguide.com/entertainment/streaming/4-biggest-new-shows-to-stream-this-week-july-20-26">top new TV shows this week.</a> </p><h2 id="star-wars-the-mandalorian-and-grogu-pvod">‘Star Wars: The Mandalorian and Grogu’ (PVOD)</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/IHWlvwu8t1w" allowfullscreen></iframe></div></div><p>The first theatrical-released Star Wars movie in seven years swaps the big screen for streaming this week, and it feels particularly appropriate in the case of “The Mandalorian and Grogu.” This feature-length continuation of Disney+’s “The Mandalorian” was criticized for failing to go beyond its TV roots. Instead, the movie feels a whole lot like a handful of episodes stitched together, so if you skipped it in cinemas, it’ll feel right at home on digital.</p><p>Set between the original and sequel trilogies, “The Mandalorian and Grogu” focuses on the eponymous pair, bounty hunter Din Djarin (Pedro Pascal) and his young ward, Grogu (aka Baby Yoda). The New Republic enlists the duo to rescue Rotta (Jeremy Allen White), the son of former crime boss Jabba the Hutt. While it might not feel grand enough to justify its big-screen release, Grogu’s adorability factor is ramped up to a new level.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/Star-Wars-Mandalorian-Jon-Favreau/dp/B0H4C719BN/" target="_blank" rel="nofollow"><em><strong>Prime Video (Buy/rent)</strong></em></a><em><strong> starting July 21</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Oomqve"></div>                            </div>                            <script src="https://kwizly.com/embed/Oomqve.js" async></script><h2 id="disclosure-day-pvod">‘Disclosure Day’ (PVOD)</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/SCYT8vb2siQ" allowfullscreen></iframe></div></div><p>Steven Spielberg made his return to the sci-fi genre with “Disclosure Day.” It’s not quite vintage Spielberg, but it tackles some interesting themes and boasts a career-highlight performance from Emily Blunt. I suspect some viewers will find the rushed conclusion disappointing, and there are some contrived narrative decisions, but it’s still a Spielberg movie, full of wonder and unspooling mystery. And it’s great to see him back in the sci-fi genre. </p><p>Blunt plays Margaret Fairchild, a television meteorologist who discovers she possesses psychic abilities. This leads her to link up with Dr. Daniel Kellner (Josh O’Connor), a cybersecurity expert who has turned whistleblower against his employer, the Wardex Corporation. As the duo is hunted by the shadowy organization (led by Colin Firth’s Noah Scanlon), they discover a government-led cover-up of classified extraterrestrial activity, which all links back to a forgotten event in Margaret and Daniel’s childhood. </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H3QRLYCN" target="_blank" rel="nofollow"><em><strong>Prime Video (Buy/rent)</strong></em></a><em><strong> starting July 21</strong></em></p><h2 id="scary-movie-pvod">‘Scary Movie’ (PVOD)</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/0fZ58S-7QP0" allowfullscreen></iframe></div></div><p>In this era of horror remakes, reboots and legacy sequels, it was only a matter of time before “Scary Movie” was revived to lampoon the current genre trends. This sixth installment in the parody series (named “Scary Movie” as a nod to horror sequels often removing the numeral) marks the return of the Wayans, who originally exited the franchise after 2001’s “Scary Movie 2.” It also sees original stars Anna Faris and Regina Hall return, too.</p><p>Mocking everything from “Weapons,” “The Substance,” and “Sinners,” to the series’ favorite punching bag, “Scream," 2026's “Scary Movie” hasn’t matured with age. It trades in the same slapstick, juvenile, incredibly low-brow humor it built its reputation on. Long-time fans might enjoy this revival, but the jokes feel tired, and the attempts at parody lazy. The comedic intellect doesn’t extend beyond the gags found in your average “Family Guy” skit.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXSXHLFV" target="_blank" rel="nofollow"><em><strong>Prime Video (Buy/rent)</strong></em></a><em><strong> starting July 21</strong></em></p><h2 id="masters-of-the-universe-prime-video">‘Masters of the Universe’ (Prime Video)</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/X21JsHLHnY8" allowfullscreen></iframe></div></div><p>The new “Masters of the Universe” movie appears to be skipping the typical digital release window. Instead, this He-Man blockbuster is dropping straight onto Prime Video this week. Maybe that’s because it struggled in theaters, grossing a mere $113 million against a production budget reportedly close to $200 million. It would seem Amazon is hoping the MGM Studios-distributed movie can score a larger audience via its own streaming service. </p><p>Based on the ‘80s franchise of the same name, which Mattel launched to compete with rival Kenner’s range of Star Wars toys, “Masters of the Universe” is set in the land of Eternia. When the capital city is besieged by the evil Skeletor (Jared Leto), young Prince Adam (Nicholas Galitzine) is sent to Earth for his protection. Years later, and now an adult, he must return to his fantasy home and embrace his destiny as He-Man to save the kingdom. </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GZHXDRBN" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> starting July 22</strong></em></p><h2 id="72-hours-netflix">‘72 Hours’ (Netflix)</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/N-J-HR3quc4" allowfullscreen></iframe></div></div><p>Netflix is dropping a steady stream of original movies throughout the summer to keep you entertained and indoors. Its latest offering comes in the form of “72 Hours,” a Kevin Hart vehicle that sees the veteran comic actor play a 40-something executive trying (and seemingly failing) to hang with a younger crowd. Questions of its quality remain, but I have an inkling that it’s going to make a major play for the top spot in Netflix’s top 10 list.</p><p>Joe (Hart) is a middle-aged executive desperately hoping to save his flailing career when he’s accidentally added to the group chat of a group of 20-year-olds (Marcello Hernández, Mason Gooding, Kam Patterson, Ben Marshall). Soon he finds himself joining them on a wild multi-day bachelor party. As things get crazy, Joe might just rediscover his youthful spirit.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81715790" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="the-dink-apple-tv">‘The Dink’ (Apple TV)</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/YyVNFzx5Pl8" allowfullscreen></iframe></div></div><p>Sports comedies seem to be on trend right now. Last week Netflix dropped “The Hawk” with Will Ferrell, a series about a washed-up golfer trying to revive his career, and now it’s Apple TV’s turn to release a sports-themed comedy about a washed-up pro trying to savage his reputation and claw back the respect of his peers. Only in “The Dink,” Jake Johnson’s Dusty Boyd isn’t returning to the tennis court, but instead is picking up pickleball. </p><p>After aggravating an old injury, former prodigy Dusty swaps tennis for pickleball, and along the way rediscovers his competitive spark while rising in the ranks of a sport he never took seriously. Dusty hopes to earn his father’s (Ed Harris) respect, prevent the local country club from closing, and best his old childhood rival, Andy Roddick. Also starring Mary Steenburgen, Patton Oswalt and Ben Stiller, “The Dink” is for the underdog in all of us.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="mortal-kombat-ii-hbo-max">‘Mortal Kombat II’ (HBO Max)</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/ZdC5mFHPldg" allowfullscreen></iframe></div></div><p>This fantasy action sequel based on the video series of the same name has its fair share of flaws. Its screenplay is muddled, the characters thinly sketched, and despite an $80 million budget, the extensive use of green screens is all too obvious. However, it gets the most essential component right: the gloriously gory fights. “Mortal Kombat II” delivers when it comes to well-choreographed showdowns between its roster of fan-favorite characters, and that makes several of its more egregious filmmaking sins a whole lot easier to forgive. </p><p>Ahead of the 10th Mortal Kombat tournament, in which the merciless Shao Kahn (Martyn Ford) is hoping to capture and take control of Earthrealm, the defenders of our planet recruit washed-up actor Johnny Cage (Karl Urban) to join their plucky ranks. What follows is a series of death matches in which the fate of our world is at stake. Stuffed with fan-favorite characters and references to Mortal Kombat lore, this sequel delivers when it matters most.</p><p><em><strong>Watch on </strong></em><a href="https://www.hbomax.com/movies/mortal-kombat-ii/c6b2cd04-09b3-4e4c-b3aa-36569ea18289" target="_blank" rel="nofollow"><em><strong>HBO Max</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="nirvanna-the-band-the-show-the-movie-hulu">‘Nirvanna the Band the Show the Movie’ (Hulu)</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/kuEZYJ7qfb4" allowfullscreen></iframe></div></div><p>I went into “Nirvanna the Band the Show the Movie” without having seen even a clip from the original web series and television mockumentary on which this feature film is based. The fact that I still found it an absolute hoot speaks to its comedic quality. I can only imagine long-time fans of irreverent hijinks of leads Matt (Matt Johnson) and Jay (Jay McCarrol) will be even more impressed by this big-screen translation. </p><p>Quickly getting newcomers up to speed, “Nirvanna the Band the Show the Movie” follows Matt and Jay’s ongoing quest to play a show at the Rivoli bar in Toronto. Their madcap plans to book a slot always seem to backfire, but when their latest hare-brained scheme results in them accidentally traveling back to the year 2008, they discover what their lives would have been like if they’d gone their separate ways. This film is gloriously silly.</p><p><em><strong>Watch on </strong></em><a href="https://www.hulu.com/welcome" target="_blank" rel="nofollow"><em><strong>Hulu</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="pressure-peacock">‘Pressure’ (Peacock)</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/zdM4tdLQBg0" allowfullscreen></iframe></div></div><p>Finding an original angle on World War II is tough. The historical conflict has been chronicled across movies and TV shows for decades, but “Pressure” finds an area of the war that hasn’t received significant attention until now. While it’s yet to be released in theaters in several European countries (including the U.K.), it made its Stateside bow back in May. During its theatrical run, “Pressure” scored 95% from viewers on <a href="https://www.rottentomatoes.com/m/pressure_2026" target="_blank">Rotten Tomatoes</a>. </p><p>Set 72 hours before the D-Day landings, which would ultimately turn the tide of the war, the fate of the free world hangs in the balance. It’s up to General Dwight D. Eisenhower (Brendan Fraser) and meteorologist James Stagg (Andrew Scott) to plan the invasion and determine if the weather conditions are favorable on the day in question. If Stagg’s forecast is inaccurate, it could spell disaster and cost the Allied forces dearly.</p><p><em><strong>Watch on </strong></em><a href="https://www.peacocktv.com/watch/asset/movies/pressure/19fcabe2-adf1-3484-bfa2-8a29dacb2972" target="_blank" rel="nofollow"><em><strong>Peacock</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="chum-amc">‘Chum’ (AMC+)</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/oZWDFelquX4" allowfullscreen></iframe></div></div><p>It’s the summer season, which means shark movies aplenty. We’ve already had a couple this year, and the next up is “Chum.” It appears to be another shark-themed horror-thriller that isn’t content with just forcing its cast to face the ocean’s most feared predator, adding the extra element of a human hunter to increase the tension. How successful is “Chum”? If you put stock in <a href="https://www.rottentomatoes.com/m/chum_2026" target="_blank">Rotten Tomatoes</a> ratings, the 15% score might scare you off.</p><p>Set in Malta, members of a wedding party have their celebration cut short when they encounter a bloodthirsty shark, and things only get worse when a sinister fisherman named Roy (Jim Klock) arrives on the scene with plans to use the survivors as bait (or <em>chum</em>) to capture the shark. What follows is a battle for survival against predators both in the water and on dry land. Soon secrets come to light, and loyalties are tested. It's all very standard stuff.</p><p><em><strong>Watch on </strong></em><a href="https://www.amcplus.com/movies/chum--1075277" target="_blank" rel="nofollow"><em><strong>AMC+</strong></em></a><em><strong> starting July 24</strong></em></p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></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/us/best-streaming-video-services,review-2625.html">The best streaming services in 2026 to subscribe to right now</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-in-july-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix in July 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/star-wars-movies-and-shows-how-many-can-you-name-quiz">Can you name every 'Star Wars' movie and TV show?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Card takes aim at Apple Card with way more perks and rewards — here’s what you get ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-card-takes-aim-at-apple-card-with-way-more-perks-and-rewards-heres-what-you-get</link>
                                                                            <description>
                            <![CDATA[ Samsung's new Barclays-issued Galaxy Card aims to challenge the Apple Card by offering loyalists 5% cash back on direct brand purchases and 3% on all mobile wallet transactions. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UdCBnSycFwcbMfbNXzWKSe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MrLbPpWiijKrLfn8SEAFTj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 20 Jul 2026 21:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <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/MrLbPpWiijKrLfn8SEAFTj-1280-80.jpg">
                                                            <media:credit><![CDATA[Samsung]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Card.]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Card.]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Card.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MrLbPpWiijKrLfn8SEAFTj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-unpacked-2026-preview-galaxy-z-fold-8-z-flip-8-intelligent-eyewear-and-more">Galaxy Unpacked 2026</a> set to kick off in a matter of days, you know that Samsung’s new foldable phones won’t come cheap. If you’re planning on being an early adopter of one of them, like the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-everything-you-need-to-know-about-the-new-wider-foldable">Galaxy Z Fold 8 Ultra</a>, then you might want to sign up for the <a href="https://www.samsung.com/us/apps/samsung-wallet/" target="_blank">Samsung Galaxy Card</a>.</p><p>I think Samsung's first-ever U.S. credit card, which is a Visa card issued by Barclays, is going to give the <a href="https://www.tomsguide.com/features/apple-card-italy">Apple Card</a> a run for its money. I know how a generous rewards system can entice someone to choose one credit card over another, so Samsung is making a compelling offer here.</p><p>Even though it’s designated as a Samsung Wallet-first experience that lives as a digital card on your Galaxy phone, it will also be available as a premium black metal card. One of the biggest incentives is the 5% cash rewards you get on direct Samsung purchases. </p><h2 id="samsung-galaxy-card-vs-apple-card">Samsung Galaxy Card vs. Apple Card</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy Card</strong></p></td><td  ><p><strong>Apple Card</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Annual Fee</strong></p></td><td  ><p>$0</p></td><td  ><p>$0</p></td></tr><tr><td class="firstcol " ><p><strong>Issuer</strong></p></td><td  ><p>Barclays </p></td><td  ><p>Goldman Sachs</p></td></tr><tr><td class="firstcol " ><p><strong>Card Type</strong></p></td><td  ><p>Visa</p></td><td  ><p>Mastercard</p></td></tr><tr><td class="firstcol " ><p><strong>Direct Brand Purchases</strong></p></td><td  ><p>5% cash rewards</p></td><td  ><p>3% cash rewards</p></td></tr><tr><td class="firstcol " ><p><strong>Mobile Wallet Purchases</strong></p></td><td  ><p>3% via Samsung Wallet</p></td><td  ><p>2% via Apple Pay (3% at select merchants)</p></td></tr><tr><td class="firstcol " ><p><strong>Streaming Services</strong></p></td><td  ><p>2% cash rewards</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>All Other Purchases</strong></p></td><td  ><p>1% cash rewards</p></td><td  ><p>1% cash rewards</p></td></tr><tr><td class="firstcol " ><p><strong>Sign-Up Bonus</strong></p></td><td  ><p>$200 after $2,000 spent in first 90 days</p></td><td  ><p>$75 when you spend $75 within the first 30 days</p></td></tr></tbody></table></div><p>When I look at the comparison chart between the Samsung Galaxy Card and the Apple Card, I’m instantly hooked by the sign-up bonus Samsung is offering. You’ll get <strong>$200 back in cash rewards</strong> if you spend $2,000 within the first 90 days, whereas you typically only get a smaller, $75 welcome bonus when you spend $75 within the first 30 days with the Apple Card.</p><p>"Samsung Galaxy Card is part of our ongoing vision for Samsung Wallet to deliver more connected and rewarding everyday experiences," said Woncheol Chai, EVP and Head of the Digital Wallet Team at the Mobile eXperience Business at Samsung Electronics. "Collaborating with like-minded partners, such as Barclays, is what made Samsung Galaxy Card possible. This marks yet another milestone in the evolution of Samsung Wallet and mobile payments — offering a new solution for busy users who want cash rewards whether they're running errands or purchasing the latest Galaxy devices."</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:7845px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="J82HL8F88GL2vkZr4hmcvi" name="Samsung Galaxy Card" alt="Samsung Galaxy Card." src="https://cdn.mos.cms.futurecdn.net/J82HL8F88GL2vkZr4hmcvi.jpg" mos="" align="middle" fullscreen="" width="7845" height="4413" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Another important perk you should know about is the <strong>5% cash rewards on all direct Samsung purchases</strong>. That’s huge if you intend on buying a lot of Samsung gear outside of phones, like Galaxy Watches, appliances, and TVs. By staying in the Samsung ecosystem, you earn more. In contrast, Apple maxes out at a 3% cash back reward when you buy directly from them or a few select merchants.</p><p>While both credit cards offer a baseline 1% reward on all other purchases, you get <strong>3% cash back when using the card through Samsung Wallet</strong> — beating Apple's 2% reward for standard Apple Pay transactions. These figures may sound inconsequential, but they quickly add up if you’re smart about how and where you shop.</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:6097px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="h6axTuH2RFxbuCTbWi8Swg" name="Samsung Galaxy Card" alt="Samsung Galaxy Card." src="https://cdn.mos.cms.futurecdn.net/h6axTuH2RFxbuCTbWi8Swg.jpg" mos="" align="middle" fullscreen="" width="6097" height="3430" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>The only catch right now is that Samsung hasn't gone into full detail about its complete fee structure. While there's no annual fee, the Apple Card famously prides itself on having no fees at all — including late and foreign transaction fees.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG2dLX"></div>                            </div>                            <script src="https://kwizly.com/embed/eG2dLX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-8-preorders-havent-started-yet-but-you-can-save-up-to-usd1-230-right-now-heres-how">Samsung Galaxy Z 8 preorders haven't started yet, but you can save up to $1,230 right now — here’s how</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/im-not-convinced-crease-free-foldables-like-the-galaxy-z-fold-8-actually-matter-prove-me-wrong">I’m not convinced crease-free foldables like the Galaxy Z Fold 8 actually matter. Prove me wrong.</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/every-samsung-device-from-this-months-unpacked-just-leaked-heres-your-full-look-at-the-entire-lineup">Every Samsung device from this month's Unpacked just leaked — here's your full look at the entire lineup</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I put ChatGPT to the test after a new study revealed how AI tricks our brains ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/i-put-chatgpt-to-the-test-after-a-new-study-revealed-how-ai-tricks-our-brains</link>
                                                                            <description>
                            <![CDATA[ A new AI study reveals a disturbing habit: relying on AI makes us stop saying "I don't know." Here’s what happened when I put ChatGPT to the test ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ejkimHR6wJHNYb8imdjqEo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/kyiaDFYXqipaNP4YmxH3MU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 20 Jul 2026 20:14:22 +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.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/kyiaDFYXqipaNP4YmxH3MU-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[ChatGPT running on an iPhone]]></media:description>                                                            <media:text><![CDATA[ChatGPT running on an iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[ChatGPT running on an iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/kyiaDFYXqipaNP4YmxH3MU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Most of us know <a href="https://www.tomsguide.com/ai/study-finds-chatgpt-5-is-wrong-about-1-in-4-times-heres-the-reason-why">ChatGPT isn't perfect</a>. It can <a href="https://www.tomsguide.com/ai/chatgpt/openai-is-teaching-ai-models-to-confess-when-they-hallucinate-heres-what-that-actually-means">hallucinate facts</a>, confidently invent citations and occasionally give completely incorrect answers. But a new study made me wonder whether the bigger problem isn't what AI gets wrong, but how AI might be changing about us as critical thinkers. </p><p>Researchers found that when people relied on an AI assistant for difficult questions, they became far less likely to admit they didn't know the answer. Even more surprising, they grew much more confident in their responses, even when the AI led them straight into an error.</p><p>That hit a little too close to home. I use ChatGPT all the time as a brainstorming partner, research assistant and sounding board. So, I decided to recreate the experiment myself to see whether I had quietly fallen into the same habit.</p><p>The results weren't exactly what I expected.</p><h2 id="what-the-study-found">What the study found </h2><p><a href="https://www.tomsguide.com/ai/chatgpt/openai-is-teaching-ai-models-to-confess-when-they-hallucinate-heres-what-that-actually-means" target="_blank">Researchers from Carnegie Mellon University and Microsoft Research</a> designed an experiment around a simple question: What happens when people consult AI instead of relying on their own judgment?</p><p>To find out, they intentionally used questions that the AI was likely to answer incorrectly. Participants could choose one of three options:</p><p><strong>Answer on their own</strong></p><p><strong>Ask the AI for help</strong></p><p><strong>Say, "I don't know"</strong></p><p>Without AI, participants admitted they didn't know the answer nearly half the time. Once AI entered the picture, that changed dramatically.</p><p>Instead of saying "I don't know," most participants accepted the AI's suggestion — even when it was wrong. Their confidence increased sharply, but their actual accuracy stagnated. Humans were simply becoming confidently incorrect.</p><p>The researchers argue that this points to automation bias: our tendency to trust computer-generated recommendations simply because they're presented confidently.</p><p>This study suggests that a polished, authoritative answer can make us feel more certain than the evidence warrants.</p><h2 id="i-decided-to-try-it-myself">I decided to try it myself </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="bKFP8hqjq6Ffy53Rqzkfrd" name="8 - 2026-07-20T160107.814" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/bKFP8hqjq6Ffy53Rqzkfrd.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>Rather than recreate the exact academic experiment, I came up with my own version using ChatGPT. I chose questions I suspected would be difficult or easy to confuse, including obscure movie trivia, older technology, historical details and image-based questions. I even made up a completely untrue question about greeting cards made out of cockroaches.</p><p>For each one, I followed a simple, three-step process:</p><p><strong>I guessed the answer first</strong> based entirely on my own memory.</p><p><strong>I asked ChatGPT</strong> the exact same question.</p><p><strong>I compared both answers</strong> with reliable, verified sources.</p><p>Almost immediately, I noticed that whenever ChatGPT answered confidently, I found myself questioning my own instincts — even when my original guess turned out to be correct.</p><p>For a fleeting second, I actually questioned my own childhood memory. <em>“Well, ChatGPT probably knows better,”</em> I caught myself thinking. And that's the behavior the researchers described. The confidence of the response mattered almost as much as the information itself.</p><h2 id="confidence-can-be-surprisingly-persuasive">Confidence can be surprisingly persuasive</h2><p>One thing I've noticed as a ChatGPT power user is that the AI never sounds unsure or even admits it does not know something. Even when it includes phrases like <em>"I believe"</em> or <em>"it's likely,"</em> the overall response is truly convincing.</p><p>Humans naturally associate confident communication with expertise. That's usually a useful shortcut in everyday life, but it's a dangerous strategy when interacting with AI.</p><p>Unlike a human expert, ChatGPT isn't checking a database or recalling a verified memory. Sure, it can search the web at lighning speed, but even then it can pick up wrong information. It's essentially generating the most statistically likely next words based on patterns in its training.</p><p>Sometimes that's incredibly accurate, but a lot of times that is confidently wrong. The challenge is that those two responses look absolutely identical.</p><h2 id="how-this-study-changed-my-workflow">How this study changed my workflow</h2><p>I've always been cautious about accepting AI's first response because I know how wrong it can be. But this study is certainly a wakeup call. ChatGPT is a powerful productivity tool, but just because it delivers confident answers, it's worth doing your own due diligence to verify what it says are facts. </p><p>For me, that means:</p><p><strong>Checking original sources</strong> rather than taking the AI's summary at face value.</p><p><strong>Confirming statistics and data points</strong> through independent search engines.</p><p><strong>Making sure quotations, dates and names</strong> match reputable, primary references.</p><p>It only takes a minute or two, but it's a habit worth building. If anything, this study reminded me that the smartest way to use AI is to maintain your own crtitical thinking skills because the final decision is still yours. </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/claude/i-found-the-7-easiest-claude-connectors-for-people-over-50-start-with-these"><strong>I found the 7 easiest Claude connectors for people over 50 — start with these</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-replaced-my-notebook-with-an-ai-pen-for-a-month-heres-what-happened"><strong>I replaced my notebook with an AI pen for a month — here's what happened</strong></a></li><li><a href="https://www.tomsguide.com/ai/looking-for-a-job-after-50-here-are-7-chatgpt-prompts-to-level-the-playing-field"><strong>Looking for a job after 50? Here are 7 ChatGPT prompts to level the playing field</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>