<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/apple-tv" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Apple-tv ]]></title>
                <link>https://www.tomsguide.com/entertainment/streaming/apple-tv</link>
        <description><![CDATA[ All the latest apple-tv content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Tue, 27 Oct 2026 06:00:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in November 2026: A heist thriller, new Chris Pratt movie and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Apple TV is giving you plenty to feast on next month, from a high-stakes heist to a golf comedy that’s ready to tee off again. There are five notable titles <strong>new on Apple TV in November 2026,</strong> spanning buzzy scripted series, inspiring documentaries and a culinary road trip with a very unlikely chef.</p><p>The month brings the return of Owen Wilson’s golf comedy <strong>“Stick”</strong> for season 2, plus <strong>“12 12 12,”</strong> a crime thriller that breaks a heist into three timelines. On the film front, <strong>“Way of the Warrior Kid”</strong> delivers a dose of underdog inspiration, while <strong>“Being Heumann”</strong> tells the story of disability rights activist Judy Heumann.</p><p>Plus, “Awkwafina: The Unlikely Cook” sees the comedian/actress put her culinary skills to the test. Ready to see what’s on the menu? Here’s everything coming to Apple TV in November 2026.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="stick-season-2">‘Stick’ season 2</h2><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/m6ArXts5JPk" allowfullscreen=""></iframe></div></div><p>Pryce Cahill (Owen Wilson) has spent 20 years in the rough, but he’s not ready to call it a career just yet. After putting his hopes in teenage golf phenom Santi (Peter Dager), the washed-up pro decides it’s his turn to chase a major. Egged on by old rival Clark (Timothy Olyphant), Pryce sets his sights on becoming the oldest golfer to win the U.S. Open. Enter Coach Amanda (Rhea Seehorn), aka the “swing doctor,” who’ll have to work some serious magic to get this comeback out of the sand trap.</p><p><em><strong>Premieres Nov. 4 on </strong></em><a href="https://tv.apple.com/us/show/stick/umc.cmc.52w04zy67tiv11p8xvbc57wmc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong></strong></em></p><h2 id="awkwafina-the-unlikely-cook">‘Awkwafina: The Unlikely Cook’</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/uCAZET6TZ60" allowfullscreen=""></iframe></div></div><p>Awkwafina can act, rap and make a killer joke, but put her in front of a stove and things get dicey. In this docuseries, Nora Lum embarks on a cross-country culinary education to reconnect with her family’s Chinese restaurant legacy, meeting Asian American chefs who’ve found their own way into the business. From Texas barbecue to Hawaiian pig roasts, she explores the flavors, traditions and family histories that shape Asian American cuisine.</p><p><em><strong>Premieres Nov. 6 on </strong></em><a href="https://tv.apple.com/us/show/awkwafina-the-unlikely-cook/umc.cmc.1fhnal2vix2077ouh1hjy2eoc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><strong></strong></p><h2 id="being-heumann">‘Being Heumann’ </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/CQp2pUXLvJk" allowfullscreen=""></iframe></div></div><p>Washington had ignored disabled Americans for long enough. In 1977, disability rights activist Judy Heumann (Ruth Madeley) and a coalition of fed-up protesters take over a San Francisco federal building, holding out for 28 days to demand the government enforce their civil rights. Siân Heder (“CODA”) directs this true story of a movement that refused to be brushed aside, with Mark Ruffalo as the bureaucrat blocking their demands and Dylan O’Brien as a reporter in the thick of it.</p><p><em><strong>Premieres Nov. 13 on </strong></em><a href="https://tv.apple.com/us/movie/being-heumann/umc.cmc.5gf63v7zj97yiozkpj26lpy55" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><h2 id="12-12-12">‘12 12 12’ </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/pWdt8WMCqnc" allowfullscreen=""></iframe></div></div><p>A bank robbery is one thing; getting away with it is another. This heist thriller stretches the caper across three ticking clocks: 12 months to plan the job, 12 hours to pull it off and 12 days to disappear. Anthony Mackie plays a disgraced FBI agent on the trail of Jamie Dornan’s career criminal, who seeks vengeance as much as money. Their game of cat and mouse spans Europe, with a fortune buried beneath Zurich and plenty of ways for things to go very wrong.</p><p><em><strong>Premieres Nov. 13 on </strong></em><a href="https://tv.apple.com/us/show/12-12-12/umc.cmc.2xeasogpeiwbaegczytrdg1uh" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><h2 id="way-of-the-warrior-kid">‘Way of the Warrior Kid’</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/ZCrx71HdDkI" allowfullscreen=""></iframe></div></div><p>Middle school is brutal, but luckily, 11-year-old Marc has a Navy SEAL in the family. Chris Pratt stars as Uncle Jake, a decorated soldier who takes his nephew (Jude Hill) under his wing after the kid gets pushed around at school. His training regimen, dubbed Operation Warrior Kid, is less about throwing punches than building confidence, courage and character. Based on former SEAL Jocko Willink’s bestselling book, this coming-of-age drama aims to be “The Karate Kid” for a new generation.</p><p><em><strong>Premieres Nov. 25 on </strong></em><a href="https://tv.apple.com/us/movie/way-of-the-warrior-kid/umc.cmc.21vzhs44oeejdkoxenkcdmre0" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apples-new-tv-4k-finally-lets-you-find-your-lost-remote-but-thats-not-even-its-biggest-upgrade">Apple's new TV 4K finally lets you find your lost remote — but that's not the biggest upgrade</a></li><li><a href="https://www.tomsguide.com/tvs/not-every-apple-tv-4k-is-getting-tvos-27-heres-how-to-tell-if-your-box-is-eligible">Not every Apple TV 4K is getting tvOS 27 — here's how to tell if your box is eligible</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-november-2026-a-heist-thriller-new-chris-pratt-movie-and-more</link>
                                                                            <description>
                            <![CDATA[ Our guide to the new movies and shows coming to Apple TV in November 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">tLwBiCVb6QaFo6ZABYuVBm</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XkteQLc5s8KjpcEMDroxsS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 27 Oct 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE-320-70.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/XkteQLc5s8KjpcEMDroxsS-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on autumn themed background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on autumn themed background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on autumn themed background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XkteQLc5s8KjpcEMDroxsS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple TV is giving you plenty to feast on next month, from a high-stakes heist to a golf comedy that’s ready to tee off again. There are five notable titles <strong>new on Apple TV in November 2026,</strong> spanning buzzy scripted series, inspiring documentaries and a culinary road trip with a very unlikely chef.</p><p>The month brings the return of Owen Wilson’s golf comedy <strong>“Stick”</strong> for season 2, plus <strong>“12 12 12,”</strong> a crime thriller that breaks a heist into three timelines. On the film front, <strong>“Way of the Warrior Kid”</strong> delivers a dose of underdog inspiration, while <strong>“Being Heumann”</strong> tells the story of disability rights activist Judy Heumann.</p><p>Plus, “Awkwafina: The Unlikely Cook” sees the comedian/actress put her culinary skills to the test. Ready to see what’s on the menu? Here’s everything coming to Apple TV in November 2026.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="stick-season-2">‘Stick’ season 2</h2><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/m6ArXts5JPk" allowfullscreen=""></iframe></div></div><p>Pryce Cahill (Owen Wilson) has spent 20 years in the rough, but he’s not ready to call it a career just yet. After putting his hopes in teenage golf phenom Santi (Peter Dager), the washed-up pro decides it’s his turn to chase a major. Egged on by old rival Clark (Timothy Olyphant), Pryce sets his sights on becoming the oldest golfer to win the U.S. Open. Enter Coach Amanda (Rhea Seehorn), aka the “swing doctor,” who’ll have to work some serious magic to get this comeback out of the sand trap.</p><p><em><strong>Premieres Nov. 4 on </strong></em><a href="https://tv.apple.com/us/show/stick/umc.cmc.52w04zy67tiv11p8xvbc57wmc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong></strong></em></p><h2 id="awkwafina-the-unlikely-cook">‘Awkwafina: The Unlikely Cook’</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/uCAZET6TZ60" allowfullscreen=""></iframe></div></div><p>Awkwafina can act, rap and make a killer joke, but put her in front of a stove and things get dicey. In this docuseries, Nora Lum embarks on a cross-country culinary education to reconnect with her family’s Chinese restaurant legacy, meeting Asian American chefs who’ve found their own way into the business. From Texas barbecue to Hawaiian pig roasts, she explores the flavors, traditions and family histories that shape Asian American cuisine.</p><p><em><strong>Premieres Nov. 6 on </strong></em><a href="https://tv.apple.com/us/show/awkwafina-the-unlikely-cook/umc.cmc.1fhnal2vix2077ouh1hjy2eoc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><strong></strong></p><h2 id="being-heumann">‘Being Heumann’ </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/CQp2pUXLvJk" allowfullscreen=""></iframe></div></div><p>Washington had ignored disabled Americans for long enough. In 1977, disability rights activist Judy Heumann (Ruth Madeley) and a coalition of fed-up protesters take over a San Francisco federal building, holding out for 28 days to demand the government enforce their civil rights. Siân Heder (“CODA”) directs this true story of a movement that refused to be brushed aside, with Mark Ruffalo as the bureaucrat blocking their demands and Dylan O’Brien as a reporter in the thick of it.</p><p><em><strong>Premieres Nov. 13 on </strong></em><a href="https://tv.apple.com/us/movie/being-heumann/umc.cmc.5gf63v7zj97yiozkpj26lpy55" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><h2 id="12-12-12">‘12 12 12’ </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/pWdt8WMCqnc" allowfullscreen=""></iframe></div></div><p>A bank robbery is one thing; getting away with it is another. This heist thriller stretches the caper across three ticking clocks: 12 months to plan the job, 12 hours to pull it off and 12 days to disappear. Anthony Mackie plays a disgraced FBI agent on the trail of Jamie Dornan’s career criminal, who seeks vengeance as much as money. Their game of cat and mouse spans Europe, with a fortune buried beneath Zurich and plenty of ways for things to go very wrong.</p><p><em><strong>Premieres Nov. 13 on </strong></em><a href="https://tv.apple.com/us/show/12-12-12/umc.cmc.2xeasogpeiwbaegczytrdg1uh" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><h2 id="way-of-the-warrior-kid">‘Way of the Warrior Kid’</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/ZCrx71HdDkI" allowfullscreen=""></iframe></div></div><p>Middle school is brutal, but luckily, 11-year-old Marc has a Navy SEAL in the family. Chris Pratt stars as Uncle Jake, a decorated soldier who takes his nephew (Jude Hill) under his wing after the kid gets pushed around at school. His training regimen, dubbed Operation Warrior Kid, is less about throwing punches than building confidence, courage and character. Based on former SEAL Jocko Willink’s bestselling book, this coming-of-age drama aims to be “The Karate Kid” for a new generation.</p><p><em><strong>Premieres Nov. 25 on </strong></em><a href="https://tv.apple.com/us/movie/way-of-the-warrior-kid/umc.cmc.21vzhs44oeejdkoxenkcdmre0" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apples-new-tv-4k-finally-lets-you-find-your-lost-remote-but-thats-not-even-its-biggest-upgrade">Apple's new TV 4K finally lets you find your lost remote — but that's not the biggest upgrade</a></li><li><a href="https://www.tomsguide.com/tvs/not-every-apple-tv-4k-is-getting-tvos-27-heres-how-to-tell-if-your-box-is-eligible">Not every Apple TV 4K is getting tvOS 27 — here's how to tell if your box is eligible</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 shows like Netflix's 'Below' to watch next ]]></title>
                                                                                                <dc:content><![CDATA[ <p>In the weeks leading up to Halloween, the streamers have been pumping out all things scary and spooky. Still, one title has managed to stand out from the freaky bunch: <a href="https://www.tomsguide.com/entertainment/streaming/netflix"><strong>Netflix's</strong></a><strong> </strong><a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-thriller-is-one-of-the-years-most-bingeable-shows-and-it-dives-headfirst-into-the-mystery"><strong>"Below."</strong></a></p><p>The atmospheric, highly bingeable sea-creature thriller series stars <a href="https://www.tomsguide.com/entertainment/movies/this-josh-hartnett-action-comedy-is-the-wildest-movie-ive-seen-in-2025-its-an-absolute-riot">Josh Hartnett</a> as Calvin Penney, a fisherman living in a small, nautical Newfoundland town dealing with an unidentified sea creature that starts terrorizing the community. </p><p>Since the Jesse McKeown-created miniseries debuted on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> on Oct. 8, it quickly surged to the top spot on Netflix's global and <a href="https://www.tomsguide.com/entertainment/netflix/netflix-top-10-shows-heres-the-3-you-need-to-binge-watch-this-week-october-13-19">U.S. TV charts. </a>But if you already finished all eight eerie episodes of "Below" and are looking for something similarly packed with small-town quirkiness, supernatural dread, and things that go bump in the night, we've got a trio of top-rated shows for you to watch next. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="39-widow-39-s-bay-39">'Widow's Bay'</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/Nmc2RYm6PUE" allowfullscreen=""></iframe></div></div><p>Let's get the obvious one out of the way, shall we? Before "Below," the main "creepy things happening on an isolated island" series of note was "<a href="https://www.tomsguide.com/entertainment/apple-tv/widows-bay-season-2-everything-we-know-so-far">Widow's Bay</a>," the Apple TV hit that won over awards bodies — it took home a cool 14 Emmy Awards for its first season, including for Outstanding Comedy Series — and TV fans alike with its blend of offbeat humor and genuine scares</p><p>Like "Below," the horror-comedy takes place in a quaint island town: Here, it's a fictional New England hamlet 40 miles off the North Shore coast whose tourism bona fides are complicated by the fact that everyone on the island (as played by Kate O'Flynn, Stephen Root, Jeff Hiller and Dale Dickey, among others) believes it to be afflicted with a centuries-old curse. </p><p>Brushing off that supernatural brouhaha is the town mayor, Tom Loftis (Matthew Rhys), who is desperate to revive his struggling community and bring press attention to the isolated destination. That is, until the dark folklore of Widow's Bay starts to come true. </p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/episode/welcome-to-widows-bay/umc.cmc.66qky4nskhbw2mdz0dt3oc0gu?showId=umc.cmc.1zzly0vah46bnvnwf0qkrjhh2&amp;action=playSmartEpisode" target="_blank" rel="nofollow"><em><strong>"Widow's Bay" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-the-terror-39">'The Terror'</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/dUZKjdewbZQ" allowfullscreen=""></iframe></div></div><p>Based on Dan Simmons's historical novel, the first season of this survival-horror anthology, like “Below,” focuses on the deep-sea frights that lurk beneath the water’s surface. </p><p>The story follows Royal Navy sailors on a doomed 1840s Arctic naval expedition to find the Northwest Passage. Trapped in the frozen Arctic ice, the crew of HMS Terror and HMS Erebus must not only endure the incredible harsh climate and rapidly approaching starvation but also a mysterious, polar bear-like supernatural predator inspired by the Inuit Tuurngait myth. (Do note, though, like any good anthology, the second season follows an entirely different story and cast.)</p><p><em><strong>Stream </strong></em><a href="https://www.amcplus.com/shows/the-terror--1002256?utm_campaign=watch-action&amp;utm_source=google-android&amp;utm_medium=organic" target="_blank" rel="nofollow"><em><strong>"The Terror" on AMC+</strong></em></a><em><strong> now</strong></em></p><h2 id="39-stranger-things-39">'Stranger Things'</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/mnd7sFt5c3A" allowfullscreen=""></iframe></div></div><p>Netflix's sci-fi juggernaut "Stranger Things" and new maritime mystery "Below" share a main actor in Charlie Heaton, who plays the elder Byers bro Jonathan on the former and Calvin's oldest son Wade Penney in the latter. But the streaming shows share more DNA than just a casting overlap: Both center on a tight-knit community having to come together to face a mysterious monster threat, all wrapped up in a suspenseful sci-fi package that pays homage to throwback creature features like “The Fog,” “The Thing,” and “Jaws.”</p><p>Across five seasons, “Stranger Things” follows the residents of Hawkins as they deal with the horrific fallout after a young local boy (Noah Schnapp) seemingly vanishes into thin air in 1980s Indiana. Both his family (portrayed by the aforementioned Heaton as well as horror icon Winona Ryder) and friends—a lovable gang played by Finn Wolfhard, Gaten Matarazzo and Caleb McLaughlin—desperately search for the missing Will Byers, aided by a strange telekinetic girl (Millie Bobby Brown) who escaped from a lab. </p><p><em><strong>Stream </strong></em><a href="https://www.netflix.com/title/80057281?source=35&amp;fromWatch=true" target="_blank" rel="nofollow"><em><strong>"Stranger Things" on Netflix</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEYKke"></div>                            </div>                            <script src="https://kwizly.com/embed/eEYKke.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/prime-video/3-best-new-to-prime-video-shows-you-should-binge-watch-this-weekend-including-a-reboot-of-cinemas-most-infamous-killer-doll-oct-16-18">3 best new-to-Prime Video shows you should binge-watch this weekend — including a reboot of cinema's most infamous killer doll</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-sci-fi-mystery-is-its-best-original-series-of-2026-so-far-and-i-already-need-more">Netflix’s new sci-fi drama is a nostalgic treat packed into a bingeable mystery series — and it’s streaming now</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/beyond-fallout-3-must-watch-prime-video-sci-fi-shows-you-probably-havent-seen-yet">Beyond 'Fallout': 3 must-watch Prime Video sci-fi shows you (probably) haven't seen yet</a></li></ul><div data-model-name="Netflix,Peacock TV,Amazon Prime Video,Hulu,Paramount Plus,Disney+" data-widget-type="multimodelreview" data-widget-title="Today's best streaming deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/3-shows-like-netflixs-below-to-watch-next</link>
                                                                            <description>
                            <![CDATA[ Love supernatural spooks and small-town weirdness? Here are three series to watch after you finish Netflix's "Below." ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DEEoVhHwFtCoUnNEjLakSK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Swd7HUGceWZfLt989ZB9BH-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 18 Oct 2026 14: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-320-70.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/Swd7HUGceWZfLt989ZB9BH-1920-80.jpg">
                                                            <media:credit><![CDATA[Netflix]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Josh Hartnett as Calvin in &quot;Below&quot; on Netflix]]></media:description>                                                            <media:text><![CDATA[Josh Hartnett as Calvin in &quot;Below&quot; on Netflix]]></media:text>
                                <media:title type="plain"><![CDATA[Josh Hartnett as Calvin in &quot;Below&quot; on Netflix]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Swd7HUGceWZfLt989ZB9BH-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In the weeks leading up to Halloween, the streamers have been pumping out all things scary and spooky. Still, one title has managed to stand out from the freaky bunch: <a href="https://www.tomsguide.com/entertainment/streaming/netflix"><strong>Netflix's</strong></a><strong> </strong><a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-thriller-is-one-of-the-years-most-bingeable-shows-and-it-dives-headfirst-into-the-mystery"><strong>"Below."</strong></a></p><p>The atmospheric, highly bingeable sea-creature thriller series stars <a href="https://www.tomsguide.com/entertainment/movies/this-josh-hartnett-action-comedy-is-the-wildest-movie-ive-seen-in-2025-its-an-absolute-riot">Josh Hartnett</a> as Calvin Penney, a fisherman living in a small, nautical Newfoundland town dealing with an unidentified sea creature that starts terrorizing the community. </p><p>Since the Jesse McKeown-created miniseries debuted on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> on Oct. 8, it quickly surged to the top spot on Netflix's global and <a href="https://www.tomsguide.com/entertainment/netflix/netflix-top-10-shows-heres-the-3-you-need-to-binge-watch-this-week-october-13-19">U.S. TV charts. </a>But if you already finished all eight eerie episodes of "Below" and are looking for something similarly packed with small-town quirkiness, supernatural dread, and things that go bump in the night, we've got a trio of top-rated shows for you to watch next. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="39-widow-39-s-bay-39">'Widow's Bay'</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/Nmc2RYm6PUE" allowfullscreen=""></iframe></div></div><p>Let's get the obvious one out of the way, shall we? Before "Below," the main "creepy things happening on an isolated island" series of note was "<a href="https://www.tomsguide.com/entertainment/apple-tv/widows-bay-season-2-everything-we-know-so-far">Widow's Bay</a>," the Apple TV hit that won over awards bodies — it took home a cool 14 Emmy Awards for its first season, including for Outstanding Comedy Series — and TV fans alike with its blend of offbeat humor and genuine scares</p><p>Like "Below," the horror-comedy takes place in a quaint island town: Here, it's a fictional New England hamlet 40 miles off the North Shore coast whose tourism bona fides are complicated by the fact that everyone on the island (as played by Kate O'Flynn, Stephen Root, Jeff Hiller and Dale Dickey, among others) believes it to be afflicted with a centuries-old curse. </p><p>Brushing off that supernatural brouhaha is the town mayor, Tom Loftis (Matthew Rhys), who is desperate to revive his struggling community and bring press attention to the isolated destination. That is, until the dark folklore of Widow's Bay starts to come true. </p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/episode/welcome-to-widows-bay/umc.cmc.66qky4nskhbw2mdz0dt3oc0gu?showId=umc.cmc.1zzly0vah46bnvnwf0qkrjhh2&amp;action=playSmartEpisode" target="_blank" rel="nofollow"><em><strong>"Widow's Bay" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-the-terror-39">'The Terror'</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/dUZKjdewbZQ" allowfullscreen=""></iframe></div></div><p>Based on Dan Simmons's historical novel, the first season of this survival-horror anthology, like “Below,” focuses on the deep-sea frights that lurk beneath the water’s surface. </p><p>The story follows Royal Navy sailors on a doomed 1840s Arctic naval expedition to find the Northwest Passage. Trapped in the frozen Arctic ice, the crew of HMS Terror and HMS Erebus must not only endure the incredible harsh climate and rapidly approaching starvation but also a mysterious, polar bear-like supernatural predator inspired by the Inuit Tuurngait myth. (Do note, though, like any good anthology, the second season follows an entirely different story and cast.)</p><p><em><strong>Stream </strong></em><a href="https://www.amcplus.com/shows/the-terror--1002256?utm_campaign=watch-action&amp;utm_source=google-android&amp;utm_medium=organic" target="_blank" rel="nofollow"><em><strong>"The Terror" on AMC+</strong></em></a><em><strong> now</strong></em></p><h2 id="39-stranger-things-39">'Stranger Things'</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/mnd7sFt5c3A" allowfullscreen=""></iframe></div></div><p>Netflix's sci-fi juggernaut "Stranger Things" and new maritime mystery "Below" share a main actor in Charlie Heaton, who plays the elder Byers bro Jonathan on the former and Calvin's oldest son Wade Penney in the latter. But the streaming shows share more DNA than just a casting overlap: Both center on a tight-knit community having to come together to face a mysterious monster threat, all wrapped up in a suspenseful sci-fi package that pays homage to throwback creature features like “The Fog,” “The Thing,” and “Jaws.”</p><p>Across five seasons, “Stranger Things” follows the residents of Hawkins as they deal with the horrific fallout after a young local boy (Noah Schnapp) seemingly vanishes into thin air in 1980s Indiana. Both his family (portrayed by the aforementioned Heaton as well as horror icon Winona Ryder) and friends—a lovable gang played by Finn Wolfhard, Gaten Matarazzo and Caleb McLaughlin—desperately search for the missing Will Byers, aided by a strange telekinetic girl (Millie Bobby Brown) who escaped from a lab. </p><p><em><strong>Stream </strong></em><a href="https://www.netflix.com/title/80057281?source=35&amp;fromWatch=true" target="_blank" rel="nofollow"><em><strong>"Stranger Things" on Netflix</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEYKke"></div>                            </div>                            <script src="https://kwizly.com/embed/eEYKke.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/prime-video/3-best-new-to-prime-video-shows-you-should-binge-watch-this-weekend-including-a-reboot-of-cinemas-most-infamous-killer-doll-oct-16-18">3 best new-to-Prime Video shows you should binge-watch this weekend — including a reboot of cinema's most infamous killer doll</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-sci-fi-mystery-is-its-best-original-series-of-2026-so-far-and-i-already-need-more">Netflix’s new sci-fi drama is a nostalgic treat packed into a bingeable mystery series — and it’s streaming now</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/beyond-fallout-3-must-watch-prime-video-sci-fi-shows-you-probably-havent-seen-yet">Beyond 'Fallout': 3 must-watch Prime Video sci-fi shows you (probably) haven't seen yet</a></li></ul><div data-model-name="Netflix,Peacock TV,Amazon Prime Video,Hulu,Paramount Plus,Disney+" data-widget-type="multimodelreview" data-widget-title="Today's best streaming deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ You don’t need the $300 Apple TV 4K to get its best feature — just buy the new Siri remote ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you own an Apple TV, you know the routine. You sit down to relax, reach for the remote, and find nothing. Ten minutes later, after lifting every couch cushion and checking under the rug, you finally locate it.   </p><p>As part of Apple's Welcome home product showcase, which signaled a major expansion into the smart home space, the company unveiled a direct fix for this living room headache. The <a href="https://www.tomsguide.com/entertainment/apple-tv/apples-new-tv-4k-finally-lets-you-find-your-lost-remote-but-thats-not-even-its-biggest-upgrade">new Apple TV 4K</a> upgraded Siri Remote now features a built-in speaker that plays an audible chime when triggered via voice command or the Find My app. </p><p>Combined with Precision Finding, which provides directional cues on your iPhone or Apple Watch, tracking down a misplaced remote requires far less guesswork. The good news is that you don't have to drop $300 on a new streaming box to get the Siri remote for your existing Apple TV. </p><h3 class="article-body__section" id="section-what-s-new-with-the-2026-siri-remote"><span>What’s new with the 2026 Siri remote?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="njMVpdXjsaaeUrVpuKF9aV" name="Siri Remote" alt="Siri remote for Apple TV 4K" src="https://cdn.mos.cms.futurecdn.net/njMVpdXjsaaeUrVpuKF9aV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>If you are eyeing the standalone upgrade, Apple packed several practical features into the body of the remote:</p><p><strong>Precision finding</strong>. The remote supports highly accurate directional guidance directly on your iPhone screen. Find My now guides you straight to the remote with distance counters and directional arrows, making short work of room searches.</p><p><strong>A built-in speaker</strong>.<strong> </strong>Apple finally added a hardware speaker to the body of the remote. You can now say, "Hey Siri, find my remote," or use the Find My app, and it will emit a clear, audible chime from beneath your sofa cushions.</p><p>And, of course, <strong>broad backward compatibility</strong>. As we know, Apple made the remote backward compatible with earlier set-top models, so you can upgrade your remote without throwing away a perfectly good streaming box.</p><h2 id="yes-you-can-buy-it-separately">Yes, you can buy it separately</h2><p>The new Siri Remote is sold as a standalone accessory. Apple offers the upgraded remote individually for $59 on the Apple Store. </p><div class="product"><a data-dimension112="0fbb6be8-c88e-11f1-b2dd-7d90dc6eb453" data-action="Deal Block" data-label="Siri Remote" data-dimension48="Siri Remote" data-dimension25="$59" href="https://www.apple.com/shop/product/mlfc4am/a/siri-remote" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1224px;"><p class="vanilla-image-block" style="padding-top:91.99%;"><img id="TkNqEMgANxReycFAMUcNMf" name="Siri remote" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TkNqEMgANxReycFAMUcNMf-1920-80.png" mos="" align="middle" fullscreen="" width="1224" height="1126" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>Apple’s speaker-equipped Siri Remote is now available to pre-order as a standalone purchase for $59. Works with all Apple TV 4K and HD models. Pre-orders ship Friday, November 13.<a class="view-deal button" href="https://www.apple.com/shop/product/mlfc4am/a/siri-remote" target="_blank" rel="nofollow" data-dimension112="0fbb6be8-c88e-11f1-b2dd-7d90dc6eb453" data-action="Deal Block" data-label="Siri Remote" data-dimension48="Siri Remote" data-dimension25="$59">View Deal</a></p></div><p>It is available to order alongside the broader hardware lineup, with shipments beginning Friday, November 13 — matching the launch date of the new Apple TV 4K. </p><p>For users happy with their current streaming box who simply want an easier way to find the remote, the $59 standalone Siri Remote offers a straightforward, budget-friendly fix without forcing a full system upgrade.</p><h3 class="article-body__section" id="section-what-models-does-it-support"><span>What models does it support?</span></h3><p>The standalone remote is compatible with:</p><ul><li><strong>Apple TV 4K</strong> (1st, 2nd, and 3rd generations)</li><li><strong>Apple TV HD</strong></li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X810Ne"></div>                            </div>                            <script src="https://kwizly.com/embed/X810Ne.js" async=""></script><p>Interested in what else Apple unveiled at its smart home showcase? <strong>Check out our </strong><a href="https://www.tomsguide.com/news/live/apple-homeview-event-october-13-live-updates"><strong>Apple 'Welcome home' event live blog</strong></a><strong> </strong>for full coverage, hands-on impressions, and deep dives into all the latest releases. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/live/apple-homeview-event-october-13-live-updates">Apple 'Welcome home' event LIVE — HomeView, Apple TV 4K, HomePod mini 2 unveiled — all the news, prices and release dates</a></li><li><a href="http://tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/tvs/i-found-5-hidden-shortcuts-for-my-apple-tv-4k-that-make-it-so-much-easier-to-use-heres-how-to-use-them">I found 5 hidden shortcuts for my Apple TV 4K that make it so much easier to use — here's how to use them</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/you-dont-need-the-usd300-apple-tv-4k-to-get-its-best-feature-just-buy-the-new-siri-remote</link>
                                                                            <description>
                            <![CDATA[ Lost your Apple TV remote? Apple’s new speaker-equipped Siri Remote costs $59 separately and works with existing 4K and HD models. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">EyrM3fQmkx3vFUmYuhJcob</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LTKRFam46ThrSponssKCqG-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 15 Oct 2026 11:46:55 +0000</pubDate>                                                                                                                                <updated>Thu, 15 Oct 2026 12:21:58 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/LTKRFam46ThrSponssKCqG-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple / Edited with Gemini ]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV 4K and Siri Remote]]></media:description>                                                            <media:text><![CDATA[Apple TV 4K and Siri Remote]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV 4K and Siri Remote]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LTKRFam46ThrSponssKCqG-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you own an Apple TV, you know the routine. You sit down to relax, reach for the remote, and find nothing. Ten minutes later, after lifting every couch cushion and checking under the rug, you finally locate it.   </p><p>As part of Apple's Welcome home product showcase, which signaled a major expansion into the smart home space, the company unveiled a direct fix for this living room headache. The <a href="https://www.tomsguide.com/entertainment/apple-tv/apples-new-tv-4k-finally-lets-you-find-your-lost-remote-but-thats-not-even-its-biggest-upgrade">new Apple TV 4K</a> upgraded Siri Remote now features a built-in speaker that plays an audible chime when triggered via voice command or the Find My app. </p><p>Combined with Precision Finding, which provides directional cues on your iPhone or Apple Watch, tracking down a misplaced remote requires far less guesswork. The good news is that you don't have to drop $300 on a new streaming box to get the Siri remote for your existing Apple TV. </p><h3 class="article-body__section" id="section-what-s-new-with-the-2026-siri-remote"><span>What’s new with the 2026 Siri remote?</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="njMVpdXjsaaeUrVpuKF9aV" name="Siri Remote" alt="Siri remote for Apple TV 4K" src="https://cdn.mos.cms.futurecdn.net/njMVpdXjsaaeUrVpuKF9aV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>If you are eyeing the standalone upgrade, Apple packed several practical features into the body of the remote:</p><p><strong>Precision finding</strong>. The remote supports highly accurate directional guidance directly on your iPhone screen. Find My now guides you straight to the remote with distance counters and directional arrows, making short work of room searches.</p><p><strong>A built-in speaker</strong>.<strong> </strong>Apple finally added a hardware speaker to the body of the remote. You can now say, "Hey Siri, find my remote," or use the Find My app, and it will emit a clear, audible chime from beneath your sofa cushions.</p><p>And, of course, <strong>broad backward compatibility</strong>. As we know, Apple made the remote backward compatible with earlier set-top models, so you can upgrade your remote without throwing away a perfectly good streaming box.</p><h2 id="yes-you-can-buy-it-separately">Yes, you can buy it separately</h2><p>The new Siri Remote is sold as a standalone accessory. Apple offers the upgraded remote individually for $59 on the Apple Store. </p><div class="product"><a data-dimension112="0fbb6be8-c88e-11f1-b2dd-7d90dc6eb453" data-action="Deal Block" data-label="Siri Remote" data-dimension48="Siri Remote" data-dimension25="$59" href="https://www.apple.com/shop/product/mlfc4am/a/siri-remote" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1224px;"><p class="vanilla-image-block" style="padding-top:91.99%;"><img id="TkNqEMgANxReycFAMUcNMf" name="Siri remote" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TkNqEMgANxReycFAMUcNMf-1920-80.png" mos="" align="middle" fullscreen="" width="1224" height="1126" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>Apple’s speaker-equipped Siri Remote is now available to pre-order as a standalone purchase for $59. Works with all Apple TV 4K and HD models. Pre-orders ship Friday, November 13.<a class="view-deal button" href="https://www.apple.com/shop/product/mlfc4am/a/siri-remote" target="_blank" rel="nofollow" data-dimension112="0fbb6be8-c88e-11f1-b2dd-7d90dc6eb453" data-action="Deal Block" data-label="Siri Remote" data-dimension48="Siri Remote" data-dimension25="$59">View Deal</a></p></div><p>It is available to order alongside the broader hardware lineup, with shipments beginning Friday, November 13 — matching the launch date of the new Apple TV 4K. </p><p>For users happy with their current streaming box who simply want an easier way to find the remote, the $59 standalone Siri Remote offers a straightforward, budget-friendly fix without forcing a full system upgrade.</p><h3 class="article-body__section" id="section-what-models-does-it-support"><span>What models does it support?</span></h3><p>The standalone remote is compatible with:</p><ul><li><strong>Apple TV 4K</strong> (1st, 2nd, and 3rd generations)</li><li><strong>Apple TV HD</strong></li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X810Ne"></div>                            </div>                            <script src="https://kwizly.com/embed/X810Ne.js" async=""></script><p>Interested in what else Apple unveiled at its smart home showcase? <strong>Check out our </strong><a href="https://www.tomsguide.com/news/live/apple-homeview-event-october-13-live-updates"><strong>Apple 'Welcome home' event live blog</strong></a><strong> </strong>for full coverage, hands-on impressions, and deep dives into all the latest releases. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/live/apple-homeview-event-october-13-live-updates">Apple 'Welcome home' event LIVE — HomeView, Apple TV 4K, HomePod mini 2 unveiled — all the news, prices and release dates</a></li><li><a href="http://tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/tvs/i-found-5-hidden-shortcuts-for-my-apple-tv-4k-that-make-it-so-much-easier-to-use-heres-how-to-use-them">I found 5 hidden shortcuts for my Apple TV 4K that make it so much easier to use — here's how to use them</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple's new TV 4K finally lets you find your lost remote — but that's not the biggest upgrade ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I never <em>deliberately</em> put my Apple TV remote somewhere difficult to find. And yet, that petite silver stick always ends up… <em>misplaced</em>. So when Apple showed me an Apple TV remote that can actually make a noise when you lose it, I was pretty much ready to upgrade on the spot. </p><p>That audible chime for the companion remote are probably the most practical upgrades coming to Apple's new $299 Apple TV 4K, which I got an early look at ahead of its official announcement. The streaming box is also getting an A19 chip, hands-free Siri AI and support for up to four HomePod speakers for a more immersive home theater setup.</p><p>Speaking of speakers, Apple also introduced the $149 HomePod mini 2, which brings new colors, a clever lighting feature and tighter integration with your Mac. While the speaker itself is a fairly modest refresh, it's another piece of Apple's increasingly connected approach to home entertainment and access to Siri AI.</p><p>After seeing some of these features demonstrated together, I think the most interesting changes aren't necessarily about what you watch or listen to, but how much easier Apple wants to make the home entertainment experience.</p><h2 id="you-can-finally-ping-your-apple-tv-remote">You can finally ping your Apple TV remote…</h2><p>Apple has already offered Find My for tracking down compatible Siri Remotes with an iPhone, but the newest remote adds a built-in speaker, something that Apple TV users have been begging Apple to deliver. </p><p>In practice, you ask Siri where your remote is, and it'll play a chime to help you locate it. You can also use Find My with Precision Finding to guide you toward the remote's location.</p><p>I appreciate having both options, but if the remote is lost somewhere in the depths of the couch, an audible alert seems a lot more convenient.</p><p>Better yet, Apple says the new remote is backward compatible with existing Apple TV hardware. So if this is the feature that catches your attention most, you won't necessarily need to replace your entire streaming box to take advantage of it.</p><h2 id="or-ditch-the-physical-remote-entirely">… or ditch the physical remote entirely </h2><p>Apple is also making picking up the remote optional in the first place. The new Apple TV 4K has three far-field microphones, allowing you to speak to Siri from across the room without pressing a button on the remote.</p><p>And with Siri AI, Apple's voice assistant is getting substantially more capable at understanding what you're actually asking.</p><p>One demonstration involved asking Siri to find a show that a friend had recommended over text. Rather than remembering the title or digging through your messages, Siri can leverage personal context from your iPhone to help figure out what you meant.</p><p>You can also ask Siri more conversational questions about what you're watching or describe the kind of movie you're in the mood for without necessarily knowing its title.</p><p>It's worth noting that the new Siri AI experience will initially launch in beta in English, so some of these capabilities won't necessarily be available to everyone right away.</p><h2 id="apple-tv-4k-can-now-pair-with-four-homepods">Apple TV 4K can now pair with four HomePods</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mCpnDWeP8jSyhsonDkG6X7" name="Surround with HomePod Mini" alt="Apple TV 4K surround with HomePod" src="https://cdn.mos.cms.futurecdn.net/mCpnDWeP8jSyhsonDkG6X7-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>This new Apple TV 4K can now pair with up to four compatible HomePod speakers to create an immersive surround sound setup. Previously, you could only connect two.</p><p>In the demonstration, two <a href="https://www.tomsguide.com/reviews/apple-homepod-2nd-generation">HomePod (2nd Gen) </a>speakers sat on either side of the TV screen, while two HomePod mini 2 devices acted as the rears. The system also automatically calibrates the speakers to the room, taking some of the work out of getting everything configured. </p><p>Unfortunately the system only works with the latest generation of Apple TV 4K, HomePod and now HomePod mini. But the whole array comes out to about $1,300, which is actually a relatively fair asking price for a surround sound set up</p><h2 id="homepod-mini-2-gets-minor-yet-colorful-upgrades">HomePod mini 2 gets minor, yet colorful upgrades</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VvnY9oC58dCz5RDFjoTKRQ" name="HomePod Mini Colors" alt="HomePod mini 2" src="https://cdn.mos.cms.futurecdn.net/VvnY9oC58dCz5RDFjoTKRQ-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Alongside the Apple TV 4K, Apple unveiled the second-generation HomePod mini, priced at $149.</p><p>The new speaker features an S10 chip, Siri AI support (via a compatible iPhone with Apple Intelligence) and five colors: green, blue, pink, white and midnight.</p><p>But the most visually interesting upgrade is a feature called Sound Glow, which lets the lights on top of the HomePod mini change color to coordinate with the album artwork of whatever you're listening to. This feature works with Apple Music or any third-party streaming that supports Now Playing information. It also works with ambient sounds.</p><p>The new HomePod mini can be configured as your Mac's default audio output, allowing it to handle everything from video calls to gaming. I listened to it demonstrated with games, emphasizing the responsiveness of the connection.</p><h2 id="apple-tv-4k-and-homepod-mini-2-early-verdict">Apple TV 4K and HomePod mini 2: Early verdict</h2><p>I think it's safe to say the HomePod mini 2 isn't quite as substantial an upgrade as the new Apple TV 4K, but it’s arguably a necessary refresh if Apple wants its users acclimating to Siri AI throughout their home.</p><p>The new Apple TV 4K is becoming a device you can interact with more naturally, while HomePods are taking on a bigger role in everything from your living room audio to your Mac setup.</p><p>There's still plenty I want to test, particularly the reliability of Siri AI and whether four HomePods can deliver a convincing surround sound experience compared to what you get with, say, Sonos or Bose. </p><p>But I like that Apple hasn't overlooked the little improvements in pursuit of bigger AI features. As impressive as the new Siri capabilities sound, there's something to be said for a remote that simply makes itself easier to find. For me, the best upgrade is the one that saves you five minutes of digging through the couch.</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/apple-tv/apple-tv-report-card-2026-do-prestige-tv-shows-make-up-for-a-tiny-library">Apple TV Report Card 2026: We graded Apple's streaming service </a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free (even after your trial is over)</a></li><li><a href="https://www.tomsguide.com/round-up/best-apple-tv-apps">The best Apple TV apps and games right now</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/apples-new-tv-4k-finally-lets-you-find-your-lost-remote-but-thats-not-even-its-biggest-upgrade</link>
                                                                            <description>
                            <![CDATA[ I got an early look at Apple's new TV 4K, featuring hands-free Siri AI, a findable remote and four-speaker surround sound, alongside the refreshed HomePod mini 2. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WNFGdRknLm4epoGhF93Qu7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mHAayn8eZe7Y2KScYP9J7c-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 13 Oct 2026 13:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 13 Oct 2026 13:04:26 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Kate Kozuch ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xAVUdx6Qtp3SzugnnfNYsL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kate Kozuch is a managing editor of social and video at Tom&#039;s Guide, where she&#039;s been with the team since 2019. She also reviews smartwatches, covers TVs, tests the latest audio products and dabbles in cooking appliances. Of course, that&#039;s not when she&#039;s working on building the &lt;a href=&quot;https://www.tomsguide.com/reference/smart-home-guide&quot;&gt;ultimate DIY smart home&lt;/a&gt;. She has conducted over 100 different product reviews across these categories, turning her findings into buying guides and face-offs. She also manages a number of gift guides on the site. &lt;/p&gt;&lt;p&gt;Kate has a strong on-camera presence as well. She has appeared on Cheddar and Fox 5 NY to talk trending tech news. She is also regularly featured on the Tom&#039;s Guide YouTube channel, runs the &lt;a href=&quot;https://www.tiktok.com/@tomsguide?lang=en&quot;&gt;Tom&#039;s Guide TikTok account&lt;/a&gt; with over 350,000 followers, and features all the tech she&#039;s testing &lt;a href=&quot;https://www.instagram.com/katekozuch/&quot;&gt;on her Instagram&lt;/a&gt;. When she’s not filming tech videos, you can find her taking up a new sport, mastering the NYT Crossword or channeling her inner celebrity chef. Speaking of, be sure to ask her about the time Guy Fieri made her a margarita at CES, or when her video of Martha Stewart drinking a margarita went mega-viral. Clearly, Kate has a thing for culinary icons and margaritas.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/mHAayn8eZe7Y2KScYP9J7c-1920-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV 4K 2026]]></media:description>                                                            <media:text><![CDATA[Apple TV 4K 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV 4K 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mHAayn8eZe7Y2KScYP9J7c-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I never <em>deliberately</em> put my Apple TV remote somewhere difficult to find. And yet, that petite silver stick always ends up… <em>misplaced</em>. So when Apple showed me an Apple TV remote that can actually make a noise when you lose it, I was pretty much ready to upgrade on the spot. </p><p>That audible chime for the companion remote are probably the most practical upgrades coming to Apple's new $299 Apple TV 4K, which I got an early look at ahead of its official announcement. The streaming box is also getting an A19 chip, hands-free Siri AI and support for up to four HomePod speakers for a more immersive home theater setup.</p><p>Speaking of speakers, Apple also introduced the $149 HomePod mini 2, which brings new colors, a clever lighting feature and tighter integration with your Mac. While the speaker itself is a fairly modest refresh, it's another piece of Apple's increasingly connected approach to home entertainment and access to Siri AI.</p><p>After seeing some of these features demonstrated together, I think the most interesting changes aren't necessarily about what you watch or listen to, but how much easier Apple wants to make the home entertainment experience.</p><h2 id="you-can-finally-ping-your-apple-tv-remote">You can finally ping your Apple TV remote…</h2><p>Apple has already offered Find My for tracking down compatible Siri Remotes with an iPhone, but the newest remote adds a built-in speaker, something that Apple TV users have been begging Apple to deliver. </p><p>In practice, you ask Siri where your remote is, and it'll play a chime to help you locate it. You can also use Find My with Precision Finding to guide you toward the remote's location.</p><p>I appreciate having both options, but if the remote is lost somewhere in the depths of the couch, an audible alert seems a lot more convenient.</p><p>Better yet, Apple says the new remote is backward compatible with existing Apple TV hardware. So if this is the feature that catches your attention most, you won't necessarily need to replace your entire streaming box to take advantage of it.</p><h2 id="or-ditch-the-physical-remote-entirely">… or ditch the physical remote entirely </h2><p>Apple is also making picking up the remote optional in the first place. The new Apple TV 4K has three far-field microphones, allowing you to speak to Siri from across the room without pressing a button on the remote.</p><p>And with Siri AI, Apple's voice assistant is getting substantially more capable at understanding what you're actually asking.</p><p>One demonstration involved asking Siri to find a show that a friend had recommended over text. Rather than remembering the title or digging through your messages, Siri can leverage personal context from your iPhone to help figure out what you meant.</p><p>You can also ask Siri more conversational questions about what you're watching or describe the kind of movie you're in the mood for without necessarily knowing its title.</p><p>It's worth noting that the new Siri AI experience will initially launch in beta in English, so some of these capabilities won't necessarily be available to everyone right away.</p><h2 id="apple-tv-4k-can-now-pair-with-four-homepods">Apple TV 4K can now pair with four HomePods</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mCpnDWeP8jSyhsonDkG6X7" name="Surround with HomePod Mini" alt="Apple TV 4K surround with HomePod" src="https://cdn.mos.cms.futurecdn.net/mCpnDWeP8jSyhsonDkG6X7-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>This new Apple TV 4K can now pair with up to four compatible HomePod speakers to create an immersive surround sound setup. Previously, you could only connect two.</p><p>In the demonstration, two <a href="https://www.tomsguide.com/reviews/apple-homepod-2nd-generation">HomePod (2nd Gen) </a>speakers sat on either side of the TV screen, while two HomePod mini 2 devices acted as the rears. The system also automatically calibrates the speakers to the room, taking some of the work out of getting everything configured. </p><p>Unfortunately the system only works with the latest generation of Apple TV 4K, HomePod and now HomePod mini. But the whole array comes out to about $1,300, which is actually a relatively fair asking price for a surround sound set up</p><h2 id="homepod-mini-2-gets-minor-yet-colorful-upgrades">HomePod mini 2 gets minor, yet colorful upgrades</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VvnY9oC58dCz5RDFjoTKRQ" name="HomePod Mini Colors" alt="HomePod mini 2" src="https://cdn.mos.cms.futurecdn.net/VvnY9oC58dCz5RDFjoTKRQ-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Alongside the Apple TV 4K, Apple unveiled the second-generation HomePod mini, priced at $149.</p><p>The new speaker features an S10 chip, Siri AI support (via a compatible iPhone with Apple Intelligence) and five colors: green, blue, pink, white and midnight.</p><p>But the most visually interesting upgrade is a feature called Sound Glow, which lets the lights on top of the HomePod mini change color to coordinate with the album artwork of whatever you're listening to. This feature works with Apple Music or any third-party streaming that supports Now Playing information. It also works with ambient sounds.</p><p>The new HomePod mini can be configured as your Mac's default audio output, allowing it to handle everything from video calls to gaming. I listened to it demonstrated with games, emphasizing the responsiveness of the connection.</p><h2 id="apple-tv-4k-and-homepod-mini-2-early-verdict">Apple TV 4K and HomePod mini 2: Early verdict</h2><p>I think it's safe to say the HomePod mini 2 isn't quite as substantial an upgrade as the new Apple TV 4K, but it’s arguably a necessary refresh if Apple wants its users acclimating to Siri AI throughout their home.</p><p>The new Apple TV 4K is becoming a device you can interact with more naturally, while HomePods are taking on a bigger role in everything from your living room audio to your Mac setup.</p><p>There's still plenty I want to test, particularly the reliability of Siri AI and whether four HomePods can deliver a convincing surround sound experience compared to what you get with, say, Sonos or Bose. </p><p>But I like that Apple hasn't overlooked the little improvements in pursuit of bigger AI features. As impressive as the new Siri capabilities sound, there's something to be said for a remote that simply makes itself easier to find. For me, the best upgrade is the one that saves you five minutes of digging through the couch.</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/apple-tv/apple-tv-report-card-2026-do-prestige-tv-shows-make-up-for-a-tiny-library">Apple TV Report Card 2026: We graded Apple's streaming service </a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free (even after your trial is over)</a></li><li><a href="https://www.tomsguide.com/round-up/best-apple-tv-apps">The best Apple TV apps and games right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 top new movies to stream this week on Netflix, Prime Video, HBO Max and more (Oct. 13-19) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There are plenty of new movies across the biggest <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> this week, including fresh flicks on Netflix, Prime Video, HBO Max and Apple TV. Not to mention, new arrivals on premium streaming fresh from movie theaters. </p><p>Netflix is dropping a star-studded comedy called "Sacrifice" that sees Anya Taylor-Joy play a cult leader who kidnaps a movie star, played by Chris Evans. Meanwhile, Prime Video offers two original picks: a new romantic drama with a trailer that promises tears, and a hilarious heist caper that brings a family dynamic to an audacious plan to steal the Mona Lisa. Or how about a new biographical movie on Apple TV, based on the first successful climb of Mount Everest?</p><p>That's just the start. You're spoilt for choice over the coming days, which is why I’ve picked out the most noteworthy new arrivals across streaming platforms to help you spend more time watching and less time scrolling. Plus, check out this article’s companion guide covering all the <a href="https://www.tomsguide.com/entertainment/streaming/7-biggest-new-shows-to-stream-this-week-including-the-return-of-netflixs-hit-political-thriller-and-a-marvel-series">top new TV shows this week </a>and <a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-watch-this-week-including-one-of-the-best-james-bond-movies-of-all-time-and-it-doesnt-star-daniel-craig-oct-13-19">3 new to Prime Video thriller movies</a> to watch this week. </p><h2 id="practical-magic-2-pvod">‘Practical Magic 2’ (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/Ho10_4IX1jE" allowfullscreen=""></iframe></div></div><p>The long-in-development follow-up to cult ‘90s fantasy comedy “Practical Magic” certainly cast a spell on fans; this sequel holds a mighty impressive 91% viewer score on <a href="https://www.rottentomatoes.com/m/practical_magic_2" target="_blank">Rotten Tomatoes</a>. Critics weren’t exactly wowed (its critical rating is much lower at a weak 36%), but “Practical Magic 2” was clearly made for the fans, and with original stars Sandra Bullock and Nicole Kidman returning, it delivers the witchy hijinks that made the original a cult favorite. </p><p>Set 28 years after the first “Practical Magic 2,” the Owens sisters (Bullock and Kidman) return, and their ancestral curse, which means that any man who falls in love with an Owens woman will die, is still plaguing the family. With the next generation of Owens now facing the curse’s cruel effects, the sisters must confront their past and break the spell once and for all. Dianne Wiest and Stockard Channing also reprise their original roles, with new cast members added to the magical mix, including Joey King, Lee Pace, Maisie Williams, and Xolo Maridueña.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GZKHL3GL" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 13</strong></em></p><h2 id="runner-pvod">‘Runner’ (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/M356E2ivvMs" allowfullscreen=""></iframe></div></div><p>Fans of buddy movies will want to <em>run</em> to their preferred premium streaming platform to stream “Runner” this week. Pairing Alan Ritchson, star of Prime Video’s “Reacher,” with 2000s comedy icon Owen Wilson, it’s an action comedy that succeeds thanks to strong chemistry between its unlikely leads and a commitment to over-the-top stunt sequences. It might not shake up the genre template, but it’s an enjoyable slice of blockbuster escapism. </p><p>Former special forces operative Hank Malone (Ritchson) now works as a “runner,” transporting high-value items for anybody who will pay him enough. Tasked with delivering an organ for transplant to a very sick child in hospital, he’s accompanied by an unlikely partner (Wilson), who is determined to ensure the job is done correctly. Things get hairy when they become the targets of a ruthless cartel, who want the precious organ for themselves.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HHB2S7WY" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 13</strong></em></p><h2 id="love-of-your-life-prime-video">‘Love of Your Life’ (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/HzGx48E64Xg" allowfullscreen=""></iframe></div></div><p>Prime Video has been all about romance lately, dropping originals like “The Last Sunrise” and “The Love Hypothesis” in recent weeks. That streak continues with “Love of Your Life,” another original movie that is sure to tug at your heartstrings. This one boasts quite the cast as well. It’s led by Margaret Qualley, Aaron Pierre and Patrick Schwarzenegger. And while he (sadly) doesn’t feature on screen, Ryan Gosling, a genre veteran, serves as a producer.</p><p>Like so many romantic dramas before it, “Love of Your Life” begins with an unexpected encounter between Maya (Qualley) and Charlie (Gabriel Basso). This sparks an intense romance and the possibilities of a blissful future. However, when this future is cruelly ripped away, Maya is forced to face that life doesn’t always play out as expected, and that finding the strength to love again can be the greatest challenge of all. You might want to bring tissues for this!</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HFJCW6VG" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> starting October 14</strong></em></p><h2 id="the-death-of-robin-hood-hbo-max">‘The Death of Robin Hood’ (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/tlSDDuWxO_0" allowfullscreen=""></iframe></div></div><p>Not to be confused with “The Uprising,” an Andrew Garfield-led historical drama that briefly claimed to be a Robin Hood movie in its pre-release marketing campaign, only to walk the claim back (the situation was <em>messy</em>), “The Death of Robin Hood” sees Hugh Jackman play the notorious outlaw. As the title implies, this story is set during his final days. It explores the man behind the myth and is adapted from a 17th-century ballad, “Robin Hood’s Death.”</p><p>Gravely injured after assisting his old friend, Little John (Bill Skarsgård), in retaking his land, legendary outlaw Robin Hood (Jackman) grapples with his violent past. A hero to some, a criminal to others, he’s left in the care of Sister Brigid (Jodie Comer) at a remote nunnery. As Robin faces the possibility of his impending death, he is offered an unexpected chance to repent.</p><p><em><strong>Watch on </strong></em><a href="https://www.hbomax.com/movie/3d1d52e1-4fe5-4d23-a198-b277197e949c" target="_blank" rel="nofollow"><em><strong>HBO Max</strong></em></a><em><strong> starting October 16</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODmwLX"></div>                            </div>                            <script src="https://kwizly.com/embed/ODmwLX.js" async=""></script><h2 id="sacrifice-netflix">‘Sacrifice’ (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/E_yVr35StzQ" allowfullscreen=""></iframe></div></div><p>It’s a good news and bad news situation with “Sacrifice,” Netflix’s new comedy-thriller. Let’s start with the positives. The cast list here is stacked. You’ve got Chris Evans, Anya Taylor-Joy, Vincent Cassel, Sam Richardson, John Malkovich and Salma Hayek. The downside? The movie’s reception at the Toronto International Film Festival last September was less than stellar, and has translated to a very disappointing 36% on <a href="https://www.rottentomatoes.com/m/sacrifice_2025" target="_blank">Rotten Tomatoes</a>. </p><p>The movie centers on a doomsday cult led by Joan (Taylor-Joy) and her siblings, who are convinced they must cleanse the Earth to prevent a volcanic apocalypse. To save humanity, they abduct three people, including a movie star making a comeback (Evans), with plans to sacrifice them as part of a ritual. As the night descends into chaos, the situation becomes increasingly messy, and the lines between savior and sacrifice start to blur.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81947357" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> starting October 16</strong></em></p><h2 id="masterplan-prime-video">‘Masterplan’ (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/gc0t8AfMP6k" allowfullscreen=""></iframe></div></div><p>Prime Video isn’t content with just the one original movie this week, as it’s also set to debut “Masterplan,” a heist caper that looks like a real blast. If a high-stakes theft wasn’t enough, this movie from director Thomas Vincent adds an extra wrinkle by mixing in some chaotic family drama. It looks like a hoot, and with Stanley Tucci playing the lead, consider me (cautiously) optimistic. </p><p>Tucci plays a legendary thief who sets his sights on the Mona Lisa, planning a daring heist of the Louvre museum in the French capital. To assist, he recruits two young helpers, a talented hacker (Simona Tabasco) and an explosives expert (Victor Belmondo), before revealing he is actually their estranged father. Turns out stealing the world’s most valuable painting might be the easy part; getting this fractured family working together is the real test.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HJGR59RZ" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> starting October 16</strong></em></p><h2 id="tenzing-apple-tv">‘Tenzing’ (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/KkYCY5YR12U" allowfullscreen=""></iframe></div></div><p>At the start of the month, Apple TV added “The Last First: Winter K2” to its library, an acclaimed documentary offering a fascinating insight into the world of high-stakes mountaineering. The streamer is following that doc up with “Tenzing,” a biographical drama that chronicles one of the most famous climbs in human history: Edmund Hillary’s summit of Mount Everest. </p><p>However, as the name suggests, while Hillary features (and is played by Tom Hiddleston), the focus of this biopic is on Tenzing Norgay (Genden Phuntsok), the gifted Himalayan climber who accompanied the New Zealand mountaineer to the top of the world’s tallest mountain. It’s a story of conflicting backgrounds, competing ambitions and a truly remarkable achievement in human history. Also starring Willem Dafoe as Colonel John Hunt, who led the 1953 expedition up Everest, “Tenzing” is an inspirational story about one of mankind’s greatest feats.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/tenzing/umc.cmc.6lic0hhuxkrbem0n29vzjopii" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting October 16</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-october-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix in October 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-feel-good-movies-new-on-prime-video-to-chase-away-the-sunday-scaries">3 feel-good movies new on Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/hbo-max-added-21-new-horror-movies-this-october-heres-the-2-classics-and-1-guilty-pleasure-im-watching-first">HBO Max added 21 new horror movies this October</a><strong> </strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/movies/7-top-new-movies-to-stream-this-week-on-netflix-prime-video-hbo-max-and-more-including-an-apocalyptic-comedy-with-chris-evans-and-anya-taylor-joy-oct-13-19</link>
                                                                            <description>
                            <![CDATA[ This week's top new movies on streaming include a heist caper on Prime Video, a dark comedy on Netflix, and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dNdSB2bqhndFyTCJrdyJ2d</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/T66C43MTggEzufyZM6veJ6-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 13 Oct 2026 04:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 13 Oct 2026 19:15:02 +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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/T66C43MTggEzufyZM6veJ6-1920-80.jpg">
                                                            <media:credit><![CDATA[Warner Bros. / Netflix / Black Bear Pictures / Angel Studios]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Nicole Kidman in Practical Magic 2, Chris Evans in Sacrifice and Alan Ritchson in Runner]]></media:description>                                                            <media:text><![CDATA[Nicole Kidman in Practical Magic 2, Chris Evans in Sacrifice and Alan Ritchson in Runner]]></media:text>
                                <media:title type="plain"><![CDATA[Nicole Kidman in Practical Magic 2, Chris Evans in Sacrifice and Alan Ritchson in Runner]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/T66C43MTggEzufyZM6veJ6-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There are plenty of new movies across the biggest <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> this week, including fresh flicks on Netflix, Prime Video, HBO Max and Apple TV. Not to mention, new arrivals on premium streaming fresh from movie theaters. </p><p>Netflix is dropping a star-studded comedy called "Sacrifice" that sees Anya Taylor-Joy play a cult leader who kidnaps a movie star, played by Chris Evans. Meanwhile, Prime Video offers two original picks: a new romantic drama with a trailer that promises tears, and a hilarious heist caper that brings a family dynamic to an audacious plan to steal the Mona Lisa. Or how about a new biographical movie on Apple TV, based on the first successful climb of Mount Everest?</p><p>That's just the start. You're spoilt for choice over the coming days, which is why I’ve picked out the most noteworthy new arrivals across streaming platforms to help you spend more time watching and less time scrolling. Plus, check out this article’s companion guide covering all the <a href="https://www.tomsguide.com/entertainment/streaming/7-biggest-new-shows-to-stream-this-week-including-the-return-of-netflixs-hit-political-thriller-and-a-marvel-series">top new TV shows this week </a>and <a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-watch-this-week-including-one-of-the-best-james-bond-movies-of-all-time-and-it-doesnt-star-daniel-craig-oct-13-19">3 new to Prime Video thriller movies</a> to watch this week. </p><h2 id="practical-magic-2-pvod">‘Practical Magic 2’ (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/Ho10_4IX1jE" allowfullscreen=""></iframe></div></div><p>The long-in-development follow-up to cult ‘90s fantasy comedy “Practical Magic” certainly cast a spell on fans; this sequel holds a mighty impressive 91% viewer score on <a href="https://www.rottentomatoes.com/m/practical_magic_2" target="_blank">Rotten Tomatoes</a>. Critics weren’t exactly wowed (its critical rating is much lower at a weak 36%), but “Practical Magic 2” was clearly made for the fans, and with original stars Sandra Bullock and Nicole Kidman returning, it delivers the witchy hijinks that made the original a cult favorite. </p><p>Set 28 years after the first “Practical Magic 2,” the Owens sisters (Bullock and Kidman) return, and their ancestral curse, which means that any man who falls in love with an Owens woman will die, is still plaguing the family. With the next generation of Owens now facing the curse’s cruel effects, the sisters must confront their past and break the spell once and for all. Dianne Wiest and Stockard Channing also reprise their original roles, with new cast members added to the magical mix, including Joey King, Lee Pace, Maisie Williams, and Xolo Maridueña.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GZKHL3GL" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 13</strong></em></p><h2 id="runner-pvod">‘Runner’ (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/M356E2ivvMs" allowfullscreen=""></iframe></div></div><p>Fans of buddy movies will want to <em>run</em> to their preferred premium streaming platform to stream “Runner” this week. Pairing Alan Ritchson, star of Prime Video’s “Reacher,” with 2000s comedy icon Owen Wilson, it’s an action comedy that succeeds thanks to strong chemistry between its unlikely leads and a commitment to over-the-top stunt sequences. It might not shake up the genre template, but it’s an enjoyable slice of blockbuster escapism. </p><p>Former special forces operative Hank Malone (Ritchson) now works as a “runner,” transporting high-value items for anybody who will pay him enough. Tasked with delivering an organ for transplant to a very sick child in hospital, he’s accompanied by an unlikely partner (Wilson), who is determined to ensure the job is done correctly. Things get hairy when they become the targets of a ruthless cartel, who want the precious organ for themselves.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HHB2S7WY" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 13</strong></em></p><h2 id="love-of-your-life-prime-video">‘Love of Your Life’ (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/HzGx48E64Xg" allowfullscreen=""></iframe></div></div><p>Prime Video has been all about romance lately, dropping originals like “The Last Sunrise” and “The Love Hypothesis” in recent weeks. That streak continues with “Love of Your Life,” another original movie that is sure to tug at your heartstrings. This one boasts quite the cast as well. It’s led by Margaret Qualley, Aaron Pierre and Patrick Schwarzenegger. And while he (sadly) doesn’t feature on screen, Ryan Gosling, a genre veteran, serves as a producer.</p><p>Like so many romantic dramas before it, “Love of Your Life” begins with an unexpected encounter between Maya (Qualley) and Charlie (Gabriel Basso). This sparks an intense romance and the possibilities of a blissful future. However, when this future is cruelly ripped away, Maya is forced to face that life doesn’t always play out as expected, and that finding the strength to love again can be the greatest challenge of all. You might want to bring tissues for this!</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HFJCW6VG" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> starting October 14</strong></em></p><h2 id="the-death-of-robin-hood-hbo-max">‘The Death of Robin Hood’ (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/tlSDDuWxO_0" allowfullscreen=""></iframe></div></div><p>Not to be confused with “The Uprising,” an Andrew Garfield-led historical drama that briefly claimed to be a Robin Hood movie in its pre-release marketing campaign, only to walk the claim back (the situation was <em>messy</em>), “The Death of Robin Hood” sees Hugh Jackman play the notorious outlaw. As the title implies, this story is set during his final days. It explores the man behind the myth and is adapted from a 17th-century ballad, “Robin Hood’s Death.”</p><p>Gravely injured after assisting his old friend, Little John (Bill Skarsgård), in retaking his land, legendary outlaw Robin Hood (Jackman) grapples with his violent past. A hero to some, a criminal to others, he’s left in the care of Sister Brigid (Jodie Comer) at a remote nunnery. As Robin faces the possibility of his impending death, he is offered an unexpected chance to repent.</p><p><em><strong>Watch on </strong></em><a href="https://www.hbomax.com/movie/3d1d52e1-4fe5-4d23-a198-b277197e949c" target="_blank" rel="nofollow"><em><strong>HBO Max</strong></em></a><em><strong> starting October 16</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODmwLX"></div>                            </div>                            <script src="https://kwizly.com/embed/ODmwLX.js" async=""></script><h2 id="sacrifice-netflix">‘Sacrifice’ (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/E_yVr35StzQ" allowfullscreen=""></iframe></div></div><p>It’s a good news and bad news situation with “Sacrifice,” Netflix’s new comedy-thriller. Let’s start with the positives. The cast list here is stacked. You’ve got Chris Evans, Anya Taylor-Joy, Vincent Cassel, Sam Richardson, John Malkovich and Salma Hayek. The downside? The movie’s reception at the Toronto International Film Festival last September was less than stellar, and has translated to a very disappointing 36% on <a href="https://www.rottentomatoes.com/m/sacrifice_2025" target="_blank">Rotten Tomatoes</a>. </p><p>The movie centers on a doomsday cult led by Joan (Taylor-Joy) and her siblings, who are convinced they must cleanse the Earth to prevent a volcanic apocalypse. To save humanity, they abduct three people, including a movie star making a comeback (Evans), with plans to sacrifice them as part of a ritual. As the night descends into chaos, the situation becomes increasingly messy, and the lines between savior and sacrifice start to blur.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81947357" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> starting October 16</strong></em></p><h2 id="masterplan-prime-video">‘Masterplan’ (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/gc0t8AfMP6k" allowfullscreen=""></iframe></div></div><p>Prime Video isn’t content with just the one original movie this week, as it’s also set to debut “Masterplan,” a heist caper that looks like a real blast. If a high-stakes theft wasn’t enough, this movie from director Thomas Vincent adds an extra wrinkle by mixing in some chaotic family drama. It looks like a hoot, and with Stanley Tucci playing the lead, consider me (cautiously) optimistic. </p><p>Tucci plays a legendary thief who sets his sights on the Mona Lisa, planning a daring heist of the Louvre museum in the French capital. To assist, he recruits two young helpers, a talented hacker (Simona Tabasco) and an explosives expert (Victor Belmondo), before revealing he is actually their estranged father. Turns out stealing the world’s most valuable painting might be the easy part; getting this fractured family working together is the real test.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HJGR59RZ" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> starting October 16</strong></em></p><h2 id="tenzing-apple-tv">‘Tenzing’ (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/KkYCY5YR12U" allowfullscreen=""></iframe></div></div><p>At the start of the month, Apple TV added “The Last First: Winter K2” to its library, an acclaimed documentary offering a fascinating insight into the world of high-stakes mountaineering. The streamer is following that doc up with “Tenzing,” a biographical drama that chronicles one of the most famous climbs in human history: Edmund Hillary’s summit of Mount Everest. </p><p>However, as the name suggests, while Hillary features (and is played by Tom Hiddleston), the focus of this biopic is on Tenzing Norgay (Genden Phuntsok), the gifted Himalayan climber who accompanied the New Zealand mountaineer to the top of the world’s tallest mountain. It’s a story of conflicting backgrounds, competing ambitions and a truly remarkable achievement in human history. Also starring Willem Dafoe as Colonel John Hunt, who led the 1953 expedition up Everest, “Tenzing” is an inspirational story about one of mankind’s greatest feats.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/tenzing/umc.cmc.6lic0hhuxkrbem0n29vzjopii" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting October 16</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-october-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix in October 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-feel-good-movies-new-on-prime-video-to-chase-away-the-sunday-scaries">3 feel-good movies new on Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/hbo-max-added-21-new-horror-movies-this-october-heres-the-2-classics-and-1-guilty-pleasure-im-watching-first">HBO Max added 21 new horror movies this October</a><strong> </strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I thought I knew what Formula 1 sounded like on TV — then I heard Apple TV's Dolby Atmos mix ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I became a motorsports fan the moment I took my seat in the stands at my first NASCAR race. There’s a visceral, chest-thumping rumble you get at a live track. It’s a vibration so deep and, dare I say, addictive, that it instantly hooks you. In fact, had I not experienced this extraordinary physical feeling in person, I’m not sure I’d be committing my Sundays to following races year after year.</p><p>For decades, home broadcasts have struggled to replicate this sense of immersion. TV mixes flatten the roar of the engines into a background buzz, prioritizing the commentary booth. And while no living room setup will ever replace thousands of horsepower rattling your ribcage, enjoying Formula 1 at home is about to sound a lot more legitimate.</p><p>Starting at the United States Grand Prix in Austin, Apple TV is bringing live Dolby Atmos spatial audio to Formula 1 in a deliberate step toward bridging the gap between <em>watching</em> a race and <em>feeling</em> like you're there.</p><h2 id="f1-in-dolby-atmos-what-s-the-difference">F1 in Dolby Atmos: What’s the difference?</h2><p>With Apple TV’s Dolby Atmos integration, an audio engineer will be mixing the soundscape in real-time. Instead of a single static stereo track, individual audio elements are placed in a three-dimensional space around the listener.</p><p>For purists who prefer raw engine notes over race analysis, Apple TV even allows viewers to disable the broadcast commentary entirely, leaving only pure, unadulterated track sound effects and onboard audio.</p><div><blockquote><p>"Normally, it takes me a second to process what happened. With Atmos, that reaction felt almost instantaneous."</p></blockquote></div><p>During a side-by-side demo comparing standard stereo with Dolby Atmos using Miami Grand Prix footage, I heard the difference. As the five red starting lights illuminated, the famous "pings" resonated with crisp precision. </p><p>The grid accelerated toward Turn 1, and the swell of twenty revving engines sounded hyper-detailed, almost reminiscent of high-budget film Foley sound design.</p><p>Switching to onboard driver cameras, the audio snapped directly inside the cockpit, delivering the violent howl of the power unit and the impact of the car attacking the kerb.</p><p>Then, during Max Verstappen’s spin-out, the difference became even more obvious. The screech of the tires and sudden shift in the soundscape made it immediately clear that something had gone wrong. Normally, it takes me a second to process and a replay angle before I register what happened. With Atmos, that reaction felt almost instantaneous, as if the audio was giving me information before the visuals had fully caught up.</p><h2 id="dolby-atmos-debuts-at-austin">Dolby Atmos debuts at Austin</h2><p>Apple TV’s Dolby Atmos experience debuts during the United States Grand Prix at Circuit of the Americas in Austin. The spatial stream will be available across practice, qualifying, Sprint, and Grand Prix sessions for viewers using supported Apple devices, <a href="https://www.tomsguide.com/best-picks/best-dolby-atmos-soundbars">Dolby Atmos soundbars</a> and home theater setups.</p><p>For motorsport fans, Dolby Atmos still won’t recreate the feeling of thousands of horsepower rattling your ribcage from the grandstands. But in Austin, turning off the commentary and letting the engines, tires and onboard audio fill the room might be the closest a home broadcast has come to capturing what makes hearing a race in person so addictive.</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/how-to-watch-formula-1-on-apple-tv">How to watch Formula 1 on Apple TV</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-report-card-2026-do-prestige-tv-shows-make-up-for-a-tiny-library">Apple TV Report Card 2026: The results are in</a></li><li><a href="https://www.tomsguide.com/vehicle-tech/i-raced-the-ford-mustang-dark-horse-2024-and-this-car-is-seriously-fast">I raced the Ford Mustang Dark Horse and this car is seriously fast</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/sports/i-thought-i-knew-what-formula-1-sounded-like-on-tv-then-i-heard-apple-tvs-dolby-atmos-mix</link>
                                                                            <description>
                            <![CDATA[ Ahead of the Austin Grand Prix, Apple TV is introducing real-time Dolby Atmos audio mixing for Formula 1. Here's what the difference in sound is actually like. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NZ3R8Wum5P4TVGPut7XUX6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/c9jnUd9KrfzTDDQPMSxPDR-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Wed, 07 Oct 2026 20:40:57 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sports]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Kate Kozuch ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xAVUdx6Qtp3SzugnnfNYsL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kate Kozuch is a managing editor of social and video at Tom&#039;s Guide, where she&#039;s been with the team since 2019. She also reviews smartwatches, covers TVs, tests the latest audio products and dabbles in cooking appliances. Of course, that&#039;s not when she&#039;s working on building the &lt;a href=&quot;https://www.tomsguide.com/reference/smart-home-guide&quot;&gt;ultimate DIY smart home&lt;/a&gt;. She has conducted over 100 different product reviews across these categories, turning her findings into buying guides and face-offs. She also manages a number of gift guides on the site. &lt;/p&gt;&lt;p&gt;Kate has a strong on-camera presence as well. She has appeared on Cheddar and Fox 5 NY to talk trending tech news. She is also regularly featured on the Tom&#039;s Guide YouTube channel, runs the &lt;a href=&quot;https://www.tiktok.com/@tomsguide?lang=en&quot;&gt;Tom&#039;s Guide TikTok account&lt;/a&gt; with over 350,000 followers, and features all the tech she&#039;s testing &lt;a href=&quot;https://www.instagram.com/katekozuch/&quot;&gt;on her Instagram&lt;/a&gt;. When she’s not filming tech videos, you can find her taking up a new sport, mastering the NYT Crossword or channeling her inner celebrity chef. Speaking of, be sure to ask her about the time Guy Fieri made her a margarita at CES, or when her video of Martha Stewart drinking a margarita went mega-viral. Clearly, Kate has a thing for culinary icons and margaritas.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/c9jnUd9KrfzTDDQPMSxPDR-1920-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Formula 1 on Apple TV with Dolby Atmos]]></media:description>                                                            <media:text><![CDATA[Formula 1 on Apple TV with Dolby Atmos]]></media:text>
                                <media:title type="plain"><![CDATA[Formula 1 on Apple TV with Dolby Atmos]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/c9jnUd9KrfzTDDQPMSxPDR-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I became a motorsports fan the moment I took my seat in the stands at my first NASCAR race. There’s a visceral, chest-thumping rumble you get at a live track. It’s a vibration so deep and, dare I say, addictive, that it instantly hooks you. In fact, had I not experienced this extraordinary physical feeling in person, I’m not sure I’d be committing my Sundays to following races year after year.</p><p>For decades, home broadcasts have struggled to replicate this sense of immersion. TV mixes flatten the roar of the engines into a background buzz, prioritizing the commentary booth. And while no living room setup will ever replace thousands of horsepower rattling your ribcage, enjoying Formula 1 at home is about to sound a lot more legitimate.</p><p>Starting at the United States Grand Prix in Austin, Apple TV is bringing live Dolby Atmos spatial audio to Formula 1 in a deliberate step toward bridging the gap between <em>watching</em> a race and <em>feeling</em> like you're there.</p><h2 id="f1-in-dolby-atmos-what-s-the-difference">F1 in Dolby Atmos: What’s the difference?</h2><p>With Apple TV’s Dolby Atmos integration, an audio engineer will be mixing the soundscape in real-time. Instead of a single static stereo track, individual audio elements are placed in a three-dimensional space around the listener.</p><p>For purists who prefer raw engine notes over race analysis, Apple TV even allows viewers to disable the broadcast commentary entirely, leaving only pure, unadulterated track sound effects and onboard audio.</p><div><blockquote><p>"Normally, it takes me a second to process what happened. With Atmos, that reaction felt almost instantaneous."</p></blockquote></div><p>During a side-by-side demo comparing standard stereo with Dolby Atmos using Miami Grand Prix footage, I heard the difference. As the five red starting lights illuminated, the famous "pings" resonated with crisp precision. </p><p>The grid accelerated toward Turn 1, and the swell of twenty revving engines sounded hyper-detailed, almost reminiscent of high-budget film Foley sound design.</p><p>Switching to onboard driver cameras, the audio snapped directly inside the cockpit, delivering the violent howl of the power unit and the impact of the car attacking the kerb.</p><p>Then, during Max Verstappen’s spin-out, the difference became even more obvious. The screech of the tires and sudden shift in the soundscape made it immediately clear that something had gone wrong. Normally, it takes me a second to process and a replay angle before I register what happened. With Atmos, that reaction felt almost instantaneous, as if the audio was giving me information before the visuals had fully caught up.</p><h2 id="dolby-atmos-debuts-at-austin">Dolby Atmos debuts at Austin</h2><p>Apple TV’s Dolby Atmos experience debuts during the United States Grand Prix at Circuit of the Americas in Austin. The spatial stream will be available across practice, qualifying, Sprint, and Grand Prix sessions for viewers using supported Apple devices, <a href="https://www.tomsguide.com/best-picks/best-dolby-atmos-soundbars">Dolby Atmos soundbars</a> and home theater setups.</p><p>For motorsport fans, Dolby Atmos still won’t recreate the feeling of thousands of horsepower rattling your ribcage from the grandstands. But in Austin, turning off the commentary and letting the engines, tires and onboard audio fill the room might be the closest a home broadcast has come to capturing what makes hearing a race in person so addictive.</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/how-to-watch-formula-1-on-apple-tv">How to watch Formula 1 on Apple TV</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-report-card-2026-do-prestige-tv-shows-make-up-for-a-tiny-library">Apple TV Report Card 2026: The results are in</a></li><li><a href="https://www.tomsguide.com/vehicle-tech/i-raced-the-ford-mustang-dark-horse-2024-and-this-car-is-seriously-fast">I raced the Ford Mustang Dark Horse and this car is seriously fast</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 top new movies to stream this week on Netflix, Hulu, Apple TV and more — including the latest Spider-Man film and some spooky Halloween picks (Oct. 6-12) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This week’s lineup of <strong>new movies</strong> across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming service</a>s has been set, and there’s plenty to watch with arrivals on Netflix, Apple TV, Hulu, Peacock and new releases straight from your nearest movie theater heading to premium streaming platforms (PVOD). </p><p>There’s no doubt about the headliner this week; it’s <strong>“Spider-Man: Brand New Day.”</strong> The webslinger is winding down his latest extraordinary theatrical run, and on Oct. 6, Tom Holland’s fourth solo outing as Spidey will be available on digital. Meanwhile, Netflix has a new crime thriller, <strong>"Animals,"</strong> starring and directed by Ben Affleck, Apple TV has an action-comedy based on a nostalgic Mattel toy line, and Hulu is getting one of the spookiest horror movies I’ve seen in 2026.</p><p>You don’t need to waste precious movie-watching time figuring out what’s new on each service, as I’ve collected the most noteworthy picks down below. Plus, don’t forget to check out our companion guide covering all the <a href="https://www.tomsguide.com/entertainment/streaming/6-biggest-new-shows-to-stream-this-week-including-a-netflix-sea-thriller">top new TV shows to stream this week</a>.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="spider-man-brand-new-day-pvod">‘Spider-Man: Brand New 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/62bIsvRcPv0" allowfullscreen=""></iframe></div></div><p>Tom Holland’s latest solo outing as Spider-Man scaled new heights over the summer, becoming not just the highest-grossing Spidey flick ever, but the highest-grossing movie of all time in North America. If there was any question about the world’s favorite superhero, the web-crawler just put the debate to bed. And remarkably, “Brand New Day” isn’t all hype. It’s an excellent summer blockbuster filled with action, comedy and heart. </p><p>Set in the wake of the world forgetting Peter Parker’s identity post “No Way Home,” Peter (Holland) is now dedicated full-time to protecting  New York City. Operating as a hero without the support of his former girlfriend, MJ (Zendaya), and best friend, Ned (Jacob Batalon), Peter's powers evolve in strange ways. Plus, he also faces a new threat to the city: a mysterious villain with powerful telekinetic abilities.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H8PJM68W" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 6</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG2KEX"></div>                            </div>                            <script src="https://kwizly.com/embed/eG2KEX.js" async=""></script><h2 id="insidious-out-of-the-further-pvod">‘Insidious: Out of the Further’ (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/jxU8FU3o75A" allowfullscreen=""></iframe></div></div><p>2023’s “Insidious: The Red Door” felt like a capper on the supernatural horror series, but Hollywood is never one to stop milking a series where there is still money on the table. And so, we have “Out of the Further,” the sixth installment in the spooky series that promised to breathe new life into the Insidious franchise but is ultimately a run-of-the-mill sequel. That’s fine if you merely want some jump scares in the lead-up to Halloween, but don’t expect more than cheap thrills.</p><p>With the story of the Lambert family concluded (for now, at least), “Out of the Further” centers on newcomer Gemma (Amelia Eve), a young mother who can travel the franchise’s trademark ghostly dimensions, the Further. But even more importantly, she can also bring objects and sinister entities from the Further back into our real world. Once a powerful demon learns of her unique power, they attempt to use Gemma for their own evil means.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HC7C8V4Q" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 6</strong></em></p><h2 id="fall-2-deadpoint-pvod">‘Fall 2: Deadpoint’ (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/Rsztt5qDj_A" allowfullscreen=""></iframe></div></div><p>“Fall 2: Deadpoint” lands squarely in the unnecessary sequel bucket. The original was a palm-sweating watch and centered on two friends trapped thousands of feet in the air on a rickety radio tower. The sequel attempts to offer the same vertigo-inducing thrills, but a weak third act and an ill-judged attempt to link the proceedings to its predecessor sink this sequel. Still, there are at least some hair-raising moments that convey a terrifying sense of height.</p><p>New protagonist, Jax (Harriet Slater), sister of “Fall’s” Shiloh, is convinced by friends of her deceased sibling, Luce (Arsema Thomas), to accompany her on a dangerous plank walk on Mount Kawn in Thailand. 3,000 feet in the air, with only creaking wooden boards for support, a sudden rock slide leaves them stranded on the mountain with no hope of rescue. The two women have to summon their strength to find a way off the mountain and back to safety. </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HFRKHZ9J" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 6</strong></em></p><h2 id="animals-netflix">‘Animals’ (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/mlBfQJ8oxB0" allowfullscreen=""></iframe></div></div><p>Netflix’s “Animals” sees Ben Affleck take charge in front of and behind the camera, playing the lead role and serving as director. While Netflix’s original slate has been a real mixed bag so far in 2026, there’s good reason to be confident about this one. Affleck has a strong track record as a thriller filmmaker, having helmed “Gone Baby Gone,” “The Town” and “Argo,” the latter even winning Best Picture at the Oscars. Here’s hoping “Animals” is another winner. </p><p>Mark Kimball (Affleck) is a Los Angeles mayoral candidate who has poured all of his and his wife’s (Kerry Washington) money into campaigning. So, when their son is kidnapped and the criminals demand a hefty ransom for his return, Mark becomes desperate. To get money quickly, he turns to the city’s underbelly, unleashing a side of his character that was never supposed to see the light of day.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81757047" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> starting October 9</strong></em></p><h2 id="disclosure-day-peacock">‘Disclosure Day’ (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/SCYT8vb2siQ" allowfullscreen=""></iframe></div></div><p>Steven Spielberg is one of the titans of the sci-fi genre. “Jurassic Park,” “E.T. the Extraterrestrial,” and “Close Encounters of the Third Kind” are just some of the iconic genre efforts to his name. So, anytime Spielberg plays in the sci-fi sandbox, the movie world takes notice. “Disclosure Day” is another excellent sci-fi effort from Spielberg that combines thriller suspense with an appealing curiosity about our universe and humanity's place within it.</p><p>Margaret Fairchild (Emily Blunt) is a TV weather reporter who, while on air, starts speaking in a strange, alien language. This brings her to the attention of a shadowy organization, led by Noah Scanlon (Colin Firth). Soon enough, she teams up with a cybersecurity expert (Josh O’Connor), and the two go on the run as the org hunts them down. Their mission is to expose government secrets covering up humanity’s history of extraterrestrial contact.</p><p><em><strong>Watch on </strong></em><a href="https://www.peacocktv.com/stream-movies/disclosure-day" target="_blank" rel="nofollow"><em><strong>Peacock</strong></em></a><em><strong> starting October 9</strong></em></p><h2 id="matchbox-the-movie-apple-tv">‘Matchbox: The Movie’ (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/7xfqITrMDcI" allowfullscreen=""></iframe></div></div><p>It would seem the lesson Hollywood learned from the juggernaut success of “Barbie” was to make more movies based on beloved children’s toys. And so, we’ve now got a new action-comedy blockbuster based on Matchbox, Mattel’s line of miniature die-cast vehicles. Now, I have to break some bad news: in this cinematic spin on Matchbox, the cars are normal-sized, which, in my eyes, makes this look like little more than a generic “Fast and Furious” clone.</p><p>Starring John Cena, who is no stranger to the Fast franchise, having played Jakob Toretto (brother of Vin Diesel’s Dom), “Matchbox: The Movie” centers on Sean Walker, a former soldier, who reunites with his childhood friends, only to get mixed up in a plot to steal nuclear warheads. Unwittingly caught up in an international conspiracy, they need to clear their names, save the world, and drive a series of suped-up motor vehicles very, very fast.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/matchbox-the-movie/umc.cmc.31qa8j1tn2cnpyk3fx43w928d" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting October 9</strong></em></p><h2 id="hokum-hulu">‘Hokum’ (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/qU_i5e48KzQ" allowfullscreen=""></iframe></div></div><p>Anybody on the hunt for great <em>new </em>horror movies for Halloween 2026 should check out my recent roundup. One of my inclusions was “Hokum,” so I’m pleased to see it head to Hulu this week. Released in the spring, this Damian McCarthy horror got overlooked as “Backrooms” and “Obsession” dominated multiplexes. But this chiller is spookier than both, and even as a dedicated horror watcher, I found myself getting very creeped out.</p><p>Cynical American novelist Ohm Bauman (Adam Scott) suffers from crippling writer’s block as he attempts to wrap up his popular book series. He takes a trip to rural Ireland, to the hotel his parents once honeymooned, to scatter their ashes and clear his head. But once in the Irish countryside, he learns of a local legend about a witch that haunts the hotel’s plush suite. Plagued by disturbing visions, he investigates the haunting, with chilling results.</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 October 10</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/netflix/new-on-netflix-october-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix October 2026</a></li><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/movies/ive-watched-23-new-horror-movies-in-2026-these-are-the-5-you-need-to-stream-this-halloween">I’ve seen 23 new horror movies in 2026 —  here's my top 5</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/movies/7-top-new-movies-to-stream-this-week-on-netflix-hulu-apple-tv-and-more-including-the-latest-spider-man-film-and-some-spooky-halloween-picks-oct-6-12</link>
                                                                            <description>
                            <![CDATA[ This week's slate of top new movies includes "Spider-Man: Brand New Day" and Netflix's latest original crime thriller. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Lvf2VLZiVVk4u7szg5Dpzj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Lk9gJDmeMnFu57thAhhrFQ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 06 Oct 2026 04:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 06 Oct 2026 18:20:24 +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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Lk9gJDmeMnFu57thAhhrFQ-1920-80.jpg">
                                                            <media:credit><![CDATA[Sony Pictures/Marvel]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Spider-Man (Tom Holland) swinging through the sky in a still from &quot;Spider-Man: Brand New Day&quot;]]></media:description>                                                            <media:text><![CDATA[Spider-Man (Tom Holland) swinging through the sky in a still from &quot;Spider-Man: Brand New Day&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Spider-Man (Tom Holland) swinging through the sky in a still from &quot;Spider-Man: Brand New Day&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Lk9gJDmeMnFu57thAhhrFQ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week’s lineup of <strong>new movies</strong> across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming service</a>s has been set, and there’s plenty to watch with arrivals on Netflix, Apple TV, Hulu, Peacock and new releases straight from your nearest movie theater heading to premium streaming platforms (PVOD). </p><p>There’s no doubt about the headliner this week; it’s <strong>“Spider-Man: Brand New Day.”</strong> The webslinger is winding down his latest extraordinary theatrical run, and on Oct. 6, Tom Holland’s fourth solo outing as Spidey will be available on digital. Meanwhile, Netflix has a new crime thriller, <strong>"Animals,"</strong> starring and directed by Ben Affleck, Apple TV has an action-comedy based on a nostalgic Mattel toy line, and Hulu is getting one of the spookiest horror movies I’ve seen in 2026.</p><p>You don’t need to waste precious movie-watching time figuring out what’s new on each service, as I’ve collected the most noteworthy picks down below. Plus, don’t forget to check out our companion guide covering all the <a href="https://www.tomsguide.com/entertainment/streaming/6-biggest-new-shows-to-stream-this-week-including-a-netflix-sea-thriller">top new TV shows to stream this week</a>.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="spider-man-brand-new-day-pvod">‘Spider-Man: Brand New 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/62bIsvRcPv0" allowfullscreen=""></iframe></div></div><p>Tom Holland’s latest solo outing as Spider-Man scaled new heights over the summer, becoming not just the highest-grossing Spidey flick ever, but the highest-grossing movie of all time in North America. If there was any question about the world’s favorite superhero, the web-crawler just put the debate to bed. And remarkably, “Brand New Day” isn’t all hype. It’s an excellent summer blockbuster filled with action, comedy and heart. </p><p>Set in the wake of the world forgetting Peter Parker’s identity post “No Way Home,” Peter (Holland) is now dedicated full-time to protecting  New York City. Operating as a hero without the support of his former girlfriend, MJ (Zendaya), and best friend, Ned (Jacob Batalon), Peter's powers evolve in strange ways. Plus, he also faces a new threat to the city: a mysterious villain with powerful telekinetic abilities.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H8PJM68W" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 6</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG2KEX"></div>                            </div>                            <script src="https://kwizly.com/embed/eG2KEX.js" async=""></script><h2 id="insidious-out-of-the-further-pvod">‘Insidious: Out of the Further’ (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/jxU8FU3o75A" allowfullscreen=""></iframe></div></div><p>2023’s “Insidious: The Red Door” felt like a capper on the supernatural horror series, but Hollywood is never one to stop milking a series where there is still money on the table. And so, we have “Out of the Further,” the sixth installment in the spooky series that promised to breathe new life into the Insidious franchise but is ultimately a run-of-the-mill sequel. That’s fine if you merely want some jump scares in the lead-up to Halloween, but don’t expect more than cheap thrills.</p><p>With the story of the Lambert family concluded (for now, at least), “Out of the Further” centers on newcomer Gemma (Amelia Eve), a young mother who can travel the franchise’s trademark ghostly dimensions, the Further. But even more importantly, she can also bring objects and sinister entities from the Further back into our real world. Once a powerful demon learns of her unique power, they attempt to use Gemma for their own evil means.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HC7C8V4Q" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 6</strong></em></p><h2 id="fall-2-deadpoint-pvod">‘Fall 2: Deadpoint’ (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/Rsztt5qDj_A" allowfullscreen=""></iframe></div></div><p>“Fall 2: Deadpoint” lands squarely in the unnecessary sequel bucket. The original was a palm-sweating watch and centered on two friends trapped thousands of feet in the air on a rickety radio tower. The sequel attempts to offer the same vertigo-inducing thrills, but a weak third act and an ill-judged attempt to link the proceedings to its predecessor sink this sequel. Still, there are at least some hair-raising moments that convey a terrifying sense of height.</p><p>New protagonist, Jax (Harriet Slater), sister of “Fall’s” Shiloh, is convinced by friends of her deceased sibling, Luce (Arsema Thomas), to accompany her on a dangerous plank walk on Mount Kawn in Thailand. 3,000 feet in the air, with only creaking wooden boards for support, a sudden rock slide leaves them stranded on the mountain with no hope of rescue. The two women have to summon their strength to find a way off the mountain and back to safety. </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0HFRKHZ9J" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting October 6</strong></em></p><h2 id="animals-netflix">‘Animals’ (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/mlBfQJ8oxB0" allowfullscreen=""></iframe></div></div><p>Netflix’s “Animals” sees Ben Affleck take charge in front of and behind the camera, playing the lead role and serving as director. While Netflix’s original slate has been a real mixed bag so far in 2026, there’s good reason to be confident about this one. Affleck has a strong track record as a thriller filmmaker, having helmed “Gone Baby Gone,” “The Town” and “Argo,” the latter even winning Best Picture at the Oscars. Here’s hoping “Animals” is another winner. </p><p>Mark Kimball (Affleck) is a Los Angeles mayoral candidate who has poured all of his and his wife’s (Kerry Washington) money into campaigning. So, when their son is kidnapped and the criminals demand a hefty ransom for his return, Mark becomes desperate. To get money quickly, he turns to the city’s underbelly, unleashing a side of his character that was never supposed to see the light of day.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81757047" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> starting October 9</strong></em></p><h2 id="disclosure-day-peacock">‘Disclosure Day’ (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/SCYT8vb2siQ" allowfullscreen=""></iframe></div></div><p>Steven Spielberg is one of the titans of the sci-fi genre. “Jurassic Park,” “E.T. the Extraterrestrial,” and “Close Encounters of the Third Kind” are just some of the iconic genre efforts to his name. So, anytime Spielberg plays in the sci-fi sandbox, the movie world takes notice. “Disclosure Day” is another excellent sci-fi effort from Spielberg that combines thriller suspense with an appealing curiosity about our universe and humanity's place within it.</p><p>Margaret Fairchild (Emily Blunt) is a TV weather reporter who, while on air, starts speaking in a strange, alien language. This brings her to the attention of a shadowy organization, led by Noah Scanlon (Colin Firth). Soon enough, she teams up with a cybersecurity expert (Josh O’Connor), and the two go on the run as the org hunts them down. Their mission is to expose government secrets covering up humanity’s history of extraterrestrial contact.</p><p><em><strong>Watch on </strong></em><a href="https://www.peacocktv.com/stream-movies/disclosure-day" target="_blank" rel="nofollow"><em><strong>Peacock</strong></em></a><em><strong> starting October 9</strong></em></p><h2 id="matchbox-the-movie-apple-tv">‘Matchbox: The Movie’ (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/7xfqITrMDcI" allowfullscreen=""></iframe></div></div><p>It would seem the lesson Hollywood learned from the juggernaut success of “Barbie” was to make more movies based on beloved children’s toys. And so, we’ve now got a new action-comedy blockbuster based on Matchbox, Mattel’s line of miniature die-cast vehicles. Now, I have to break some bad news: in this cinematic spin on Matchbox, the cars are normal-sized, which, in my eyes, makes this look like little more than a generic “Fast and Furious” clone.</p><p>Starring John Cena, who is no stranger to the Fast franchise, having played Jakob Toretto (brother of Vin Diesel’s Dom), “Matchbox: The Movie” centers on Sean Walker, a former soldier, who reunites with his childhood friends, only to get mixed up in a plot to steal nuclear warheads. Unwittingly caught up in an international conspiracy, they need to clear their names, save the world, and drive a series of suped-up motor vehicles very, very fast.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/matchbox-the-movie/umc.cmc.31qa8j1tn2cnpyk3fx43w928d" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting October 9</strong></em></p><h2 id="hokum-hulu">‘Hokum’ (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/qU_i5e48KzQ" allowfullscreen=""></iframe></div></div><p>Anybody on the hunt for great <em>new </em>horror movies for Halloween 2026 should check out my recent roundup. One of my inclusions was “Hokum,” so I’m pleased to see it head to Hulu this week. Released in the spring, this Damian McCarthy horror got overlooked as “Backrooms” and “Obsession” dominated multiplexes. But this chiller is spookier than both, and even as a dedicated horror watcher, I found myself getting very creeped out.</p><p>Cynical American novelist Ohm Bauman (Adam Scott) suffers from crippling writer’s block as he attempts to wrap up his popular book series. He takes a trip to rural Ireland, to the hotel his parents once honeymooned, to scatter their ashes and clear his head. But once in the Irish countryside, he learns of a local legend about a witch that haunts the hotel’s plush suite. Plagued by disturbing visions, he investigates the haunting, with chilling results.</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 October 10</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/netflix/new-on-netflix-october-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix October 2026</a></li><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/movies/ive-watched-23-new-horror-movies-in-2026-these-are-the-5-you-need-to-stream-this-halloween">I’ve seen 23 new horror movies in 2026 —  here's my top 5</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tore my living room apart looking for the Apple TV remote my son hid — until this iPhone feature saved the day ]]></title>
                                                                                                <dc:content><![CDATA[ <p>My 11-month old son is obsessed with my <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K remote</a>. It used to be that he just wanted to chew it, which isn't ideal since it's made of metal, but these days he's started actively playing with it and pressing buttons. Unfortunately, this also means the remote is starting to go missing quite a lot.</p><p>It feels like it ends up in that dimension that is only accessible to socks in the dryer and objects your kids were holding before you turned your back for two seconds. Thankfully, unlike most remotes, the Apple TV remote has a way to let you track it down — and I'm not talking about those <a href="https://www.tomsguide.com/opinion/this-is-the-best-apple-tv-remote-case-and-apple-should-totally-steal-its-best-idea">bulky cases that attach an AirTag</a> to it, either. It all relies on this hidden iPhone feature.</p><h2 id="how-to-hunt-down-your-missing-apple-tv-remote">How to hunt down your missing Apple TV remote</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fbjCxzGoqQYSXRYyMFdHVc" name="PXL_20260930_153208400" alt="apple tv 4k remote finder" src="https://cdn.mos.cms.futurecdn.net/fbjCxzGoqQYSXRYyMFdHVc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Normally if you're missing an Apple device, your first idea would be to jump into the Find My Device app and look there. It's how you track down AirTags, phones, tablets and even some Apple Pencils — among other things. The Apple TV remote, specifically the third generation Siri remote, does not include that level of support.</p><p>That's not to say you are stuck if your Apple TV remote falls down the back of the couch, or into the fourth dimension where it's impossible to see no matter how hard you look. Because the Apple TV app actually has a feature to locate it. It's similar to the precision tracking Apple already offers for other devices, even if it isn't quite as accurate.</p><p>Here's how it works:</p><section class="howto-block">                    <h3>1. Open the Apple TV Remote app</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/Xw3BDK92Q2BEuq3QWZXzeK.jpg"                                        alt="apple tv 4k remote finder feature"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/Xw3BDK92Q2BEuq3QWZXzeK.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The Apple TV Remote app isn't a standalone app in your app list, but you can access it from the <strong>Search bar</strong> at the bottom of your home screen — or via the <strong>recent apps section</strong> in the pull-down menu. Devices running iOS 27 can add this remote to the home screen, which does make repeat access easier.</p></p>                </section><section class="howto-block">                    <h3>2. Choose the right Apple TV </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/FNJdgGXgZLSDARQGU9hZ2M.jpg"                                        alt="apple tv 4k remote finder feature"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/FNJdgGXgZLSDARQGU9hZ2M.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>At the top of the Remote app you'll see a long pill-shaped button. Tap it and you'll be shown a list of Apple TV devices associated with your Apple account. If you're like me, that's only a single box, which makes things easier.</p><p>Once you've found the right device, look for the <strong>Find </strong>button on the right side of the screen and tap it. There's a little illustration of an Apple TV remote next to it to indicate what this does.</p></p>                </section><section class="howto-block">                    <h3>3. Connect to your missing remote</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/xCm9tskysPw4goFxubksaK.jpg"                                        alt="apple tv 4k remote finder feature"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/xCm9tskysPw4goFxubksaK.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The Find screen will show an interface featuring a circle of swirling dots. You'll need to move around to try and connect to your remote, at which point a Blue circle will appear in the center. The closer you are to your remote, the larger the blue circle will be.</p></p>                </section><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Z7YZXTT4ehQ8RNKnDXHWce" name="PXL_20260930_153203857" alt="apple tv 4k remote finder" src="https://cdn.mos.cms.futurecdn.net/Z7YZXTT4ehQ8RNKnDXHWce-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is about all you get when it comes to tracking your remote down, though. In my case the issue was that we had absolutely no idea where the remote could be, and any attempt to look in or around the couch proved absolutely fruitless. </p><p>I went so deep into the cushions that I managed to find an unopened can of Pepsi that had been sitting there for an undetermined amount of time. No, I have no idea how that got there either, usually the depths of my couch are only home to dog fur, crumbs and the occasional missing Lego piece. Still, no matter how hard my wife and I looked, we could not find the remote.</p><p>It even got to the point where I wondered if I'd accidentally dropped it in a box of stuff I'd taken to the trash earlier that day. The Remote app's tracking feature didn't help me nail down an exact location, but it gave me a rough idea on where the blasted remote actually was — even with the interference from the couch itself. Once I knew where to look, the job became significantly easier.</p><p>That said, it still required some effort on my part, including slowly moving the couch until the remote revealed itself. It turned out the thing was hiding under the back of the couch, and since my couch doesn't leave a huge gap between it and the floor, the remote wasn't visible all the times I'd gone down with a flashlight to try and find it. </p><p>So there are definitely things Apple could do to make that hunting process easier.</p><h2 id="how-apple-could-improve-remote-discoverability">How Apple could improve remote discoverability</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2Puh42XD48rtgmwSNbfzCc" name="PXL_20260930_153243813" alt="apple tv 4k remote finder" src="https://cdn.mos.cms.futurecdn.net/2Puh42XD48rtgmwSNbfzCc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I've seen a lot of people asking why the Apple TV remote doesn't have an AirTag installed, and at first I agreed with them. Then I realized that the Apple TV remote doesn't need an AirTag, per se, at least not in the way people think. Considering the TV remote almost never leaves the room, let alone the house, tracking down its geographical location isn't a priority.</p><p>There's already something similar to precision tracking, albeit without the same distance levels you'd get with Ultrawideband-enabled devices like AirTags and recent iPhones. So adding UWB and a distance meter would definitely be a welcome change when the <a href="https://www.tomsguide.com/computing/ipads/7-apple-products-expected-to-be-announced-in-october-touchscreen-macbook-ultra-homepad-and-more">next Apple TV 4K</a> box is released.</p><p>What's really missing is the fact that the current Siri remote doesn't have any kind of speaker. That means if the remote does go missing, you have to go through a process of trial and error to hunt it down — rather than just forcing it to play a sound and make the process that much easier.</p><p>I'll admit, most remotes don't have built-in trackers, and if it disappears down into the depths of your couch then you have to go looking for it without any technological help. But since Apple has already gone halfway there, there's no reason why it can't push ahead with an experience that's even closer to using an actual AirTag. </p><p>After all, the Siri Remote is quite skinny, and a lot easier to lose than most streaming remotes — particularly those ones that use replaceable AAA batteries.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BJMD7GbnQ8izUWPzwnDxVc" name="PXL_20260930_153232208" alt="apple tv 4k remote finder" src="https://cdn.mos.cms.futurecdn.net/BJMD7GbnQ8izUWPzwnDxVc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you end up in a situation when your Apple TV remote goes missing, your first instinct is probably to use the Remote app as a substitute. It's one of the great things about the best streaming boxes, there's almost always an app for that — especially on iPhones. </p><p>But Apple's remote app has the thing that could help you get the real thing back, and without paying $59 for a replacement Apple TV remote. There are some ways it could be improved, but it's still much better than the alternative. So the next time your remote goes missing, either at the hands of a tech-obsessed toddler or for some other reason, make sure to load up the Apple Remote app to help hunt it down.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/i-used-to-find-my-iphones-shortcuts-app-intimidating-then-ios-27-changed-everything">I used to find my iPhone's Shortcuts app intimidating — then iOS 27 changed everything</a></li><li><a href="https://www.tomsguide.com/phones/iphones/scammers-are-using-iphone-duo-pre-orders-to-try-and-steal-your-passwords-heres-how-to-stay-safe">Scammers are using iPhone Duo pre-orders to try and steal your passwords — here's how to stay safe</a></li><li><a href="https://www.tomsguide.com/phones/ios-27-has-a-hidden-anti-scam-setting-heres-why-every-iphone-user-should-turn-it-on">iOS 27 has a hidden anti-scam setting — here’s why every iPhone user should turn it on</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/i-tore-my-living-room-apart-looking-for-the-apple-tv-remote-my-son-hid-but-this-hidden-iphone-feature-saved-the-day</link>
                                                                            <description>
                            <![CDATA[ Your Apple TV remote doesn't act like an AirTag, but you still have a neat way to track it down at your disposal. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">B8qUB9xddS34bKEA5hQGdJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pWPAAu3jsbuHErH68W9nee-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 01 Oct 2026 07:30:00 +0000</pubDate>                                                                                                                                                                                                                                <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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pWPAAu3jsbuHErH68W9nee-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[apple tv 4k remote finder]]></media:description>                                                            <media:text><![CDATA[apple tv 4k remote finder]]></media:text>
                                <media:title type="plain"><![CDATA[apple tv 4k remote finder]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pWPAAu3jsbuHErH68W9nee-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>My 11-month old son is obsessed with my <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K remote</a>. It used to be that he just wanted to chew it, which isn't ideal since it's made of metal, but these days he's started actively playing with it and pressing buttons. Unfortunately, this also means the remote is starting to go missing quite a lot.</p><p>It feels like it ends up in that dimension that is only accessible to socks in the dryer and objects your kids were holding before you turned your back for two seconds. Thankfully, unlike most remotes, the Apple TV remote has a way to let you track it down — and I'm not talking about those <a href="https://www.tomsguide.com/opinion/this-is-the-best-apple-tv-remote-case-and-apple-should-totally-steal-its-best-idea">bulky cases that attach an AirTag</a> to it, either. It all relies on this hidden iPhone feature.</p><h2 id="how-to-hunt-down-your-missing-apple-tv-remote">How to hunt down your missing Apple TV remote</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fbjCxzGoqQYSXRYyMFdHVc" name="PXL_20260930_153208400" alt="apple tv 4k remote finder" src="https://cdn.mos.cms.futurecdn.net/fbjCxzGoqQYSXRYyMFdHVc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Normally if you're missing an Apple device, your first idea would be to jump into the Find My Device app and look there. It's how you track down AirTags, phones, tablets and even some Apple Pencils — among other things. The Apple TV remote, specifically the third generation Siri remote, does not include that level of support.</p><p>That's not to say you are stuck if your Apple TV remote falls down the back of the couch, or into the fourth dimension where it's impossible to see no matter how hard you look. Because the Apple TV app actually has a feature to locate it. It's similar to the precision tracking Apple already offers for other devices, even if it isn't quite as accurate.</p><p>Here's how it works:</p><section class="howto-block">                    <h3>1. Open the Apple TV Remote app</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/Xw3BDK92Q2BEuq3QWZXzeK.jpg"                                        alt="apple tv 4k remote finder feature"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/Xw3BDK92Q2BEuq3QWZXzeK.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The Apple TV Remote app isn't a standalone app in your app list, but you can access it from the <strong>Search bar</strong> at the bottom of your home screen — or via the <strong>recent apps section</strong> in the pull-down menu. Devices running iOS 27 can add this remote to the home screen, which does make repeat access easier.</p></p>                </section><section class="howto-block">                    <h3>2. Choose the right Apple TV </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/FNJdgGXgZLSDARQGU9hZ2M.jpg"                                        alt="apple tv 4k remote finder feature"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/FNJdgGXgZLSDARQGU9hZ2M.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>At the top of the Remote app you'll see a long pill-shaped button. Tap it and you'll be shown a list of Apple TV devices associated with your Apple account. If you're like me, that's only a single box, which makes things easier.</p><p>Once you've found the right device, look for the <strong>Find </strong>button on the right side of the screen and tap it. There's a little illustration of an Apple TV remote next to it to indicate what this does.</p></p>                </section><section class="howto-block">                    <h3>3. Connect to your missing remote</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/xCm9tskysPw4goFxubksaK.jpg"                                        alt="apple tv 4k remote finder feature"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/xCm9tskysPw4goFxubksaK.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The Find screen will show an interface featuring a circle of swirling dots. You'll need to move around to try and connect to your remote, at which point a Blue circle will appear in the center. The closer you are to your remote, the larger the blue circle will be.</p></p>                </section><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Z7YZXTT4ehQ8RNKnDXHWce" name="PXL_20260930_153203857" alt="apple tv 4k remote finder" src="https://cdn.mos.cms.futurecdn.net/Z7YZXTT4ehQ8RNKnDXHWce-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is about all you get when it comes to tracking your remote down, though. In my case the issue was that we had absolutely no idea where the remote could be, and any attempt to look in or around the couch proved absolutely fruitless. </p><p>I went so deep into the cushions that I managed to find an unopened can of Pepsi that had been sitting there for an undetermined amount of time. No, I have no idea how that got there either, usually the depths of my couch are only home to dog fur, crumbs and the occasional missing Lego piece. Still, no matter how hard my wife and I looked, we could not find the remote.</p><p>It even got to the point where I wondered if I'd accidentally dropped it in a box of stuff I'd taken to the trash earlier that day. The Remote app's tracking feature didn't help me nail down an exact location, but it gave me a rough idea on where the blasted remote actually was — even with the interference from the couch itself. Once I knew where to look, the job became significantly easier.</p><p>That said, it still required some effort on my part, including slowly moving the couch until the remote revealed itself. It turned out the thing was hiding under the back of the couch, and since my couch doesn't leave a huge gap between it and the floor, the remote wasn't visible all the times I'd gone down with a flashlight to try and find it. </p><p>So there are definitely things Apple could do to make that hunting process easier.</p><h2 id="how-apple-could-improve-remote-discoverability">How Apple could improve remote discoverability</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2Puh42XD48rtgmwSNbfzCc" name="PXL_20260930_153243813" alt="apple tv 4k remote finder" src="https://cdn.mos.cms.futurecdn.net/2Puh42XD48rtgmwSNbfzCc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I've seen a lot of people asking why the Apple TV remote doesn't have an AirTag installed, and at first I agreed with them. Then I realized that the Apple TV remote doesn't need an AirTag, per se, at least not in the way people think. Considering the TV remote almost never leaves the room, let alone the house, tracking down its geographical location isn't a priority.</p><p>There's already something similar to precision tracking, albeit without the same distance levels you'd get with Ultrawideband-enabled devices like AirTags and recent iPhones. So adding UWB and a distance meter would definitely be a welcome change when the <a href="https://www.tomsguide.com/computing/ipads/7-apple-products-expected-to-be-announced-in-october-touchscreen-macbook-ultra-homepad-and-more">next Apple TV 4K</a> box is released.</p><p>What's really missing is the fact that the current Siri remote doesn't have any kind of speaker. That means if the remote does go missing, you have to go through a process of trial and error to hunt it down — rather than just forcing it to play a sound and make the process that much easier.</p><p>I'll admit, most remotes don't have built-in trackers, and if it disappears down into the depths of your couch then you have to go looking for it without any technological help. But since Apple has already gone halfway there, there's no reason why it can't push ahead with an experience that's even closer to using an actual AirTag. </p><p>After all, the Siri Remote is quite skinny, and a lot easier to lose than most streaming remotes — particularly those ones that use replaceable AAA batteries.</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BJMD7GbnQ8izUWPzwnDxVc" name="PXL_20260930_153232208" alt="apple tv 4k remote finder" src="https://cdn.mos.cms.futurecdn.net/BJMD7GbnQ8izUWPzwnDxVc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you end up in a situation when your Apple TV remote goes missing, your first instinct is probably to use the Remote app as a substitute. It's one of the great things about the best streaming boxes, there's almost always an app for that — especially on iPhones. </p><p>But Apple's remote app has the thing that could help you get the real thing back, and without paying $59 for a replacement Apple TV remote. There are some ways it could be improved, but it's still much better than the alternative. So the next time your remote goes missing, either at the hands of a tech-obsessed toddler or for some other reason, make sure to load up the Apple Remote app to help hunt it down.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/i-used-to-find-my-iphones-shortcuts-app-intimidating-then-ios-27-changed-everything">I used to find my iPhone's Shortcuts app intimidating — then iOS 27 changed everything</a></li><li><a href="https://www.tomsguide.com/phones/iphones/scammers-are-using-iphone-duo-pre-orders-to-try-and-steal-your-passwords-heres-how-to-stay-safe">Scammers are using iPhone Duo pre-orders to try and steal your passwords — here's how to stay safe</a></li><li><a href="https://www.tomsguide.com/phones/ios-27-has-a-hidden-anti-scam-setting-heres-why-every-iphone-user-should-turn-it-on">iOS 27 has a hidden anti-scam setting — here’s why every iPhone user should turn it on</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in October 2026: 'Matchbox the Movie' and much more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It’s fitting that October is the official start of "spooky season" because there’s nothing but thrills <strong>new on Apple TV in October 2026</strong>. The streaming service will welcome seven buzzy films and television series to its already extensive library in the coming month, including a new John Cena-led action flick, the return of an animated favorite and more. </p><p>The month kicks off with the second season of the animated-fantasy favorite “The Sisters Grimm” on October 2 and keeps the good TV going on October 7 with the start of a quirky new comedy-drama series “Small Prophets,” hailing from Britain. And if you’re a doc-head and an extreme-nature lover, the documentary premiere of “The Last First: Winter K2” will scratch both of those itches. </p><p>And that’s not even touching on “Matchbox the Movie” with the aforementioned Cena, or “Tenzing” with Tom Hiddleston. So without further ado, here's everything coming to Apple TV in October 2026.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="39-the-sister-grimm-39-season-2">'The Sister Grimm' season 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/W9gixQopmPw" allowfullscreen=""></iframe></div></div><p>For the second installment of this animated adaptation of Michael Buckley’s popular children’s book series, we pick up with Sabrina and Daphne Grimm (voiced by Ariel Winter and Leah Newman, respectively) one year after their parents’ mysterious disappearance, with the sleuthing sisters continuing to uncover new fantastical adventures and magical mysteries in fictional Ferryport Landing, where fairy-tale creatures reside. </p><p>All six episodes — which also feature Laraine Newman as Relda, Abubakar Salim as Charming, Billy Harris as Puck and Harry Trevaldwyn as Mirror — will drop in one fell swoop on October 2. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/the-sisters-grimm/umc.cmc.2hc9ggvxaqddv779k4zupmrw" target="_blank" rel="nofollow"><em><strong>"The Sisters Grimm" season 2 on Apple TV</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="39-the-last-first-winter-k2-39">'The Last First: Winter K2'</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/zgGpyr5MFK8" allowfullscreen=""></iframe></div></div><p>After premiering at this year’s Sundance Film Festival, this harrowing nature documentary from director Amir Bar-Lev follows a team of mountaineers — including Icelandic climber John Snorri Sigurjónsson and the Pakistani father-son team of Muhammad Ali Sadpara and Sajid Sadpara — as they attempt to make the first successful winter ascent of K2, the second-highest mountain on Earth.</p><p>Along with braving the natural obstacles of the frigid and formidable ascent, the climbing team also have to navigate social-media influencers, film crews, commercial expedition clients and Nepalese locals during their trek up “The Savage Mountain.”</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/the-last-first-winter-k2/umc.cmc.3qvemsb6f04actuyzdporeelt?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><em><strong>'The Last First: Winter K2' on Apple TV</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="39-small-prophets-39">'Small Prophets'</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/wLKL8vK5PgA" allowfullscreen=""></iframe></div></div><p>Created, written, and directed by Mackenzie Crook, this British dramedy series stars Pearce Quigley as Michael Sleep, a melancholic Manchester man who sets out to grow h<em>omunculi </em>— tiny, transparent creatures that act as prophesying spirits capable of predicting the future — in water jars inside his garden shed in an attempt to learn exactly what happened when his partner Clea disappeared seven years prior. Naturally, this oddball behavior does pique the unwanted attention of his nosy cul-de-sac neighbors. (The ensemble also includes Lauren Patel, Michael Palin, Paul Kaye, Jon Pointing, Sophie Willan, and Crook himself as Michael’s boss.)</p><p>“Small Prophets” has already been renewed for a second season, no surprise given the widespread acclaim the series received when it debuted across the pond this past February. (In his five-star review for <a href="https://www.theguardian.com/tv-and-radio/2026/feb/09/small-prophets-review-mackenzie-crooks-magical-new-comedy-is-pure-pure-pleasure" target="_blank">The Guardian</a>, critic Jack Seale called the comedy-drama a "show full of gorgeous surprises" and "pure, pure pleasure.”)</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/gb/show/small-prophets/umc.cmc.6x0wb0zjilppb9tlwlva08izm" target="_blank" rel="nofollow"><em><strong>"Small Prophets" on Apple TV</strong></em></a><em><strong> starting October 7</strong></em></p><h2 id="39-matchbox-the-movie-39">'Matchbox: The Movie'</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/7xfqITrMDcI" allowfullscreen=""></iframe></div></div><p>Sean Walker (John Cena) is an undercover CIA agent who returns to his hometown after years away. When he gets there, he pulls his childhood friends into an international chase to save the world. The CIA believes Walker and his friends actually stole a nuclear warhead. The only thing to do to clear their names? Actually steal the bomb, for some reason. The live-action feature takes its name from the die-cast car line Jack Odell invented in 1953 so his daughter could bring a toy to school that fit inside a matchbox. </p><p><em><strong>Watch "</strong></em><a href="https://tv.apple.com/vg/movie/matchbox-the-movie/umc.cmc.31qa8j1tn2cnpyk3fx43w928d" target="_blank" rel="nofollow"><em><strong>Matchbox: The Movie"</strong></em></a><em><strong> on Apple TV starting October 9</strong></em></p><h2 id="39-tenzing-39">'Tenzing'</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/KkYCY5YR12U" allowfullscreen=""></iframe></div></div><p>Tenzing Norgay (Genden Phuntsok) is a Himalayan climber who reached the summit of Mount Everest with Edmund Hillary in 1953. Tom Hiddleston plays Hillary, Norgay’s climbing partner, who went along on the expedition to climb the mountain to completion. Meanwhile, Willem Dafoe is Colonel John Hunt, the British expedition leader who has to be convinced Tenzing belongs on the climbing team rather than in service to it. The film premiered at Telluride on September 4 and played at the Toronto International Film Festival before a short theatrical run that begins October 9, and after that, you can check out the movie on Apple TV.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/tenzing/umc.cmc.6lic0hhuxkrbem0n29vzjopii" target="_blank" rel="nofollow"><em><strong>"Tenzing" on Apple TV</strong></em></a><em><strong> starting October 16</strong></em></p><h2 id="39-where-39-s-wanda-39-season-2">'Where's Wanda?' season 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/7B6D8x5yxh4" allowfullscreen=""></iframe></div></div><p>The German-language dark comedy returns with the Klatt family in a new mess. Season one followed Carlotta and Dedo (Heike Makatsch and Axel Stein) as they spied on their neighbors to find their missing daughter. This time, just as life seems to be going back to normal, Wanda (Lea Drinda) is caught seemingly red-handed standing over a dead body, so her parents have to prove she isn't a murderer. That’s when the search for the real killer takes them into the criminal underbelly of their suburbs. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/wheres-wanda/umc.cmc.k92ure4ft8lmbfhynpk3xpb4" target="_blank" rel="nofollow"><em><strong>"Where's Wanda?" season 2 on Apple TV</strong></em></a><em><strong> starting October 21</strong></em></p><h2 id="39-nocturne-39">'Nocturne'</h2><iframe allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" height="373" width="560" id="" style="border:none;overflow:hidden" class="position-center" data-lazy-priority="low" data-lazy-src="https://www.facebook.com/plugins/video.php?height=373&amp;href=https%3A%2F%2Fwww.facebook.com%2Freel%2F4626511784231495%2F&amp;show_text=false&amp;width=560&amp;t=0"></iframe><p>Liev Schreiber plays Jonah Lynn, an ex-soldier turned homicide detective who, tired of working the tough streets of Philadelphia, moves to a small town in western Pennsylvania for a normal life. Of course, that doesn’t last long. Serial killer Jurek Walter (Stephen Graham) targets the town as well as Jonah's family. When one of the killer's victims unexpectedly turns up alive, the race to find the last missing victim sends FBI agent Saga Bauer (Zazie Beetz), Jonah's surrogate daughter, undercover to get answers from Walter himself. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/nocturne/umc.cmc.4cfsq1juke72zutv5xp0pw3rj" target="_blank" rel="nofollow"><em><strong>"Nocturne" on Apple TV</strong></em></a><em><strong> starting October 30</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/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/i-just-caught-up-on-the-new-season-of-apple-tvs-best-comfort-watch-and-no-its-not-ted-lasso">I just caught up on the new season of Apple TV’s best comfort watch — and no, it’s not ‘Ted Lasso’</a></li><li><a href="https://www.tomsguide.com/computing/ipads/7-apple-products-expected-to-be-announced-in-october-touchscreen-macbook-ultra-homepad-and-more">7 Apple products expected to be announced in October — touchscreen MacBook Ultra, HomePad and more</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-october-2026-matchbox-the-movie-and-much-more</link>
                                                                            <description>
                            <![CDATA[ Our guide to the new movies and shows coming to Apple TV in October 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">emGxvfX5KLvgvB3LBjvhzA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4BKdqTz5ocHypHjtJQRVHX-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 29 Sep 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE-320-70.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/4BKdqTz5ocHypHjtJQRVHX-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a purple, blue, and pink background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a purple, blue, and pink background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a purple, blue, and pink background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4BKdqTz5ocHypHjtJQRVHX-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It’s fitting that October is the official start of "spooky season" because there’s nothing but thrills <strong>new on Apple TV in October 2026</strong>. The streaming service will welcome seven buzzy films and television series to its already extensive library in the coming month, including a new John Cena-led action flick, the return of an animated favorite and more. </p><p>The month kicks off with the second season of the animated-fantasy favorite “The Sisters Grimm” on October 2 and keeps the good TV going on October 7 with the start of a quirky new comedy-drama series “Small Prophets,” hailing from Britain. And if you’re a doc-head and an extreme-nature lover, the documentary premiere of “The Last First: Winter K2” will scratch both of those itches. </p><p>And that’s not even touching on “Matchbox the Movie” with the aforementioned Cena, or “Tenzing” with Tom Hiddleston. So without further ado, here's everything coming to Apple TV in October 2026.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="39-the-sister-grimm-39-season-2">'The Sister Grimm' season 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/W9gixQopmPw" allowfullscreen=""></iframe></div></div><p>For the second installment of this animated adaptation of Michael Buckley’s popular children’s book series, we pick up with Sabrina and Daphne Grimm (voiced by Ariel Winter and Leah Newman, respectively) one year after their parents’ mysterious disappearance, with the sleuthing sisters continuing to uncover new fantastical adventures and magical mysteries in fictional Ferryport Landing, where fairy-tale creatures reside. </p><p>All six episodes — which also feature Laraine Newman as Relda, Abubakar Salim as Charming, Billy Harris as Puck and Harry Trevaldwyn as Mirror — will drop in one fell swoop on October 2. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/the-sisters-grimm/umc.cmc.2hc9ggvxaqddv779k4zupmrw" target="_blank" rel="nofollow"><em><strong>"The Sisters Grimm" season 2 on Apple TV</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="39-the-last-first-winter-k2-39">'The Last First: Winter K2'</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/zgGpyr5MFK8" allowfullscreen=""></iframe></div></div><p>After premiering at this year’s Sundance Film Festival, this harrowing nature documentary from director Amir Bar-Lev follows a team of mountaineers — including Icelandic climber John Snorri Sigurjónsson and the Pakistani father-son team of Muhammad Ali Sadpara and Sajid Sadpara — as they attempt to make the first successful winter ascent of K2, the second-highest mountain on Earth.</p><p>Along with braving the natural obstacles of the frigid and formidable ascent, the climbing team also have to navigate social-media influencers, film crews, commercial expedition clients and Nepalese locals during their trek up “The Savage Mountain.”</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/the-last-first-winter-k2/umc.cmc.3qvemsb6f04actuyzdporeelt?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><em><strong>'The Last First: Winter K2' on Apple TV</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="39-small-prophets-39">'Small Prophets'</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/wLKL8vK5PgA" allowfullscreen=""></iframe></div></div><p>Created, written, and directed by Mackenzie Crook, this British dramedy series stars Pearce Quigley as Michael Sleep, a melancholic Manchester man who sets out to grow h<em>omunculi </em>— tiny, transparent creatures that act as prophesying spirits capable of predicting the future — in water jars inside his garden shed in an attempt to learn exactly what happened when his partner Clea disappeared seven years prior. Naturally, this oddball behavior does pique the unwanted attention of his nosy cul-de-sac neighbors. (The ensemble also includes Lauren Patel, Michael Palin, Paul Kaye, Jon Pointing, Sophie Willan, and Crook himself as Michael’s boss.)</p><p>“Small Prophets” has already been renewed for a second season, no surprise given the widespread acclaim the series received when it debuted across the pond this past February. (In his five-star review for <a href="https://www.theguardian.com/tv-and-radio/2026/feb/09/small-prophets-review-mackenzie-crooks-magical-new-comedy-is-pure-pure-pleasure" target="_blank">The Guardian</a>, critic Jack Seale called the comedy-drama a "show full of gorgeous surprises" and "pure, pure pleasure.”)</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/gb/show/small-prophets/umc.cmc.6x0wb0zjilppb9tlwlva08izm" target="_blank" rel="nofollow"><em><strong>"Small Prophets" on Apple TV</strong></em></a><em><strong> starting October 7</strong></em></p><h2 id="39-matchbox-the-movie-39">'Matchbox: The Movie'</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/7xfqITrMDcI" allowfullscreen=""></iframe></div></div><p>Sean Walker (John Cena) is an undercover CIA agent who returns to his hometown after years away. When he gets there, he pulls his childhood friends into an international chase to save the world. The CIA believes Walker and his friends actually stole a nuclear warhead. The only thing to do to clear their names? Actually steal the bomb, for some reason. The live-action feature takes its name from the die-cast car line Jack Odell invented in 1953 so his daughter could bring a toy to school that fit inside a matchbox. </p><p><em><strong>Watch "</strong></em><a href="https://tv.apple.com/vg/movie/matchbox-the-movie/umc.cmc.31qa8j1tn2cnpyk3fx43w928d" target="_blank" rel="nofollow"><em><strong>Matchbox: The Movie"</strong></em></a><em><strong> on Apple TV starting October 9</strong></em></p><h2 id="39-tenzing-39">'Tenzing'</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/KkYCY5YR12U" allowfullscreen=""></iframe></div></div><p>Tenzing Norgay (Genden Phuntsok) is a Himalayan climber who reached the summit of Mount Everest with Edmund Hillary in 1953. Tom Hiddleston plays Hillary, Norgay’s climbing partner, who went along on the expedition to climb the mountain to completion. Meanwhile, Willem Dafoe is Colonel John Hunt, the British expedition leader who has to be convinced Tenzing belongs on the climbing team rather than in service to it. The film premiered at Telluride on September 4 and played at the Toronto International Film Festival before a short theatrical run that begins October 9, and after that, you can check out the movie on Apple TV.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/tenzing/umc.cmc.6lic0hhuxkrbem0n29vzjopii" target="_blank" rel="nofollow"><em><strong>"Tenzing" on Apple TV</strong></em></a><em><strong> starting October 16</strong></em></p><h2 id="39-where-39-s-wanda-39-season-2">'Where's Wanda?' season 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/7B6D8x5yxh4" allowfullscreen=""></iframe></div></div><p>The German-language dark comedy returns with the Klatt family in a new mess. Season one followed Carlotta and Dedo (Heike Makatsch and Axel Stein) as they spied on their neighbors to find their missing daughter. This time, just as life seems to be going back to normal, Wanda (Lea Drinda) is caught seemingly red-handed standing over a dead body, so her parents have to prove she isn't a murderer. That’s when the search for the real killer takes them into the criminal underbelly of their suburbs. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/wheres-wanda/umc.cmc.k92ure4ft8lmbfhynpk3xpb4" target="_blank" rel="nofollow"><em><strong>"Where's Wanda?" season 2 on Apple TV</strong></em></a><em><strong> starting October 21</strong></em></p><h2 id="39-nocturne-39">'Nocturne'</h2><iframe allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" height="373" width="560" id="" style="border:none;overflow:hidden" class="position-center" data-lazy-priority="low" data-lazy-src="https://www.facebook.com/plugins/video.php?height=373&amp;href=https%3A%2F%2Fwww.facebook.com%2Freel%2F4626511784231495%2F&amp;show_text=false&amp;width=560&amp;t=0"></iframe><p>Liev Schreiber plays Jonah Lynn, an ex-soldier turned homicide detective who, tired of working the tough streets of Philadelphia, moves to a small town in western Pennsylvania for a normal life. Of course, that doesn’t last long. Serial killer Jurek Walter (Stephen Graham) targets the town as well as Jonah's family. When one of the killer's victims unexpectedly turns up alive, the race to find the last missing victim sends FBI agent Saga Bauer (Zazie Beetz), Jonah's surrogate daughter, undercover to get answers from Walter himself. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/nocturne/umc.cmc.4cfsq1juke72zutv5xp0pw3rj" target="_blank" rel="nofollow"><em><strong>"Nocturne" on Apple TV</strong></em></a><em><strong> starting October 30</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/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/i-just-caught-up-on-the-new-season-of-apple-tvs-best-comfort-watch-and-no-its-not-ted-lasso">I just caught up on the new season of Apple TV’s best comfort watch — and no, it’s not ‘Ted Lasso’</a></li><li><a href="https://www.tomsguide.com/computing/ipads/7-apple-products-expected-to-be-announced-in-october-touchscreen-macbook-ultra-homepad-and-more">7 Apple products expected to be announced in October — touchscreen MacBook Ultra, HomePad and more</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 top new movies to stream this week on Netflix, HBO Max, Apple TV and more (Sept. 29-Oct.5) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This week’s slate of top new movies across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> has been confirmed, and there’s a little something for everyone with new options on Netflix, HBO Max, Apple TV, digital streaming and more.</p><p>This week sees October, aka the spookiest month, arrive, so naturally we can expect a slew of horror movies over the next few weeks. We’re starting strong with the arrival of <strong>“Evil Dead Burn” </strong>on HBO Max, and <strong>“Teenage Sex and Death at Camp Miasma” </strong>on MUBI. Or if you’re after something a little less bloody, the family-friendly animated flick <strong>“Coyote vs. Acme”</strong> drops on digital, or you can enjoy Tyler Perry’s latest Netflix movie, the romantic drama <strong>“Doing Life.”</strong></p><p>You don’t need to waste time scrolling through streaming libraries trying to find the latest releases; I’ve rounded up the most noteworthy new additions across platforms below. Plus, if you’re in the mood for binge-watching, we have a guide for the <a href="https://www.tomsguide.com/entertainment/streaming/5-biggest-new-shows-to-stream-this-week-including-a-yellowstone-spinoffs-return">top TV shows this week</a>, too.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODmDlX"></div>                            </div>                            <script src="https://kwizly.com/embed/ODmDlX.js" async=""></script><h2 id="coyote-vs-acme-quot-pvod">‘Coyote vs. Acme" (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/H-43VeYGiPM" allowfullscreen=""></iframe></div></div><p>“Coyote vs. Acme” is one of the year’s biggest movie success stories. The animated comedy set in the world of Looney Tunes was shelved by Warner Bros. in 2023 for tax write-off purposes, even though it was virtually finished. Following online backlash, it was acquired by Ketchup Entertainment and released in theaters over the summer, where it was a modest financial success and a critical smash hit, scoring a near-perfect 96% on <a href="https://www.rottentomatoes.com/m/coyote_vs_acme" target="_blank">Rotten Tomatoes</a>. </p><p>Clearly, this was a movie worth saving, and it looks set for further success now that it’s arriving on digital streaming. Taking a meta approach to its cartoon world and characters, the family comedy sees a fed-up Wile E. Coyote hire a personal injury lawyer (Will Forte) to sue Acme, the in-universe manufacturer of all sorts of dangerous items, from anvils to bombs, for years of selling faulty products that always backfire on him. It’s a very funny idea, well executed! </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/Coyote-vs-Acme-Dave-Green/dp/B0HGDZPT19/" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting September 29</strong></em></p><h2 id="evil-dead-burn-hbo-max">‘Evil Dead Burn’ (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/TnHby2cxJzs" allowfullscreen=""></iframe></div></div><p>This week will see the calendar change over to October, signalling the official start of Spooky Season. Expect to see plenty of new horror movies across the best streaming services, and HBO Max is kicking off the month with the latest installment in the “Evil Dead” franchise. “Burn” is perhaps the most gruesome and grim “Evil Dead” yet. It’s certainly not a movie for the squeamish. But if you can handle buckets of fake blood, it’s a well-timed seasonal watch. </p><p>After the death of her abusive husband, Alice (Souheila Yacoub) is in a state of conflicted grief. After a somber cremation service, she travels to the secluded home of her in-laws. Here, the already tense family dynamic becomes even darker when demonic forces are unleashed. The house becomes a survival battleground. Largely shedding the series' trademark tension-cutting humor, “Evil Dead Burn” opts for a more twisted approach.</p><p><em><strong>Watch on </strong></em><a href="https://www.hbomax.com/movie/632222f3-5968-4176-9266-6b68ec4eee79" target="_blank" rel="nofollow"><em><strong>HBO Max</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="the-last-first-winter-k2-apple-tv">‘The Last First: Winter K2’ (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/zgGpyr5MFK8" allowfullscreen=""></iframe></div></div><p>If you go by Rotten Tomatoes’ scores, then “The Last First: Winter K2” is the obvious top pick of the bunch this week. The documentary holds a 100% score on <a href="https://www.rottentomatoes.com/m/the_last_first_winter_k2" target="_blank">Rotten Tomatoes</a>, and while this rating is more common with documentaries, it’s nevertheless noteworthy and should draw in viewers. It sounds like a very worthwhile watch, but I have to note that “The Last First: Winter K2” is definitely one of the worst movie names of 2026. </p><p>Directed by Amir Bar-Lev, “The Last First: Winter K2” chronicles the efforts of a team of expert mountaineers to make the first successful winter ascent of K2, also known as Mount Godwin-Austen, the second-highest mountain on Earth. But this is more than just a tale of remarkable human achievement; it also explores how ambition and ego can be as lethal as the toughest of mountain conditions, and how the climbing landscape is rapidly changing.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/the-last-first-winter-k2/umc.cmc.3qvemsb6f04actuyzdporeelt?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="teenage-sex-and-death-at-camp-miasma-mubi">‘Teenage Sex and Death at Camp Miasma’ (MUBI)</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/dimCiC_hdoA" allowfullscreen=""></iframe></div></div><p>Director Jane Schoenbrun absolutely floored me with 2024’s “I Saw the TV Glow,” a remarkable psychological horror that leaves a heavy imprint. The director’s follow-up, “Teenage Sex and Death at Camp Miasma,” is a similarly absorbing ride, a horror movie laced with satire, subtext and even romance. Its clever commentary on horror movie tropes is appealing, but it's the layered exploration of self-discovery that really sets it apart.</p><p>Kris Williams (Hannah Einbinder) is a young filmmaker hired to reboot the “Camp Miasma” franchise, which was once a celebrated slasher series but has faded in relevance after years of subpar sequels. Her pitch involves casting Billy Presley (Gillian Anderson), who starred in the original movie, and now lives at the abandoned camp where the films were shot. Taking a trip to visit Billy and convince the reclusive actress to reprise her role, Kris becomes enhanced by Billy, and the two slip into a surreal world of blood and lust.</p><p><em><strong>Watch on </strong></em><a href="https://mubi.com/en/us/films/teenage-sex-and-death-at-camp-miasma" target="_blank" rel="nofollow"><em><strong>MUBI</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="tyler-perry-s-doing-life-netflix">‘Tyler Perry’s Doing Life’ (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/zrOtmDQawas" allowfullscreen=""></iframe></div></div><p>Tyler Perry is one of Netflix’s most reliable and productive collaborators. Even if his work isn’t always critically acclaimed, it always seems to strike a chord with subscribers. This year alone, Perry’s Netflix projects have included “Joe’s College Road Trip” and “Why Did I Get Married Again?” Next up is “Doing Life,” a romantic drama inspired by “the idea that sometimes the people we least expect can understand each other in ways no one else can," <a href="https://people.com/tyler-perry-s-doing-life-trailer-sees-a-single-mother-and-ex-convict-fall-in-love-exclusive-12073286" target="_blank">says Perry</a>.</p><p>Starring Naomi Baker and Jay Reeves, and written and directed by Perry. In “Doing Life,” a single mother and correctional officer (Baker) develops a strong bond with a reformed ex-convict (Reeves), who previously saved her life during a violent prison riot. The jury is out on the movie’s critical reception, but this is a case where the reviews likely don’t matter; Perry’s dedicated fanbase will no doubt support the film, pushing it up the Netflix top 10. </p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/82023496" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> starting October 2</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-october-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix October 2026</a></li><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/movies/we-rated-the-scariness-of-the-14-biggest-horror-movies-of-2026-so-far-including-obsession-backrooms-scream-7-and-more">We rated the scariness of the 14 biggest horror movies of 2026</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/movies/5-top-new-movies-to-stream-this-week-on-netflix-hbo-max-apple-tv-and-more-sept-29-oct-5</link>
                                                                            <description>
                            <![CDATA[ This week's selection of new movies across the biggest streaming services included "Evil Dead Burn" and Tyler Perry's latest Netflix film. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">M8ZsymyA2RBMHXYAj5mfUC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/chLVpYVfMiUr3Ryyqzfada-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 29 Sep 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Tue, 29 Sep 2026 08:26:34 +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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/chLVpYVfMiUr3Ryyqzfada-1920-80.jpg">
                                                            <media:credit><![CDATA[Warner Animation Group / Ketchup Entertainment]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Will Forte as Kevin Avery in &quot;Coyote vs. Acme&quot;]]></media:description>                                                            <media:text><![CDATA[Will Forte as Kevin Avery in &quot;Coyote vs. Acme&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Will Forte as Kevin Avery in &quot;Coyote vs. Acme&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/chLVpYVfMiUr3Ryyqzfada-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week’s slate of top new movies across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> has been confirmed, and there’s a little something for everyone with new options on Netflix, HBO Max, Apple TV, digital streaming and more.</p><p>This week sees October, aka the spookiest month, arrive, so naturally we can expect a slew of horror movies over the next few weeks. We’re starting strong with the arrival of <strong>“Evil Dead Burn” </strong>on HBO Max, and <strong>“Teenage Sex and Death at Camp Miasma” </strong>on MUBI. Or if you’re after something a little less bloody, the family-friendly animated flick <strong>“Coyote vs. Acme”</strong> drops on digital, or you can enjoy Tyler Perry’s latest Netflix movie, the romantic drama <strong>“Doing Life.”</strong></p><p>You don’t need to waste time scrolling through streaming libraries trying to find the latest releases; I’ve rounded up the most noteworthy new additions across platforms below. Plus, if you’re in the mood for binge-watching, we have a guide for the <a href="https://www.tomsguide.com/entertainment/streaming/5-biggest-new-shows-to-stream-this-week-including-a-yellowstone-spinoffs-return">top TV shows this week</a>, too.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODmDlX"></div>                            </div>                            <script src="https://kwizly.com/embed/ODmDlX.js" async=""></script><h2 id="coyote-vs-acme-quot-pvod">‘Coyote vs. Acme" (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/H-43VeYGiPM" allowfullscreen=""></iframe></div></div><p>“Coyote vs. Acme” is one of the year’s biggest movie success stories. The animated comedy set in the world of Looney Tunes was shelved by Warner Bros. in 2023 for tax write-off purposes, even though it was virtually finished. Following online backlash, it was acquired by Ketchup Entertainment and released in theaters over the summer, where it was a modest financial success and a critical smash hit, scoring a near-perfect 96% on <a href="https://www.rottentomatoes.com/m/coyote_vs_acme" target="_blank">Rotten Tomatoes</a>. </p><p>Clearly, this was a movie worth saving, and it looks set for further success now that it’s arriving on digital streaming. Taking a meta approach to its cartoon world and characters, the family comedy sees a fed-up Wile E. Coyote hire a personal injury lawyer (Will Forte) to sue Acme, the in-universe manufacturer of all sorts of dangerous items, from anvils to bombs, for years of selling faulty products that always backfire on him. It’s a very funny idea, well executed! </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/Coyote-vs-Acme-Dave-Green/dp/B0HGDZPT19/" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> starting September 29</strong></em></p><h2 id="evil-dead-burn-hbo-max">‘Evil Dead Burn’ (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/TnHby2cxJzs" allowfullscreen=""></iframe></div></div><p>This week will see the calendar change over to October, signalling the official start of Spooky Season. Expect to see plenty of new horror movies across the best streaming services, and HBO Max is kicking off the month with the latest installment in the “Evil Dead” franchise. “Burn” is perhaps the most gruesome and grim “Evil Dead” yet. It’s certainly not a movie for the squeamish. But if you can handle buckets of fake blood, it’s a well-timed seasonal watch. </p><p>After the death of her abusive husband, Alice (Souheila Yacoub) is in a state of conflicted grief. After a somber cremation service, she travels to the secluded home of her in-laws. Here, the already tense family dynamic becomes even darker when demonic forces are unleashed. The house becomes a survival battleground. Largely shedding the series' trademark tension-cutting humor, “Evil Dead Burn” opts for a more twisted approach.</p><p><em><strong>Watch on </strong></em><a href="https://www.hbomax.com/movie/632222f3-5968-4176-9266-6b68ec4eee79" target="_blank" rel="nofollow"><em><strong>HBO Max</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="the-last-first-winter-k2-apple-tv">‘The Last First: Winter K2’ (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/zgGpyr5MFK8" allowfullscreen=""></iframe></div></div><p>If you go by Rotten Tomatoes’ scores, then “The Last First: Winter K2” is the obvious top pick of the bunch this week. The documentary holds a 100% score on <a href="https://www.rottentomatoes.com/m/the_last_first_winter_k2" target="_blank">Rotten Tomatoes</a>, and while this rating is more common with documentaries, it’s nevertheless noteworthy and should draw in viewers. It sounds like a very worthwhile watch, but I have to note that “The Last First: Winter K2” is definitely one of the worst movie names of 2026. </p><p>Directed by Amir Bar-Lev, “The Last First: Winter K2” chronicles the efforts of a team of expert mountaineers to make the first successful winter ascent of K2, also known as Mount Godwin-Austen, the second-highest mountain on Earth. But this is more than just a tale of remarkable human achievement; it also explores how ambition and ego can be as lethal as the toughest of mountain conditions, and how the climbing landscape is rapidly changing.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/the-last-first-winter-k2/umc.cmc.3qvemsb6f04actuyzdporeelt?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="teenage-sex-and-death-at-camp-miasma-mubi">‘Teenage Sex and Death at Camp Miasma’ (MUBI)</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/dimCiC_hdoA" allowfullscreen=""></iframe></div></div><p>Director Jane Schoenbrun absolutely floored me with 2024’s “I Saw the TV Glow,” a remarkable psychological horror that leaves a heavy imprint. The director’s follow-up, “Teenage Sex and Death at Camp Miasma,” is a similarly absorbing ride, a horror movie laced with satire, subtext and even romance. Its clever commentary on horror movie tropes is appealing, but it's the layered exploration of self-discovery that really sets it apart.</p><p>Kris Williams (Hannah Einbinder) is a young filmmaker hired to reboot the “Camp Miasma” franchise, which was once a celebrated slasher series but has faded in relevance after years of subpar sequels. Her pitch involves casting Billy Presley (Gillian Anderson), who starred in the original movie, and now lives at the abandoned camp where the films were shot. Taking a trip to visit Billy and convince the reclusive actress to reprise her role, Kris becomes enhanced by Billy, and the two slip into a surreal world of blood and lust.</p><p><em><strong>Watch on </strong></em><a href="https://mubi.com/en/us/films/teenage-sex-and-death-at-camp-miasma" target="_blank" rel="nofollow"><em><strong>MUBI</strong></em></a><em><strong> starting October 2</strong></em></p><h2 id="tyler-perry-s-doing-life-netflix">‘Tyler Perry’s Doing Life’ (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/zrOtmDQawas" allowfullscreen=""></iframe></div></div><p>Tyler Perry is one of Netflix’s most reliable and productive collaborators. Even if his work isn’t always critically acclaimed, it always seems to strike a chord with subscribers. This year alone, Perry’s Netflix projects have included “Joe’s College Road Trip” and “Why Did I Get Married Again?” Next up is “Doing Life,” a romantic drama inspired by “the idea that sometimes the people we least expect can understand each other in ways no one else can," <a href="https://people.com/tyler-perry-s-doing-life-trailer-sees-a-single-mother-and-ex-convict-fall-in-love-exclusive-12073286" target="_blank">says Perry</a>.</p><p>Starring Naomi Baker and Jay Reeves, and written and directed by Perry. In “Doing Life,” a single mother and correctional officer (Baker) develops a strong bond with a reformed ex-convict (Reeves), who previously saved her life during a violent prison riot. The jury is out on the movie’s critical reception, but this is a case where the reviews likely don’t matter; Perry’s dedicated fanbase will no doubt support the film, pushing it up the Netflix top 10. </p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/82023496" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> starting October 2</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-october-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix October 2026</a></li><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/movies/we-rated-the-scariness-of-the-14-biggest-horror-movies-of-2026-so-far-including-obsession-backrooms-scream-7-and-more">We rated the scariness of the 14 biggest horror movies of 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just caught up on the new season of Apple TV’s best comfort watch — and no, it’s not ‘Ted Lasso’ ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I have a confession to make. I totally missed the release of <strong>“Trying” season 5 on Apple TV</strong> over the summer. For me, this is doubly embarrassing. Firstly, because as a streaming editor, it’s my job to be on the pulse of the latest arrivals on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming service</a>, and secondly, because I’ve been shouting about (and writing about) this wonderfully warm show for years. </p><p>The moment I discovered that “Trying” season 5 was out, I dropped everything and got down to binge-watching. Within a single day, I’d consumed all eight episodes. That speaks to the easygoing nature of Apple TV’s best comfort watch. And yes, that’s a shot at “Ted Lasso.” The optimistic soccer coach might get all the press, but real ones know that “Trying” is actually the most charming show on the platform. It's a simple series, but so very sweet.</p><p>For those out of the loop, “Trying” follows a young(ish) couple, Nikki (Esther Smith) and Jason (Rafe Spall), who enter the world of adoption after difficulties conceiving a child. With their eccentric friends and family in tow, they navigate the lengthy process while <em>trying </em>to prove they're grown-up enough to handle the responsibilities that come with being parents.</p><p>Across its first four seasons, “Trying” struck a perfect balance between good-natured comedy and a sensitive exploration of deeper issues, like the challenges of the adoption process. In season 5, you'll find more of the same. But that's not a criticism. “Trying” isn’t a show that thrives on shocking mid-series twists, and as a viewer since day one, that’s exactly why I love it.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OqgEne"></div>                            </div>                            <script src="https://kwizly.com/embed/OqgEne.js" async=""></script><h2 id="trying-remains-sugary-sweet-even-if-it-s-losing-some-steam">‘Trying’ remains sugary sweet (even if it’s losing some steam)</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/8-_Oxuozsw4" allowfullscreen=""></iframe></div></div><p>“Trying” season 5 briskly picks up in the wake of season 4’s cliffhanger that saw Princess (Scarlett Rayner) and Tyler’s (Cooper Turner) biological mom, Kat (Charlotte Riley), show up on the doorstep of Nikki and Jason’s London home. The focus of the fifth season is largely on Princess’ attempts to connect with her long-absent biological mother and how Nikki handles this new family dynamic (oddly, Kat seems entirely disinterested in her son, and vice versa). </p><p>Another plot point sees recurring character Scott (Darren Boyd) attempting to row the Atlantic Ocean single-handedly. “Trying” fans know that Scott’s hairbrained schemes never really work out, so unsurprisingly this latest one quickly falls apart. Scott and Sian Brooke's Karen continue to be a highlight, taking the spotlight in the season's best episode, "The Hurricane"</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="tFJy5LoUQ8y9pwrvg4usrA" name="trying-season-5-apple-tv-show-02" alt="Rafe Spall and Esther Smith in "Trying" season 5 on Apple TV." src="https://cdn.mos.cms.futurecdn.net/tFJy5LoUQ8y9pwrvg4usrA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Overall, it’s an unambitious season of television. The core cast is unchanged, aside from Kat, who was already introduced in a season 4 episode. There is little noticeable character development, and the overarching plot barely develops between episodes. But “Trying” was never about grand multi-episode arcs. It’s a show of simple moments between likeable characters, and in this area, “Trying” season 5 maintains the show’s overall consistency.</p><p>The show's dependable gentle comedy is here in spades, and the banter between Nikki and Jason remains one of “Trying’s” biggest strengths. However, a short-lived arc in which Nikki develops a crush on her attractive new co-worker feels ill-judged. Meritfully, it’s wrapped up without melodrama.</p><p>For the more cynical viewers, there is an argument to be made that “Trying” season 5 fails to justify its own existence. By the end, most characters are in the same spot where they began, and the new story arcs that have sprung up are resolved quickly, or even discarded, such as Jason’s new career training to be a social worker, which amounts to very little over the course of the season.</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="UmXjUJvcbdmu5n4XqCnBsA" name="trying-season-5-apple-tv-show-01" alt="Scarlett Rayner and Charlotte Riley in "Trying" season 5 on Apple TV" src="https://cdn.mos.cms.futurecdn.net/UmXjUJvcbdmu5n4XqCnBsA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>I also couldn’t help but notice that “Trying” season 5 doesn’t end with a cliffhanger of its own. Instead, the final scene feels more like a series finale, rather than just the latest chapter coming to an end. I won’t be surprised if “Trying” season 5 marks the end of the show.</p><p>If that is the case, I’m content. We got five seasons of a show that never conquered the mainstream in the way “Ted Lasso” did. It feels like a bit of a miracle we got to spend so much time with Nikki and Jason in a streaming era where unceremonious cancellations are commonplace. And it’s clear at this point that “Trying” has little road left to run. Nikki and Jason have their family and have proved more than capable of providing a loving home.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/gb/show/trying/umc.cmc.6muy4la7lj1omu5nci4bt2m66" target="_blank" rel="nofollow"><em><strong>"Trying" seasons 1- 5</strong></em></a><em><strong> on Apple TV now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/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/apple-tv/apple-tvs-brothers-is-a-delightful-matthew-mcconaughey-and-woody-harrelson-reunion-so-why-am-i-disappointed">Apple TV’s 'Brothers' is a delightful 'True Detective' reunion</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/ted-lasso-season-4-review-i-went-in-deeply-skeptical-i-came-out-a-believer">‘Ted Lasso’ season 4 review: I went in skeptical. I came out a believer</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/i-just-caught-up-on-the-new-season-of-apple-tvs-best-comfort-watch-and-no-its-not-ted-lasso</link>
                                                                            <description>
                            <![CDATA[ I binge-watched all of "Trying" season 5 in a single day, and Apple TV's most comforting show is still a winner, even if it's losing some steam. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4mauwKv4v3BPXCauaGHDka</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Y9hkMUaDzhaUqgAq3SzdpY-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 27 Sep 2026 10:15:00 +0000</pubDate>                                                                                                                                <updated>Sun, 27 Sep 2026 12:45:05 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Y9hkMUaDzhaUqgAq3SzdpY-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Rafe Spall as Jason Ross and Esther Smith as Nikki Newman in Trying on Apple TV]]></media:description>                                                            <media:text><![CDATA[Rafe Spall as Jason Ross and Esther Smith as Nikki Newman in Trying on Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Rafe Spall as Jason Ross and Esther Smith as Nikki Newman in Trying on Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Y9hkMUaDzhaUqgAq3SzdpY-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I have a confession to make. I totally missed the release of <strong>“Trying” season 5 on Apple TV</strong> over the summer. For me, this is doubly embarrassing. Firstly, because as a streaming editor, it’s my job to be on the pulse of the latest arrivals on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming service</a>, and secondly, because I’ve been shouting about (and writing about) this wonderfully warm show for years. </p><p>The moment I discovered that “Trying” season 5 was out, I dropped everything and got down to binge-watching. Within a single day, I’d consumed all eight episodes. That speaks to the easygoing nature of Apple TV’s best comfort watch. And yes, that’s a shot at “Ted Lasso.” The optimistic soccer coach might get all the press, but real ones know that “Trying” is actually the most charming show on the platform. It's a simple series, but so very sweet.</p><p>For those out of the loop, “Trying” follows a young(ish) couple, Nikki (Esther Smith) and Jason (Rafe Spall), who enter the world of adoption after difficulties conceiving a child. With their eccentric friends and family in tow, they navigate the lengthy process while <em>trying </em>to prove they're grown-up enough to handle the responsibilities that come with being parents.</p><p>Across its first four seasons, “Trying” struck a perfect balance between good-natured comedy and a sensitive exploration of deeper issues, like the challenges of the adoption process. In season 5, you'll find more of the same. But that's not a criticism. “Trying” isn’t a show that thrives on shocking mid-series twists, and as a viewer since day one, that’s exactly why I love it.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OqgEne"></div>                            </div>                            <script src="https://kwizly.com/embed/OqgEne.js" async=""></script><h2 id="trying-remains-sugary-sweet-even-if-it-s-losing-some-steam">‘Trying’ remains sugary sweet (even if it’s losing some steam)</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/8-_Oxuozsw4" allowfullscreen=""></iframe></div></div><p>“Trying” season 5 briskly picks up in the wake of season 4’s cliffhanger that saw Princess (Scarlett Rayner) and Tyler’s (Cooper Turner) biological mom, Kat (Charlotte Riley), show up on the doorstep of Nikki and Jason’s London home. The focus of the fifth season is largely on Princess’ attempts to connect with her long-absent biological mother and how Nikki handles this new family dynamic (oddly, Kat seems entirely disinterested in her son, and vice versa). </p><p>Another plot point sees recurring character Scott (Darren Boyd) attempting to row the Atlantic Ocean single-handedly. “Trying” fans know that Scott’s hairbrained schemes never really work out, so unsurprisingly this latest one quickly falls apart. Scott and Sian Brooke's Karen continue to be a highlight, taking the spotlight in the season's best episode, "The Hurricane"</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="tFJy5LoUQ8y9pwrvg4usrA" name="trying-season-5-apple-tv-show-02" alt="Rafe Spall and Esther Smith in "Trying" season 5 on Apple TV." src="https://cdn.mos.cms.futurecdn.net/tFJy5LoUQ8y9pwrvg4usrA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Overall, it’s an unambitious season of television. The core cast is unchanged, aside from Kat, who was already introduced in a season 4 episode. There is little noticeable character development, and the overarching plot barely develops between episodes. But “Trying” was never about grand multi-episode arcs. It’s a show of simple moments between likeable characters, and in this area, “Trying” season 5 maintains the show’s overall consistency.</p><p>The show's dependable gentle comedy is here in spades, and the banter between Nikki and Jason remains one of “Trying’s” biggest strengths. However, a short-lived arc in which Nikki develops a crush on her attractive new co-worker feels ill-judged. Meritfully, it’s wrapped up without melodrama.</p><p>For the more cynical viewers, there is an argument to be made that “Trying” season 5 fails to justify its own existence. By the end, most characters are in the same spot where they began, and the new story arcs that have sprung up are resolved quickly, or even discarded, such as Jason’s new career training to be a social worker, which amounts to very little over the course of the season.</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="UmXjUJvcbdmu5n4XqCnBsA" name="trying-season-5-apple-tv-show-01" alt="Scarlett Rayner and Charlotte Riley in "Trying" season 5 on Apple TV" src="https://cdn.mos.cms.futurecdn.net/UmXjUJvcbdmu5n4XqCnBsA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>I also couldn’t help but notice that “Trying” season 5 doesn’t end with a cliffhanger of its own. Instead, the final scene feels more like a series finale, rather than just the latest chapter coming to an end. I won’t be surprised if “Trying” season 5 marks the end of the show.</p><p>If that is the case, I’m content. We got five seasons of a show that never conquered the mainstream in the way “Ted Lasso” did. It feels like a bit of a miracle we got to spend so much time with Nikki and Jason in a streaming era where unceremonious cancellations are commonplace. And it’s clear at this point that “Trying” has little road left to run. Nikki and Jason have their family and have proved more than capable of providing a loving home.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/gb/show/trying/umc.cmc.6muy4la7lj1omu5nci4bt2m66" target="_blank" rel="nofollow"><em><strong>"Trying" seasons 1- 5</strong></em></a><em><strong> on Apple TV now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/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/apple-tv/apple-tvs-brothers-is-a-delightful-matthew-mcconaughey-and-woody-harrelson-reunion-so-why-am-i-disappointed">Apple TV’s 'Brothers' is a delightful 'True Detective' reunion</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/ted-lasso-season-4-review-i-went-in-deeply-skeptical-i-came-out-a-believer">‘Ted Lasso’ season 4 review: I went in skeptical. I came out a believer</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I found the best Brad Pitt movie on each of the top streaming services — including my favorite crime-thriller of all time and a Tarantino masterpiece ]]></title>
                                                                                                <dc:content><![CDATA[ <p><strong>Brad Pitt</strong> is the definition of an A-lister. More than 30 years into his career, his star power hasn't faded. Pitt's latest movie, <a href="https://www.tomsguide.com/entertainment/movies/heart-of-the-beast-review-i-wanted-to-love-brad-pitts-new-survival-thriller-then-it-got-really-cheesy">“Heart of the Beast,”</a> is now in theaters, so you might be in the mood to enjoy some of Brad Pitt’s best movies. </p><p>But with a filmography spanning several decades and more than 60 roles to his name, Brad Pitt movies are scattered across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>. So, I’ve combed through the libraries of the biggest platforms to find the best Brad Pitt movie on each. I've got picks on Netflix, Prime Video, HBO Max, Paramount+, Hulu and more. Each offers <em>at least </em>one Brad Pitt movie.</p><p>So, whichever major streamer you’re currently subscribed to, here’s the best Brad Pitt movie on each of the top streaming services. </p><p><em>Note: Peacock is not included in this list because, as of September 25, 2026, it doesn’t have any movies featuring Brad Pitt in its library. </em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZqr2O"></div>                            </div>                            <script src="https://kwizly.com/embed/XZqr2O.js" async=""></script><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-netflix"><span>Best Brad Pitt movie on Netflix</span></h3><h2 id="war-machine-2017">‘War Machine’ (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/a9Jg20Ukf4E" allowfullscreen=""></iframe></div></div><p>Earlier this year, Netflix released “War Machine,” an original sci-fi action movie with Alan Ritchson. It created some confusion because the streamer previously released an original movie called “War Machine” in 2017. Granted, this satirical comedy isn’t exactly memorable, and its lukewarm critical reception saw it fade from the spotlight fast. But at present it’s the only Brad Pitt movie available on Netflix, so it wins the spot in this roundup by default. </p><p>Based on Michael Hastings’ non-fiction book, “The Operators,” the movie tells the fictional story of a decorated U.S. military general, Glen McMahon (Pitt), who is dispatched to Afghanistan to “clean up” the situation, eight years into the war effort. Once on the ground, he faces resistance from beleaguered soldiers, stuffy bureaucrats, and a cynical journalist (Scoot McNairy), who is planning a no-holds-barred exposé that could bring McMahon down.</p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/80068327" target="_blank" rel="nofollow"><em><strong>"War Machine" on Netflix</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-prime-video"><span>Best Brad Pitt movie on Prime Video</span></h3><h2 id="once-upon-a-time-in-hollywood-2019">‘Once Upon a Time… in Hollywood’ (2019)</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/ELeMaP8EPAA" allowfullscreen=""></iframe></div></div><p>Quentin Tarantino’s latest feature, “Once Upon a Time… in Hollywood,” isn’t my favorite movie of his acclaimed filmography, but it might just be his most entertaining. Plus, now is a great time to watch, as Pitt’s character, Cliff Booth, is set to return later this year in a spinoff sequel, “The Further Mis-Adventures of Cliff Booth,” which debuts on Netflix this December. “Hollywood” is Tarantino’s tribute to classic cinema and the era of larger-than-life movie stars. Pitt also won his first Best Supporting Actor Oscar for his performance as Booth.</p><p>Opening in the 1960s, Rick Dalton (Leonardo DiCaprio), a former Western TV star who made the jump to the silver screen, struggles to cope with his fading career as the Los Angeles landscape shifts around him. But at his side is his stunt double and close friend, Cliff Booth (Pitt). The two navigate shifting studio dynamics and A-list egos, while also encountering the infamous Charles Mason (Damon Herriman) and his devoted followers. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B07VF3XQCW" target="_blank" rel="nofollow"><em><strong>"Once Upon a Time... in Hollywood" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-apple-tv"><span>Best Brad Pitt movie on Apple TV</span></h3><h2 id="f1-2025">‘F1’ (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/69ffwl-8pCU" allowfullscreen=""></iframe></div></div><p>Director Joseph Kosinski proved his ability to capture fast-moving vehicular spectacle with “Top Gun: Maverick,” and the filmmaker followed it up with “F1,” a breakneck sports drama made in collaboration with Formula One. This gives the movie an impressive sense of authenticity, and also a whole truckload of unsubtle product placement. But still, if you want to see Pitt drive some very fast cars, it offers some of the best racing sequences around.</p><p>Pitt plays Sonny Hayes, a washed-up racer who is a whizz behind the wheel but who never lived up to his true potential. He’s given an unexpected shot at the big time when the struggling APXGP team recruits him as their new driver for the upcoming F1 season. Paired with an ambitious but arrogant rookie (Damon Herriman), “F1” is a basic underdog story that follows all the conventions of the sports drama genre but looks darn good doing it.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/f1-the-movie/umc.cmc.3t6dvnnr87zwd4wmvpdx5came" target="_blank" rel="nofollow"><em><strong>"F1" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-hulu"><span>Best Brad Pitt movie on Hulu</span></h3><h2 id="inglourious-basterds-2009">‘Inglourious Basterds’ (2009)</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/KnrRy6kSFF0" allowfullscreen=""></iframe></div></div><p>Pitt’s first collaboration with Quentin Tarantino came in “Inglourious Basterds,” and to borrow a phrase from his character, Lieutenant Aldo Raine, it “might just be [his] masterpiece.” This sprawling WWII movie plays fast-and-loose with historical fact, but Tarantino delivers a movie that is thrilling, funny, compelling and tragic. Plus, while Pitt deserves his flowers for his work here, it’s Christoph Waltz who steals the show, playing a despicable villain. </p><p>The flick tells two intertwining stories: One sees a French cinema owner, Shosanna (Mélanie Laurent), seek revenge after her Jewish family is murdered by SS officer Hans Landa (Waltz), while the other centers on Lt. Aldo Raine (Pitt), who leads a band of American soldiers behind enemy lines to seek retribution for the German army's war crimes. These two plotlines eventually converge as a daring plot to bring down the Third Reich is sprung. Earlier this year, <a href="https://variety.com/2025/film/news/quentin-tarantino-inglourious-basterds-masterpiece-favorite-1236491539/" target="_blank">Quentin Tarantino labeled</a> “Inglourious Basterds” his “masterpiece,” and I certainly don’t disagree with the celebrated director. </p><p><em><strong>Watch </strong></em><a href="https://www.hulu.com/movie/inglourious-basterds-54da4af5-9c47-48d1-91bf-d05e27024b94" target="_blank" rel="nofollow"><em><strong>“Inglourious Basterds” on Hulu</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-paramount"><span>Best Brad Pitt movie on Paramount+</span></h3><h2 id="seven-1995">‘Seven’ (1995)</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/znmZoVkCjpI" allowfullscreen=""></iframe></div></div><p>Paramount+ is the current streaming home of my personal favorite Brad Pitt movie. In fact, “Seven” is my favorite crime thriller of all time, which is saying something, as I’m a thriller fanatic. Directed by David Fincher (also my favorite director — yes, I’ve used the word favorite a lot!), It’s a dark mystery flick that brings together Fincher’s trademark style with a twisting plot and one of the most shocking (and unsettling) endings in movie history.</p><p>Set in an oppressive city, detective William Somerset (Morgan Freeman) is just a week from retirement when he’s paired with the younger and overly-confident David Mills (Pitt). The two are assigned to investigate a gruesome murder, which quickly spirals into a manhunt for a serial killer who is committing crimes based on the seven deadly sins. If you somehow don’t know how this one ends, then stop reading this article and stream it ASAP.</p><p><em><strong>Watch </strong></em><a href="https://www.paramountplus.com/movies/video/ALVE01KWJ2FGZTEG7AX7Y9D7TNTKC2/" target="_blank" rel="nofollow"><em><strong>"Seven" on Paramount+</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-hbo-max"><span>Best Brad Pitt movie on HBO Max</span></h3><h2 id="interview-with-the-vampire-1994">‘Interview with the Vampire’ (1994)</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/sCmYN6TLd8A" allowfullscreen=""></iframe></div></div><p>Before the successful TV series on AMC, there was 1996’s “Interview with the Vampire,” a ‘90s gothic horror movie and one of Pitt’s earlier celebrated roles. Based on Anne Rice’s 1976 novel and also starring Tom Cruise, Antonio Banderas, Christian Slater and Kristen Dunst (talk about an impressive cast!), it’s an intriguing tale set over multiple decades that explores what it means to be a creature of the night when morals conflict with a monstrous nature.</p><p>Louis de Pointe du Lac (Pitt) is an 18th-century lord whose encounter with a vampire named Lestat (Cruise) changes his life. At his lowest, Louis accepts Lestat’s offer of being turned into a bloodsucker, but quickly comes to regret the decision. He attempts to forgo giving in to his violent impulses and plans to abandon his creator. But when Lestat turns a young girl (Dunst), Louis feels compelled to stay and serve as her protector. The story unfolds via flashbacks, as Louis is interviewed by a journalist (Slater), hence the title!</p><p><em><strong>Watch </strong></em><a href="https://www.hbomax.com/sg/en/movie/a2eb98ac-9c42-4a95-b9d2-ef07b2d73f27" target="_blank" rel="nofollow"><em><strong>"Interview with the Vampire" on HBO Max</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-disney"><span>Best Brad Pitt movie on Disney+</span></h3><h2 id="deadpool-2-2018">‘Deadpool 2’ (2018)</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/D86RtevtfrA" allowfullscreen=""></iframe></div></div><p>“Deadpool 2” qualifies for this list on something of a technicality. Yes, Pitt does appear in his superhero sequel, but he plays an invisible character. His actual on-screen time can be measured in mere seconds. But hey, even if Pitt’s appearance is minimal, “Deadpool 2” is still a movie worth watching. And fun fact: Pitt was originally considered for the much larger role of Cable, but scheduling conflicts got in the way. Josh Brolin took on the part instead.</p><p>Released when Deadpool was still part of the Fox Marvel Universe, the sequel sees Wade Wilson (Ryan Reynolds) become the reluctant protector of a young mutant, Russell (Julian Dennison), who is being hunted by a time-travelling mercenary who believes that killing the youngster will change the future and therefore save his wife and daughter. It’s a quippy, action-packed follow-up, with the larger budget over its predecessor put to good use.</p><p><em><strong>Watch </strong></em><a href="https://www.disneyplus.com/browse/entity-27e84e56-31d3-4813-91ba-602cb52890f1" target="_blank" rel="nofollow"><em><strong>"Deadpool 2" on Disney+</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-in-september-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix in September 2026</a></li><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/movies/how-well-do-you-remember-80s-sci-fi-movies-our-quiz-will-test-you-from-star-wars-to-back-to-the-future">How well do you remember ‘80s sci-fi movies? Take our quiz!</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/movies/i-found-the-best-brad-pitt-movie-on-each-of-the-top-streaming-services-including-my-favorite-crime-thriller-of-all-time-and-a-tarantino-masterpiece</link>
                                                                            <description>
                            <![CDATA[ To mark Brad Pitt's latest movie, "Heart of the Beast," openning in theaters, I've found the A-lister's best film on each streaming service. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gW4p9ziLzzWfe2sWXoXwVY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EJRi5Ye2HaKjPnoTttaY2G-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 27 Sep 2026 08:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Movies]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EJRi5Ye2HaKjPnoTttaY2G-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Bratt Pitt in F1]]></media:description>                                                            <media:text><![CDATA[Bratt Pitt in F1]]></media:text>
                                <media:title type="plain"><![CDATA[Bratt Pitt in F1]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EJRi5Ye2HaKjPnoTttaY2G-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><strong>Brad Pitt</strong> is the definition of an A-lister. More than 30 years into his career, his star power hasn't faded. Pitt's latest movie, <a href="https://www.tomsguide.com/entertainment/movies/heart-of-the-beast-review-i-wanted-to-love-brad-pitts-new-survival-thriller-then-it-got-really-cheesy">“Heart of the Beast,”</a> is now in theaters, so you might be in the mood to enjoy some of Brad Pitt’s best movies. </p><p>But with a filmography spanning several decades and more than 60 roles to his name, Brad Pitt movies are scattered across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>. So, I’ve combed through the libraries of the biggest platforms to find the best Brad Pitt movie on each. I've got picks on Netflix, Prime Video, HBO Max, Paramount+, Hulu and more. Each offers <em>at least </em>one Brad Pitt movie.</p><p>So, whichever major streamer you’re currently subscribed to, here’s the best Brad Pitt movie on each of the top streaming services. </p><p><em>Note: Peacock is not included in this list because, as of September 25, 2026, it doesn’t have any movies featuring Brad Pitt in its library. </em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZqr2O"></div>                            </div>                            <script src="https://kwizly.com/embed/XZqr2O.js" async=""></script><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-netflix"><span>Best Brad Pitt movie on Netflix</span></h3><h2 id="war-machine-2017">‘War Machine’ (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/a9Jg20Ukf4E" allowfullscreen=""></iframe></div></div><p>Earlier this year, Netflix released “War Machine,” an original sci-fi action movie with Alan Ritchson. It created some confusion because the streamer previously released an original movie called “War Machine” in 2017. Granted, this satirical comedy isn’t exactly memorable, and its lukewarm critical reception saw it fade from the spotlight fast. But at present it’s the only Brad Pitt movie available on Netflix, so it wins the spot in this roundup by default. </p><p>Based on Michael Hastings’ non-fiction book, “The Operators,” the movie tells the fictional story of a decorated U.S. military general, Glen McMahon (Pitt), who is dispatched to Afghanistan to “clean up” the situation, eight years into the war effort. Once on the ground, he faces resistance from beleaguered soldiers, stuffy bureaucrats, and a cynical journalist (Scoot McNairy), who is planning a no-holds-barred exposé that could bring McMahon down.</p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/80068327" target="_blank" rel="nofollow"><em><strong>"War Machine" on Netflix</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-prime-video"><span>Best Brad Pitt movie on Prime Video</span></h3><h2 id="once-upon-a-time-in-hollywood-2019">‘Once Upon a Time… in Hollywood’ (2019)</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/ELeMaP8EPAA" allowfullscreen=""></iframe></div></div><p>Quentin Tarantino’s latest feature, “Once Upon a Time… in Hollywood,” isn’t my favorite movie of his acclaimed filmography, but it might just be his most entertaining. Plus, now is a great time to watch, as Pitt’s character, Cliff Booth, is set to return later this year in a spinoff sequel, “The Further Mis-Adventures of Cliff Booth,” which debuts on Netflix this December. “Hollywood” is Tarantino’s tribute to classic cinema and the era of larger-than-life movie stars. Pitt also won his first Best Supporting Actor Oscar for his performance as Booth.</p><p>Opening in the 1960s, Rick Dalton (Leonardo DiCaprio), a former Western TV star who made the jump to the silver screen, struggles to cope with his fading career as the Los Angeles landscape shifts around him. But at his side is his stunt double and close friend, Cliff Booth (Pitt). The two navigate shifting studio dynamics and A-list egos, while also encountering the infamous Charles Mason (Damon Herriman) and his devoted followers. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B07VF3XQCW" target="_blank" rel="nofollow"><em><strong>"Once Upon a Time... in Hollywood" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-apple-tv"><span>Best Brad Pitt movie on Apple TV</span></h3><h2 id="f1-2025">‘F1’ (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/69ffwl-8pCU" allowfullscreen=""></iframe></div></div><p>Director Joseph Kosinski proved his ability to capture fast-moving vehicular spectacle with “Top Gun: Maverick,” and the filmmaker followed it up with “F1,” a breakneck sports drama made in collaboration with Formula One. This gives the movie an impressive sense of authenticity, and also a whole truckload of unsubtle product placement. But still, if you want to see Pitt drive some very fast cars, it offers some of the best racing sequences around.</p><p>Pitt plays Sonny Hayes, a washed-up racer who is a whizz behind the wheel but who never lived up to his true potential. He’s given an unexpected shot at the big time when the struggling APXGP team recruits him as their new driver for the upcoming F1 season. Paired with an ambitious but arrogant rookie (Damon Herriman), “F1” is a basic underdog story that follows all the conventions of the sports drama genre but looks darn good doing it.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/f1-the-movie/umc.cmc.3t6dvnnr87zwd4wmvpdx5came" target="_blank" rel="nofollow"><em><strong>"F1" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-hulu"><span>Best Brad Pitt movie on Hulu</span></h3><h2 id="inglourious-basterds-2009">‘Inglourious Basterds’ (2009)</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/KnrRy6kSFF0" allowfullscreen=""></iframe></div></div><p>Pitt’s first collaboration with Quentin Tarantino came in “Inglourious Basterds,” and to borrow a phrase from his character, Lieutenant Aldo Raine, it “might just be [his] masterpiece.” This sprawling WWII movie plays fast-and-loose with historical fact, but Tarantino delivers a movie that is thrilling, funny, compelling and tragic. Plus, while Pitt deserves his flowers for his work here, it’s Christoph Waltz who steals the show, playing a despicable villain. </p><p>The flick tells two intertwining stories: One sees a French cinema owner, Shosanna (Mélanie Laurent), seek revenge after her Jewish family is murdered by SS officer Hans Landa (Waltz), while the other centers on Lt. Aldo Raine (Pitt), who leads a band of American soldiers behind enemy lines to seek retribution for the German army's war crimes. These two plotlines eventually converge as a daring plot to bring down the Third Reich is sprung. Earlier this year, <a href="https://variety.com/2025/film/news/quentin-tarantino-inglourious-basterds-masterpiece-favorite-1236491539/" target="_blank">Quentin Tarantino labeled</a> “Inglourious Basterds” his “masterpiece,” and I certainly don’t disagree with the celebrated director. </p><p><em><strong>Watch </strong></em><a href="https://www.hulu.com/movie/inglourious-basterds-54da4af5-9c47-48d1-91bf-d05e27024b94" target="_blank" rel="nofollow"><em><strong>“Inglourious Basterds” on Hulu</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-paramount"><span>Best Brad Pitt movie on Paramount+</span></h3><h2 id="seven-1995">‘Seven’ (1995)</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/znmZoVkCjpI" allowfullscreen=""></iframe></div></div><p>Paramount+ is the current streaming home of my personal favorite Brad Pitt movie. In fact, “Seven” is my favorite crime thriller of all time, which is saying something, as I’m a thriller fanatic. Directed by David Fincher (also my favorite director — yes, I’ve used the word favorite a lot!), It’s a dark mystery flick that brings together Fincher’s trademark style with a twisting plot and one of the most shocking (and unsettling) endings in movie history.</p><p>Set in an oppressive city, detective William Somerset (Morgan Freeman) is just a week from retirement when he’s paired with the younger and overly-confident David Mills (Pitt). The two are assigned to investigate a gruesome murder, which quickly spirals into a manhunt for a serial killer who is committing crimes based on the seven deadly sins. If you somehow don’t know how this one ends, then stop reading this article and stream it ASAP.</p><p><em><strong>Watch </strong></em><a href="https://www.paramountplus.com/movies/video/ALVE01KWJ2FGZTEG7AX7Y9D7TNTKC2/" target="_blank" rel="nofollow"><em><strong>"Seven" on Paramount+</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-hbo-max"><span>Best Brad Pitt movie on HBO Max</span></h3><h2 id="interview-with-the-vampire-1994">‘Interview with the Vampire’ (1994)</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/sCmYN6TLd8A" allowfullscreen=""></iframe></div></div><p>Before the successful TV series on AMC, there was 1996’s “Interview with the Vampire,” a ‘90s gothic horror movie and one of Pitt’s earlier celebrated roles. Based on Anne Rice’s 1976 novel and also starring Tom Cruise, Antonio Banderas, Christian Slater and Kristen Dunst (talk about an impressive cast!), it’s an intriguing tale set over multiple decades that explores what it means to be a creature of the night when morals conflict with a monstrous nature.</p><p>Louis de Pointe du Lac (Pitt) is an 18th-century lord whose encounter with a vampire named Lestat (Cruise) changes his life. At his lowest, Louis accepts Lestat’s offer of being turned into a bloodsucker, but quickly comes to regret the decision. He attempts to forgo giving in to his violent impulses and plans to abandon his creator. But when Lestat turns a young girl (Dunst), Louis feels compelled to stay and serve as her protector. The story unfolds via flashbacks, as Louis is interviewed by a journalist (Slater), hence the title!</p><p><em><strong>Watch </strong></em><a href="https://www.hbomax.com/sg/en/movie/a2eb98ac-9c42-4a95-b9d2-ef07b2d73f27" target="_blank" rel="nofollow"><em><strong>"Interview with the Vampire" on HBO Max</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-best-brad-pitt-movie-on-disney"><span>Best Brad Pitt movie on Disney+</span></h3><h2 id="deadpool-2-2018">‘Deadpool 2’ (2018)</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/D86RtevtfrA" allowfullscreen=""></iframe></div></div><p>“Deadpool 2” qualifies for this list on something of a technicality. Yes, Pitt does appear in his superhero sequel, but he plays an invisible character. His actual on-screen time can be measured in mere seconds. But hey, even if Pitt’s appearance is minimal, “Deadpool 2” is still a movie worth watching. And fun fact: Pitt was originally considered for the much larger role of Cable, but scheduling conflicts got in the way. Josh Brolin took on the part instead.</p><p>Released when Deadpool was still part of the Fox Marvel Universe, the sequel sees Wade Wilson (Ryan Reynolds) become the reluctant protector of a young mutant, Russell (Julian Dennison), who is being hunted by a time-travelling mercenary who believes that killing the youngster will change the future and therefore save his wife and daughter. It’s a quippy, action-packed follow-up, with the larger budget over its predecessor put to good use.</p><p><em><strong>Watch </strong></em><a href="https://www.disneyplus.com/browse/entity-27e84e56-31d3-4813-91ba-602cb52890f1" target="_blank" rel="nofollow"><em><strong>"Deadpool 2" on Disney+</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-in-september-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix in September 2026</a></li><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/movies/how-well-do-you-remember-80s-sci-fi-movies-our-quiz-will-test-you-from-star-wars-to-back-to-the-future">How well do you remember ‘80s sci-fi movies? Take our quiz!</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 Apple TV shows that are perfect ‘cozy escapes’ for a rainy weekend ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The end of September's been a soggy one this year, and the weather man says that ain't liable to change anytime soon. If the rain has you stuck inside this weekend, you owe it to yourself to check out some of the best shows on TV right now, the bulk of which are on Apple TV. </p><p>This perfect napping weather has me hitting couch-potato levels of productivity, an  Apple TV is home to many charming TV shows you can binge in a weekend. Whether you're looking for a cozy mystery with some gorgeous Irish scenery (and deliciously messy sibling dynamics) or a heartwarming drama about adult friendships, there's something for everyone's watchlist. </p><p>Ones like "Ted Lasso" get thrown around so much, I thought I'd skip the obvious suggestions you may have already heard about or watched. And keep in mind, a "cozy" show doesn't always mean cozy subject matter. In this age of true crime obsession and insane headlines, even hit spy thrillers like "Slow Horses" can feel like comfort TV. </p><p>So camp out with a mug of hot cocoa, a comfy blanket, and settle in for these cozy Apple TV series that deserve a spot on your watchlist. </p><h2 id="39-bad-sisters-39">'Bad Sisters'</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/IZUrhfCl0Xc" allowfullscreen=""></iframe></div></div><p>As one of three sisters, “Bad Sisters” was always gonna hit me hard, but my bias aside, it really is the perfect bite-size saga to binge over a weekend. Granted, “murder mystery” might not be the first thing that comes to mind when you think of a cozy watch, but its dreamy coastal Irish setting, gloriously messy family dynamics (siblings, amirite?), and distinct lack of gory bits make it easy to get swept up in. It’s part pitch-black comedy and part mystery thriller, with enough twists and turns to keep you guessing about who, if anyone, is going to make it out of this mess unscathed.</p><p>At the center are the close-knit Garvey sisters — Grace (Anne-Marie Duff), Eva (Sharon Horgan), Ursula (Eva Birthistle), Bibi (Sarah Greene) and Becka (Eve Hewson). When Grace’s husband, John Paul (Claes Bang), proves to be a far cry from the "nice guy" he pretends to be, he earns a place on her sisters' shit list. His fate is sealed from the opening scene, when the sisters gather at his funeral and collectively breathe a sigh of relief. Any one of them could have a motive for wanting him dead, leaving struggling insurance agent Tom Claffin (Brian Gleeson) to figure out what really happened. The suspected murder is problem enough, but there’s another reason he needs answers: paying out John Paul’s life insurance would bankrupt his father’s already struggling agency.</p><p><em><strong>Watch both seasons of </strong></em><a href="https://tv.apple.com/us/show/bad-sisters/umc.cmc.14kr4vv65unannh7doqgvlh20" target="_blank" rel="nofollow"><em><strong>"Bad Sisters" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-platonic-39">'Platonic'</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/Nnn02jJf5ys" allowfullscreen=""></iframe></div></div><p>There are already plenty of shows out there about how men are lonely and struggle to keep their friendships as they get older, but “Platonic” takes a much funnier approach. Seth Rogen and Rose Byrne have fantastic chemistry as long-estranged best friends Will and Sylvia, who reconnect while both are stumbling through their respective midlife crises. With two comedy heavyweights leading the charge, “Platonic” is easily one of the funniest shows on Apple TV Plus, earning a top spot on our <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">best Apple TV Plus shows</a> list.</p><p>After Will marries a woman Sylvia can’t stand, their friendship goes on the back burner. Years later, Will is freshly divorced, and the two find themselves back in each other’s orbits. Their reunion is messy from the start, and new relationships threaten to knock them of course once more. In a more conventional rom-com, you’d probably expect these two to eventually fall for each other, but that would completely miss the point of the show’s title. Will and Sylvia are strictly platonic — two codependent idiots trying to rein in their particular brand of chaos, grow up a little, and become better people. </p><p><em><strong>Watch both seasons of </strong></em><a href="https://tv.apple.com/us/show/platonic/umc.cmc.y7bc18x7co813l8i2tlsyb4l" target="_blank" rel="nofollow"><em><strong>"Platonic" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-slow-horses-39">'Slow Horses'</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/xo27sE2fdvs" allowfullscreen=""></iframe></div></div><p>If there’s one hit show that's really made a name for Apple TV, it's "Slow Horses." The acclaimed spy thriller just launched its sixth season, boasts an impressive 98% critics score on Rotten Tomatoes, and somehow manages to get better with each new installment. Much of that applause goes to Gary Oldman, whose rough-around-the-edges and endlessly watchable performance has further cemented his status as one of the finest actors of his generation.</p><p>“Slow Horses” follows a group of MI5 agents who have been exiled to Slough House, a dumping ground for spies who have botched assignments or screwed up enough to put their careers on ice. Dubbed “slow horses,” they’re stuck handling tedious, thankless work under the watchful eye of the foul-mouthed and perpetually unimpressed Jackson Lamb (Oldman). But despite their reputations as MI5 rejects, the team has a habit of stumbling into dangerous situations, uncovering conspiracies and taking on threats that can rival anything the agency’s elite agents might be up against.</p><p><em><strong>Watch all six seasons of </strong></em><a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><em><strong>"Slow Horses" on Apple TV</strong></em></a><em><strong> now</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/streaming/5-best-new-movies-to-watch-this-weekend-on-netflix-hbo-max-prime-video-and-more-september-26-27">5 best new movies to watch this weekend on Netflix, HBO Max, Prime Video and more (September 26-27)</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-report-card-2026-do-prestige-tv-shows-make-up-for-a-tiny-library">Apple TV Report Card 2026: Do prestige TV shows make up for a tiny library?</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/these-3-apple-tv-shows-are-the-ultimate-cozy-escapes-you-need-to-weather-this-rainy-weekend</link>
                                                                            <description>
                            <![CDATA[ September is ending with plenty of showers, and here are some of the best Apple TV shows to get you through. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WiQoGgSPhuUSxneQbNGoa8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6oekf9XrYDbFU33W8nhMfa-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 26 Sep 2026 18:29:00 +0000</pubDate>                                                                                                                                <updated>Sun, 27 Sep 2026 14:56:29 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc-320-70.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/6oekf9XrYDbFU33W8nhMfa-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Rose Byrne and Seth Rogen in Platonic]]></media:description>                                                            <media:text><![CDATA[Rose Byrne and Seth Rogen in Platonic]]></media:text>
                                <media:title type="plain"><![CDATA[Rose Byrne and Seth Rogen in Platonic]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6oekf9XrYDbFU33W8nhMfa-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The end of September's been a soggy one this year, and the weather man says that ain't liable to change anytime soon. If the rain has you stuck inside this weekend, you owe it to yourself to check out some of the best shows on TV right now, the bulk of which are on Apple TV. </p><p>This perfect napping weather has me hitting couch-potato levels of productivity, an  Apple TV is home to many charming TV shows you can binge in a weekend. Whether you're looking for a cozy mystery with some gorgeous Irish scenery (and deliciously messy sibling dynamics) or a heartwarming drama about adult friendships, there's something for everyone's watchlist. </p><p>Ones like "Ted Lasso" get thrown around so much, I thought I'd skip the obvious suggestions you may have already heard about or watched. And keep in mind, a "cozy" show doesn't always mean cozy subject matter. In this age of true crime obsession and insane headlines, even hit spy thrillers like "Slow Horses" can feel like comfort TV. </p><p>So camp out with a mug of hot cocoa, a comfy blanket, and settle in for these cozy Apple TV series that deserve a spot on your watchlist. </p><h2 id="39-bad-sisters-39">'Bad Sisters'</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/IZUrhfCl0Xc" allowfullscreen=""></iframe></div></div><p>As one of three sisters, “Bad Sisters” was always gonna hit me hard, but my bias aside, it really is the perfect bite-size saga to binge over a weekend. Granted, “murder mystery” might not be the first thing that comes to mind when you think of a cozy watch, but its dreamy coastal Irish setting, gloriously messy family dynamics (siblings, amirite?), and distinct lack of gory bits make it easy to get swept up in. It’s part pitch-black comedy and part mystery thriller, with enough twists and turns to keep you guessing about who, if anyone, is going to make it out of this mess unscathed.</p><p>At the center are the close-knit Garvey sisters — Grace (Anne-Marie Duff), Eva (Sharon Horgan), Ursula (Eva Birthistle), Bibi (Sarah Greene) and Becka (Eve Hewson). When Grace’s husband, John Paul (Claes Bang), proves to be a far cry from the "nice guy" he pretends to be, he earns a place on her sisters' shit list. His fate is sealed from the opening scene, when the sisters gather at his funeral and collectively breathe a sigh of relief. Any one of them could have a motive for wanting him dead, leaving struggling insurance agent Tom Claffin (Brian Gleeson) to figure out what really happened. The suspected murder is problem enough, but there’s another reason he needs answers: paying out John Paul’s life insurance would bankrupt his father’s already struggling agency.</p><p><em><strong>Watch both seasons of </strong></em><a href="https://tv.apple.com/us/show/bad-sisters/umc.cmc.14kr4vv65unannh7doqgvlh20" target="_blank" rel="nofollow"><em><strong>"Bad Sisters" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-platonic-39">'Platonic'</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/Nnn02jJf5ys" allowfullscreen=""></iframe></div></div><p>There are already plenty of shows out there about how men are lonely and struggle to keep their friendships as they get older, but “Platonic” takes a much funnier approach. Seth Rogen and Rose Byrne have fantastic chemistry as long-estranged best friends Will and Sylvia, who reconnect while both are stumbling through their respective midlife crises. With two comedy heavyweights leading the charge, “Platonic” is easily one of the funniest shows on Apple TV Plus, earning a top spot on our <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">best Apple TV Plus shows</a> list.</p><p>After Will marries a woman Sylvia can’t stand, their friendship goes on the back burner. Years later, Will is freshly divorced, and the two find themselves back in each other’s orbits. Their reunion is messy from the start, and new relationships threaten to knock them of course once more. In a more conventional rom-com, you’d probably expect these two to eventually fall for each other, but that would completely miss the point of the show’s title. Will and Sylvia are strictly platonic — two codependent idiots trying to rein in their particular brand of chaos, grow up a little, and become better people. </p><p><em><strong>Watch both seasons of </strong></em><a href="https://tv.apple.com/us/show/platonic/umc.cmc.y7bc18x7co813l8i2tlsyb4l" target="_blank" rel="nofollow"><em><strong>"Platonic" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-slow-horses-39">'Slow Horses'</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/xo27sE2fdvs" allowfullscreen=""></iframe></div></div><p>If there’s one hit show that's really made a name for Apple TV, it's "Slow Horses." The acclaimed spy thriller just launched its sixth season, boasts an impressive 98% critics score on Rotten Tomatoes, and somehow manages to get better with each new installment. Much of that applause goes to Gary Oldman, whose rough-around-the-edges and endlessly watchable performance has further cemented his status as one of the finest actors of his generation.</p><p>“Slow Horses” follows a group of MI5 agents who have been exiled to Slough House, a dumping ground for spies who have botched assignments or screwed up enough to put their careers on ice. Dubbed “slow horses,” they’re stuck handling tedious, thankless work under the watchful eye of the foul-mouthed and perpetually unimpressed Jackson Lamb (Oldman). But despite their reputations as MI5 rejects, the team has a habit of stumbling into dangerous situations, uncovering conspiracies and taking on threats that can rival anything the agency’s elite agents might be up against.</p><p><em><strong>Watch all six seasons of </strong></em><a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><em><strong>"Slow Horses" on Apple TV</strong></em></a><em><strong> now</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/streaming/5-best-new-movies-to-watch-this-weekend-on-netflix-hbo-max-prime-video-and-more-september-26-27">5 best new movies to watch this weekend on Netflix, HBO Max, Prime Video and more (September 26-27)</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-report-card-2026-do-prestige-tv-shows-make-up-for-a-tiny-library">Apple TV Report Card 2026: Do prestige TV shows make up for a tiny library?</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple TV’s 'Brothers' is a delightful Matthew McConaughey and Woody Harrelson reunion — so why am I disappointed? ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Brothers'</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: </strong>3 of 5 stars</p><p class="fancy-box__body-text"><strong>Verdict:</strong> “Brothers” is a breezy, occasionally funny showcase for Matthew McConaughey and Woody Harrelson, whose chemistry is still crackling. But with a thin plot padded out by predictable family drama, this feels like a two-hour movie that somehow became eight episodes.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episodes 1-2 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/brothers/umc.cmc.17g1y5mzqp92sc0ge1c0hdorg" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>There are worse ideas for a TV show than putting <strong>Matthew McConaughey</strong> and <strong>Woody Harrelson</strong> on a Texas ranch and letting them be weird together. In fact, given that the two actors have been friends for decades and have already delivered one of television's great double acts in <strong>“True Detective,”</strong> it sounds almost foolproof. Yet after watching all eight episodes of <strong>“Brothers,”</strong> I feel like it's got "this could've been an email" energy.</p><p>The new <strong>Apple TV</strong> comedy stars McConaughey and Harrelson as fictionalized versions of themselves. When Woody's daughter's wedding falls apart, he packs up the family and heads to Matthew's ranch. There, Matthew's mother, Ma Mac (Holland Taylor), drops a bombshell on Woody: The longtime friends might actually be half-brothers. </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/fIKFnzIcfcA" allowfullscreen=""></iframe></div></div><p>McConaughey and Harrelson have publicly discussed the possibility that they could share a biological father, so turning that rumor into a fictional family mystery is a clever bit of self-mythologizing. </p><p>In the show, Woody becomes obsessed with finding out whether it's true, while Matthew has his own big issue to deal with: He's considering running for governor of Texas. Throw in their wives, children, various romantic entanglements, a handful of celebrity cameos and a whole lot of Texas scenery, and you've got the makings of a breezy comedy about friendship, family and two movie stars having an extremely good time.</p><p>And that's pretty much what “Brothers” is. The problem is that having a good time isn't quite the same thing as having enough material for eight episodes.</p><p><em><strong>Warning: Light spoilers ahead for "Brothers" season 1.</strong></em></p><h2 id="matthew-mcconaughey-and-woody-harrelson-are-the-whole-show">Matthew McConaughey and Woody Harrelson are the whole show</h2><p>The good news is that McConaughey and Harrelson are still a blast together. There is an easy, lived-in quality to their chemistry that can't be manufactured, and “Brothers” gets considerably more mileage out of it than a standard buddy comedy could. These aren't polished sitcom performances; they're loose, occasionally goofy and very aware of the fact that we're watching two extremely famous men play exaggerated versions of themselves.</p><p>It's also a very different flavor of their partnership than “True Detective.” That show obviously required the two actors to spend most of their time staring into the abyss, whereas “Brothers” gives them permission to be silly and spaced-out.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMPv3X"></div>                            </div>                            <script src="https://kwizly.com/embed/eMPv3X.js" async=""></script><p>The show is at its best when it simply puts these two guys in ridiculous situations and lets their personalities do the heavy lifting. There are bizarre outfits. Strange encounters. Some wink-wink cameos. At one point, a dog enthusiastically licks McConaughey's face in a scene that made me chuckle and smirk. </p><p>Unfortunately, I never really laughed out loud. And the actual story doesn't give them much to work with. The mystery of whether they're brothers is amusing enough as a hook, but it's surprisingly thin as the central engine of an eight-episode series (even when the episodes are half an hour)</p><p>So the show pads things out with the kids, particularly their romantic lives. These storylines aren't terrible, but they're also not super compelling. They're meant to keep the sitcom machinery running: Characters need something to do, so here are some relationships to complicate.</p><p>The governor storyline is similarly useful rather than particularly interesting. Matthew running for governor gives the series some structure and a sense that something is at stake beyond the paternity mystery, but it mostly feels like another excuse to introduce new obstacles and kooky situations.</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="EBaS4DEYk5jdci29dq9RQj" name="brothers-mcconaughey-harrelson" alt="Woody Harrelson and Matthew McConaughey in Brothers" src="https://cdn.mos.cms.futurecdn.net/EBaS4DEYk5jdci29dq9RQj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><h2 id="verdict-brothers-is-fun-but-there-s-not-enough-show-here">Verdict: ‘Brothers’ is fun, but there’s not enough show here</h2><p>The central joke of “Brothers” is also its biggest limitation: These guys are famous. They know, you know it, everybody knows it.</p><p>And their celebrity is what makes the premise work. It's fun to watch McConaughey and Harrelson send up their own public images, especially when the show pushes those personas into increasingly absurd territory. I just wish there was more beyond the joke.</p><p>“Brothers” leaves the door open for a second season, and I wouldn't be completely opposed to seeing how it plays out. McConaughey and Harrelson remain an undeniably entertaining pair, and their chemistry is strong enough to make even thin material watchable. But if this really is the beginning of a longer story, the show needs to find a little more actual story to tell.</p><p>For now, “Brothers” is a pleasant enough hang with two movie stars who clearly enjoy hanging out together. It's amusing in spots, ludicrous in others and occasionally charming. But this truly could've been a two-hour movie perfect to stream on a rainy Sunday afternoon.</p><p><a href="https://tv.apple.com/us/show/brothers/umc.cmc.17g1y5mzqp92sc0ge1c0hdorg" target="_blank" rel="nofollow"><em><strong>"Brothers" streams weekly on Apple TV</strong></em></a></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-brothers-is-a-delightful-matthew-mcconaughey-and-woody-harrelson-reunion-so-why-am-i-disappointed</link>
                                                                            <description>
                            <![CDATA[ “Brothers” review: Matthew McConaughey and Woody Harrelson star in Apple TV’s new comedy series. Here’s what I thought after watching all 8 episodes ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LELauZ9UjP3k9ENmJVuMgF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/74RZPe8erhV9BYSphgmBPM-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 23 Sep 2026 07:01:00 +0000</pubDate>                                                                                                                                <updated>Wed, 23 Sep 2026 09:20:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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-320-70.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/74RZPe8erhV9BYSphgmBPM-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Matthew McConaughey and Woody Harrelson in Brothers]]></media:description>                                                            <media:text><![CDATA[Matthew McConaughey and Woody Harrelson in Brothers]]></media:text>
                                <media:title type="plain"><![CDATA[Matthew McConaughey and Woody Harrelson in Brothers]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/74RZPe8erhV9BYSphgmBPM-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Brothers'</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: </strong>3 of 5 stars</p><p class="fancy-box__body-text"><strong>Verdict:</strong> “Brothers” is a breezy, occasionally funny showcase for Matthew McConaughey and Woody Harrelson, whose chemistry is still crackling. But with a thin plot padded out by predictable family drama, this feels like a two-hour movie that somehow became eight episodes.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episodes 1-2 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/brothers/umc.cmc.17g1y5mzqp92sc0ge1c0hdorg" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>There are worse ideas for a TV show than putting <strong>Matthew McConaughey</strong> and <strong>Woody Harrelson</strong> on a Texas ranch and letting them be weird together. In fact, given that the two actors have been friends for decades and have already delivered one of television's great double acts in <strong>“True Detective,”</strong> it sounds almost foolproof. Yet after watching all eight episodes of <strong>“Brothers,”</strong> I feel like it's got "this could've been an email" energy.</p><p>The new <strong>Apple TV</strong> comedy stars McConaughey and Harrelson as fictionalized versions of themselves. When Woody's daughter's wedding falls apart, he packs up the family and heads to Matthew's ranch. There, Matthew's mother, Ma Mac (Holland Taylor), drops a bombshell on Woody: The longtime friends might actually be half-brothers. </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/fIKFnzIcfcA" allowfullscreen=""></iframe></div></div><p>McConaughey and Harrelson have publicly discussed the possibility that they could share a biological father, so turning that rumor into a fictional family mystery is a clever bit of self-mythologizing. </p><p>In the show, Woody becomes obsessed with finding out whether it's true, while Matthew has his own big issue to deal with: He's considering running for governor of Texas. Throw in their wives, children, various romantic entanglements, a handful of celebrity cameos and a whole lot of Texas scenery, and you've got the makings of a breezy comedy about friendship, family and two movie stars having an extremely good time.</p><p>And that's pretty much what “Brothers” is. The problem is that having a good time isn't quite the same thing as having enough material for eight episodes.</p><p><em><strong>Warning: Light spoilers ahead for "Brothers" season 1.</strong></em></p><h2 id="matthew-mcconaughey-and-woody-harrelson-are-the-whole-show">Matthew McConaughey and Woody Harrelson are the whole show</h2><p>The good news is that McConaughey and Harrelson are still a blast together. There is an easy, lived-in quality to their chemistry that can't be manufactured, and “Brothers” gets considerably more mileage out of it than a standard buddy comedy could. These aren't polished sitcom performances; they're loose, occasionally goofy and very aware of the fact that we're watching two extremely famous men play exaggerated versions of themselves.</p><p>It's also a very different flavor of their partnership than “True Detective.” That show obviously required the two actors to spend most of their time staring into the abyss, whereas “Brothers” gives them permission to be silly and spaced-out.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMPv3X"></div>                            </div>                            <script src="https://kwizly.com/embed/eMPv3X.js" async=""></script><p>The show is at its best when it simply puts these two guys in ridiculous situations and lets their personalities do the heavy lifting. There are bizarre outfits. Strange encounters. Some wink-wink cameos. At one point, a dog enthusiastically licks McConaughey's face in a scene that made me chuckle and smirk. </p><p>Unfortunately, I never really laughed out loud. And the actual story doesn't give them much to work with. The mystery of whether they're brothers is amusing enough as a hook, but it's surprisingly thin as the central engine of an eight-episode series (even when the episodes are half an hour)</p><p>So the show pads things out with the kids, particularly their romantic lives. These storylines aren't terrible, but they're also not super compelling. They're meant to keep the sitcom machinery running: Characters need something to do, so here are some relationships to complicate.</p><p>The governor storyline is similarly useful rather than particularly interesting. Matthew running for governor gives the series some structure and a sense that something is at stake beyond the paternity mystery, but it mostly feels like another excuse to introduce new obstacles and kooky situations.</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="EBaS4DEYk5jdci29dq9RQj" name="brothers-mcconaughey-harrelson" alt="Woody Harrelson and Matthew McConaughey in Brothers" src="https://cdn.mos.cms.futurecdn.net/EBaS4DEYk5jdci29dq9RQj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><h2 id="verdict-brothers-is-fun-but-there-s-not-enough-show-here">Verdict: ‘Brothers’ is fun, but there’s not enough show here</h2><p>The central joke of “Brothers” is also its biggest limitation: These guys are famous. They know, you know it, everybody knows it.</p><p>And their celebrity is what makes the premise work. It's fun to watch McConaughey and Harrelson send up their own public images, especially when the show pushes those personas into increasingly absurd territory. I just wish there was more beyond the joke.</p><p>“Brothers” leaves the door open for a second season, and I wouldn't be completely opposed to seeing how it plays out. McConaughey and Harrelson remain an undeniably entertaining pair, and their chemistry is strong enough to make even thin material watchable. But if this really is the beginning of a longer story, the show needs to find a little more actual story to tell.</p><p>For now, “Brothers” is a pleasant enough hang with two movie stars who clearly enjoy hanging out together. It's amusing in spots, ludicrous in others and occasionally charming. But this truly could've been a two-hour movie perfect to stream on a rainy Sunday afternoon.</p><p><a href="https://tv.apple.com/us/show/brothers/umc.cmc.17g1y5mzqp92sc0ge1c0hdorg" target="_blank" rel="nofollow"><em><strong>"Brothers" streams weekly on Apple TV</strong></em></a></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Brothers' online — stream the Matthew McConaughey and Woody Harrelson comedy from anywhere ]]></title>
                                                                                                <dc:content><![CDATA[ <p>"Brothers" will finally answer the question we've all been wondering: what would happen if Matthew McConaughey and Woody Harrelson were actually related?</p><p>Below, we’ll show you how to watch "Brothers" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Brothers' release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Brothers" premieres globally on Apple TV on <strong>Wednesday, September 23, 2026</strong>. New episodes then arrive weekly every Wednesday until the finale on November 4, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>For years, McConaughey and Harrelson have joked about the idea of them being brothers. The pair are great friends and long-time collaborators, as well as looking fairly similar. Then, while on holiday together a few years ago, McConaughey's mother mentioned she knew Harrelson's father many years ago, at a time which would correlate with the conception and birth of her son, Matthew.</p><p>While McConaughey is reluctant to take a DNA test as it would hurt the memory of the man who raised him, Harrelson is willing, but the likelihood is we will never really know. Still, at least we have this fictional comedy series to dive into, in which the duo play out that alternate reality where they are related. Across eight episodes of "Brothers" we will see Harrelson's daughter's wedding ruined, the two families spending time at McConaughey's ranch, and long-lost secrets spilled.</p><p>Ready for this wild ride? Here's <strong>how to watch "Brothers"</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-brothers-on-apple-tv"><span>How to watch 'Brothers' on Apple TV</span></h2><div class="product"><a data-dimension112="1abf81f2-b65d-11f1-b131-273692e2c1b8" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Brothers" premieres on <a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow" data-dimension112="1abf81f2-b65d-11f1-b131-273692e2c1b8" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Wednesday, September 23, 2026</strong>, with two episodes.<strong> </strong>New episodes will land on the streamer each Wednesday from then onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a handful of episodes before deciding whether to carry on with the series and the service.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $14.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong></p></div><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><h2 class="article-body__section" id="section-watch-brothers-from-anywhere"><span>Watch 'Brothers' from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="1abf83a0-b65d-11f1-a24b-0d616afecbee" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="1abf83a0-b65d-11f1-a24b-0d616afecbee" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Brothers" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="1abf83a0-b65d-11f1-a24b-0d616afecbee" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-brothers-trailer"><span>'Brothers' 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/fIKFnzIcfcA" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-brothers-cast"><span>'Brothers' cast</span></h2><ul><li><strong>Matthew McConaughey</strong> as himself</li><li><strong>Woody Harrelson</strong> as himself</li><li><strong>Holland Taylor</strong> as Ma Mac</li><li><strong>Natalie Martinez</strong> as Valentina McConaughey</li><li><strong>Brittany Ishibashi</strong> as Joy Harrelson</li><li><strong>Oona Yaffe</strong></li><li><strong>Highdee Kuan</strong></li><li><strong>Nolan Almeida</strong></li><li><strong>Ella Grace Helton</strong></li><li><strong>Noah Carganilla</strong></li></ul><h2 id="39-brothers-39-episode-guide">'Brothers' episode guide</h2><p>There is no official synopsis for any of the "Brothers" episodes, but we do have episode titles and release dates...</p><ul><li><strong>Episode 1, “On the Road”: </strong>Wednesday, September 23</li><li><strong>Episode 2, “The Hunt”: </strong>Wednesday, September 23</li><li><strong>Episode 3, “Little Wood”: </strong>Wednesday, September 30</li><li><strong>Episode 4, “The Band”: </strong>Wednesday, October 7</li><li><strong>Episode 5, “Valentine's Day”: </strong>Wednesday, October 14</li><li><strong>Episode 6, “The Dance”: </strong>Wednesday, October 21</li><li><strong>Episode 7, "The Interview":</strong> Wednesday, October 28</li><li><strong>Episode 8, "On the Road Again":</strong> "Wednesday, November 4</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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/how-to-watch-conan-obrien-must-go-season-3">How to watch 'Conan O’Brien Must Go' season 3 online – from anywhere and even for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-the-paper-season-2">How to watch 'The Paper' season 2 online — stream 'The Office' spinoff 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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/how-to-watch-brothers</link>
                                                                            <description>
                            <![CDATA[ Are Matthew McConaughey and Woody Harrelson actually related? Find out the answer to that and more - here's how to watch "Brothers" online and from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iD7bwLQSAJF5krorvR8Wm6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rDqT8wYMWbLqUG7deUSWEW-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 23 Sep 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rDqT8wYMWbLqUG7deUSWEW-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Brothers ]]></media:description>                                                            <media:text><![CDATA[Brothers ]]></media:text>
                                <media:title type="plain"><![CDATA[Brothers ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rDqT8wYMWbLqUG7deUSWEW-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Brothers" will finally answer the question we've all been wondering: what would happen if Matthew McConaughey and Woody Harrelson were actually related?</p><p>Below, we’ll show you how to watch "Brothers" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Brothers' release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Brothers" premieres globally on Apple TV on <strong>Wednesday, September 23, 2026</strong>. New episodes then arrive weekly every Wednesday until the finale on November 4, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>For years, McConaughey and Harrelson have joked about the idea of them being brothers. The pair are great friends and long-time collaborators, as well as looking fairly similar. Then, while on holiday together a few years ago, McConaughey's mother mentioned she knew Harrelson's father many years ago, at a time which would correlate with the conception and birth of her son, Matthew.</p><p>While McConaughey is reluctant to take a DNA test as it would hurt the memory of the man who raised him, Harrelson is willing, but the likelihood is we will never really know. Still, at least we have this fictional comedy series to dive into, in which the duo play out that alternate reality where they are related. Across eight episodes of "Brothers" we will see Harrelson's daughter's wedding ruined, the two families spending time at McConaughey's ranch, and long-lost secrets spilled.</p><p>Ready for this wild ride? Here's <strong>how to watch "Brothers"</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-brothers-on-apple-tv"><span>How to watch 'Brothers' on Apple TV</span></h2><div class="product"><a data-dimension112="1abf81f2-b65d-11f1-b131-273692e2c1b8" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Brothers" premieres on <a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow" data-dimension112="1abf81f2-b65d-11f1-b131-273692e2c1b8" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Wednesday, September 23, 2026</strong>, with two episodes.<strong> </strong>New episodes will land on the streamer each Wednesday from then onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a handful of episodes before deciding whether to carry on with the series and the service.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $14.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong></p></div><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><h2 class="article-body__section" id="section-watch-brothers-from-anywhere"><span>Watch 'Brothers' from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="1abf83a0-b65d-11f1-a24b-0d616afecbee" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="1abf83a0-b65d-11f1-a24b-0d616afecbee" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Brothers" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="1abf83a0-b65d-11f1-a24b-0d616afecbee" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-brothers-trailer"><span>'Brothers' 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/fIKFnzIcfcA" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-brothers-cast"><span>'Brothers' cast</span></h2><ul><li><strong>Matthew McConaughey</strong> as himself</li><li><strong>Woody Harrelson</strong> as himself</li><li><strong>Holland Taylor</strong> as Ma Mac</li><li><strong>Natalie Martinez</strong> as Valentina McConaughey</li><li><strong>Brittany Ishibashi</strong> as Joy Harrelson</li><li><strong>Oona Yaffe</strong></li><li><strong>Highdee Kuan</strong></li><li><strong>Nolan Almeida</strong></li><li><strong>Ella Grace Helton</strong></li><li><strong>Noah Carganilla</strong></li></ul><h2 id="39-brothers-39-episode-guide">'Brothers' episode guide</h2><p>There is no official synopsis for any of the "Brothers" episodes, but we do have episode titles and release dates...</p><ul><li><strong>Episode 1, “On the Road”: </strong>Wednesday, September 23</li><li><strong>Episode 2, “The Hunt”: </strong>Wednesday, September 23</li><li><strong>Episode 3, “Little Wood”: </strong>Wednesday, September 30</li><li><strong>Episode 4, “The Band”: </strong>Wednesday, October 7</li><li><strong>Episode 5, “Valentine's Day”: </strong>Wednesday, October 14</li><li><strong>Episode 6, “The Dance”: </strong>Wednesday, October 21</li><li><strong>Episode 7, "The Interview":</strong> Wednesday, October 28</li><li><strong>Episode 8, "On the Road Again":</strong> "Wednesday, November 4</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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/how-to-watch-conan-obrien-must-go-season-3">How to watch 'Conan O’Brien Must Go' season 3 online – from anywhere and even for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-the-paper-season-2">How to watch 'The Paper' season 2 online — stream 'The Office' spinoff 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[ 'Slow Horses' season 6 kicks things off with a stunning death, and I'm still in shock ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">"Slow Horses" season 6</a> premiere just arrived on <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>, and I have to remind myself that this spy thriller series is based on a book. Well, this season, it's two books. But my larger point is: Some decisions are out of the showrunners' hands.</p><p>At least, that's what I keep telling myself after watching the premiere on Apple's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>. </p><p>Don't get me wrong. I love the episode. If I were giving it a review grade (you can check out my full <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">review of "Slow Horses" season 6</a>, by the way), I'd have given it a 4.5 out of 5 stars. It was an excellent premiere. But the show just ignominiously killed off — borderline wrote off — a key character in the series, and I'm frankly still stunned.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async=""></script><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:14.80%;"><img id="4qkPkyt7YheYgpg43NfzSY" name="TG_Spoiler_Warning_2.jpg" alt="An image indicating spoilers are ahead." src="https://cdn.mos.cms.futurecdn.net/4qkPkyt7YheYgpg43NfzSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="296" 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><em><strong>Major spoiler for "Slow Horses" season 6 premiere ahead</strong></em></p><h2 id="39-slow-horses-39-pays-a-high-pryce-to-start-season-6">'Slow Horses' pays a high Pryce to start season 6</h2><p>OK, if you've seen the episode, you already know who I'm talking about. If you read the heading above this paragraph, you already know who I'm talking about. But it's time to finally type out the words.</p><p>"Slow Horses" killed off Jonathan Pryce. River's grandfather, David Cartwright, is dead.</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:2027px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="2kCcEHNHJR2htiZhvXmvCT" name="Slow_Horses_Photo_050601-1" alt="Jonathan Pryce as David Cartwright in "Slow Horses" on Apple TV" src="https://cdn.mos.cms.futurecdn.net/2kCcEHNHJR2htiZhvXmvCT-1920-80.png" mos="" align="middle" fullscreen="" width="2027" height="1140" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Now, perhaps I shouldn't have been so stunned by this moment. This show has never hesitated to kill off a character before, and the unwritten rule is that basically, everyone but Gary Oldman and Jack Lowden is in danger of not returning for another season of "Slow Horses."</p><p>But Pryce's elder spymaster was such an essential part of earlier seasons. And frankly, Pryce was such an essential part of selling me on this show in the first place. I'd have watched for Gary Oldman alone, but when I saw Pryce was also in the series, I knew it was going to be great.</p><p>For a moment, I really thought he wasn't even going to show up in the episode. I really thought he'd die off-camera, never to be seen again. But thankfully, the showrunners gave us and River (Lowden) one last goodbye via a flashback scene. At least they showed some heart with that gesture, because David Cartwright's death is a stark reminder to be prepared for anyone and everyone to die in this show.</p><p><em></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" season 6 premiere on Apple TV</em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/neagley-delivers-the-darkest-chapter-of-reacher-yet-in-a-brand-new-crime-thriller-series">'Neagley' delivers the darkest chapter of 'Reacher' yet in a brand-new crime thriller series</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/i-havent-farted-since-1971-gary-oldman-on-what-separates-him-from-jackson-lamb-ahead-of-slow-horses-season-6">'I haven't farted since 1971': Gary Oldman on what separates him from Jackson Lamb ahead of 'Slow Horses' season 6</a></li><li><a href="https://www.tomsguide.com/us/get-sunday-ticket-without-directv,review-3811.html">How to get NFL Sunday Ticket for 2026-2027 season — Pricing, where to watch and more</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-kicks-things-off-with-a-stunning-death-and-im-still-in-shock</link>
                                                                            <description>
                            <![CDATA[ "Slow Horses" just killed off a major character to start season 6, and I'm still in shock that the Apple TV spy thriller ended things this way. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Hf3tyN6S4BhmonEV37PJoQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/X3Hz3u85wu56LftFneuEVX-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 07:01:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/X3Hz3u85wu56LftFneuEVX-1920-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(L-R) Jack Lowden and Sir Gary Oldman in &quot;Slow Horses&quot; season 6]]></media:description>                                                            <media:text><![CDATA[(L-R) Jack Lowden and Sir Gary Oldman in &quot;Slow Horses&quot; season 6]]></media:text>
                                <media:title type="plain"><![CDATA[(L-R) Jack Lowden and Sir Gary Oldman in &quot;Slow Horses&quot; season 6]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/X3Hz3u85wu56LftFneuEVX-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">"Slow Horses" season 6</a> premiere just arrived on <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>, and I have to remind myself that this spy thriller series is based on a book. Well, this season, it's two books. But my larger point is: Some decisions are out of the showrunners' hands.</p><p>At least, that's what I keep telling myself after watching the premiere on Apple's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>. </p><p>Don't get me wrong. I love the episode. If I were giving it a review grade (you can check out my full <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">review of "Slow Horses" season 6</a>, by the way), I'd have given it a 4.5 out of 5 stars. It was an excellent premiere. But the show just ignominiously killed off — borderline wrote off — a key character in the series, and I'm frankly still stunned.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async=""></script><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:14.80%;"><img id="4qkPkyt7YheYgpg43NfzSY" name="TG_Spoiler_Warning_2.jpg" alt="An image indicating spoilers are ahead." src="https://cdn.mos.cms.futurecdn.net/4qkPkyt7YheYgpg43NfzSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="296" 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><em><strong>Major spoiler for "Slow Horses" season 6 premiere ahead</strong></em></p><h2 id="39-slow-horses-39-pays-a-high-pryce-to-start-season-6">'Slow Horses' pays a high Pryce to start season 6</h2><p>OK, if you've seen the episode, you already know who I'm talking about. If you read the heading above this paragraph, you already know who I'm talking about. But it's time to finally type out the words.</p><p>"Slow Horses" killed off Jonathan Pryce. River's grandfather, David Cartwright, is dead.</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:2027px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="2kCcEHNHJR2htiZhvXmvCT" name="Slow_Horses_Photo_050601-1" alt="Jonathan Pryce as David Cartwright in "Slow Horses" on Apple TV" src="https://cdn.mos.cms.futurecdn.net/2kCcEHNHJR2htiZhvXmvCT-1920-80.png" mos="" align="middle" fullscreen="" width="2027" height="1140" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Now, perhaps I shouldn't have been so stunned by this moment. This show has never hesitated to kill off a character before, and the unwritten rule is that basically, everyone but Gary Oldman and Jack Lowden is in danger of not returning for another season of "Slow Horses."</p><p>But Pryce's elder spymaster was such an essential part of earlier seasons. And frankly, Pryce was such an essential part of selling me on this show in the first place. I'd have watched for Gary Oldman alone, but when I saw Pryce was also in the series, I knew it was going to be great.</p><p>For a moment, I really thought he wasn't even going to show up in the episode. I really thought he'd die off-camera, never to be seen again. But thankfully, the showrunners gave us and River (Lowden) one last goodbye via a flashback scene. At least they showed some heart with that gesture, because David Cartwright's death is a stark reminder to be prepared for anyone and everyone to die in this show.</p><p><em></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" season 6 premiere on Apple TV</em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/neagley-delivers-the-darkest-chapter-of-reacher-yet-in-a-brand-new-crime-thriller-series">'Neagley' delivers the darkest chapter of 'Reacher' yet in a brand-new crime thriller series</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/i-havent-farted-since-1971-gary-oldman-on-what-separates-him-from-jackson-lamb-ahead-of-slow-horses-season-6">'I haven't farted since 1971': Gary Oldman on what separates him from Jackson Lamb ahead of 'Slow Horses' season 6</a></li><li><a href="https://www.tomsguide.com/us/get-sunday-ticket-without-directv,review-3811.html">How to get NFL Sunday Ticket for 2026-2027 season — Pricing, where to watch and more</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Slow Horses' season 6 online — stream the Gary Oldman spy series from anywhere ]]></title>
                                                                                                <dc:content><![CDATA[ <p>"<a href="https://www.tomsguide.com/tag/slow-horses">Slow Horses</a>" is not only a top quality spy thriller series, the production is also incredibly efficient, with yet another season back on our screens already.</p><p>Below, we’ll show you how to watch "Slow Horses" season 6 online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' S6 release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Slow Horses" season 6 premieres globally on Apple TV on <strong>Wednesday, September 16, 2026</strong>. New episodes then arrive weekly every Wednesday until the finale on October 21, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>We've already <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">reviewed "Slow Horses" season 6</a> and consider it one of the very best shows of 2026, which will come as no surprise to fans of the series. Adapted from Mick Herron's novels <em>Joe Country</em> and <em>Slough House</em>, the latest episodes see the ragtag bunch of agents on the run after MI5 First Desk Diana Taverner puts them in the middle of a chaotic game of revenge.</p><p>Jackson Lamb and co. are now not only evading the dangerous tricks of those outside of MI5, but also those within. We have six fresh episodes to see how this one plays out, and the good news is they're all in one place, globally. Better yet, we already know there's a seventh season on the way, too.</p><p>Ready for more? Here's <strong>how to watch "Slow Horses" season 6</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-slow-horses-season-6-on-apple-tv"><span>How to watch 'Slow Horses' season 6 on Apple TV</span></h2><div class="product"><a data-dimension112="16584e68-ac4a-11f1-969d-f7b1651cf602" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Slow Horses" season 6 premieres on <a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow" data-dimension112="16584e68-ac4a-11f1-969d-f7b1651cf602" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Wednesday, September 16, 2026. </strong>New episodes will land on the streamer each Wednesday from then onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a couple of episodes before deciding whether to carry on with the series and the service.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $14.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong></p></div><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><h2 class="article-body__section" id="section-watch-slow-horses-season-6-from-anywhere"><span>Watch 'Slow Horses' season 6 from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="16585048-ac4a-11f1-ad7e-e9b7186f818d" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="16585048-ac4a-11f1-ad7e-e9b7186f818d" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Slow Horses" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="16585048-ac4a-11f1-ad7e-e9b7186f818d" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-slow-horses-season-6-trailer"><span>'Slow Horses' season 6 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/mZbJxpYHLuI" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-slow-horses-season-6-cast"><span>'Slow Horses' season 6 cast</span></h2><ul><li>Sir Gary Oldman as Jackson Lamb</li><li>Kristin Scott Thomas as Diana Taverner</li><li>Jack Lowden as River Cartwright</li><li>Saskia Reeves as Catherine Standish</li><li>Rosalind Eleazar as Louisa Guy</li><li>Christopher Chung as Roddy Ho</li><li>Aimee-Ffion Edwards as Shirley Dander</li><li>Tom Brooke as J.K. Coe</li><li>Olivia Cooke as Sidonie “Sid” Baker</li><li>Jonathan Pryce as David Cartwright</li><li>Hugo Weaving as Frank Harkness</li><li>Lenny Rush as Reece Nesmith</li><li>Harry Lloyd as Damien Cantor</li><li>Kyle Soller as Jim</li><li>MyAnna Buring as Jane</li><li>Ruth Bradley as Emma Flyte</li><li>Samuel West as Peter Judd</li><li>Joanna Scanlan as Moira Tregorian</li></ul><h2 id="39-slow-horses-39-season-6-episode-guide">'Slow Horses' season 6 episode guide</h2><p>There is no official synopsis for any of the "Slow Horses" season 6 episodes, but we do have episode titles and release dates...</p><ul><li><strong>Season 6, Episode 1, “Circle of Life”: </strong>Wednesday, September 16</li><li><strong>Season 6, Episode 2, “Daddy Issues”: </strong>Wednesday, September 23</li><li><strong>Season 6, Episode 3, “Resurrection”: </strong>Wednesday, September 30</li><li><strong>Season 6, Episode 4, “Lost and Found”: </strong>Wednesday, October 7</li><li><strong>Season 6, Episode 5, “Sayonara”: </strong>Wednesday, October 14</li><li><strong>Season 6, Episode 6, “Judgement Day”: </strong>Wednesday, October 21</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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear">How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' 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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/how-to-watch-slow-horses-season-6</link>
                                                                            <description>
                            <![CDATA[ Jackson Lamb and his crew are back for more spy stories — here's how to watch "Slow Horses" season 6 online and from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gPCKXnCdgrF7mmYGJcPvy5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bYCy4zRrx5PGuwsVaEPUVE-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bYCy4zRrx5PGuwsVaEPUVE-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot;]]></media:description>                                                            <media:text><![CDATA[Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bYCy4zRrx5PGuwsVaEPUVE-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"<a href="https://www.tomsguide.com/tag/slow-horses">Slow Horses</a>" is not only a top quality spy thriller series, the production is also incredibly efficient, with yet another season back on our screens already.</p><p>Below, we’ll show you how to watch "Slow Horses" season 6 online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' S6 release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Slow Horses" season 6 premieres globally on Apple TV on <strong>Wednesday, September 16, 2026</strong>. New episodes then arrive weekly every Wednesday until the finale on October 21, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>We've already <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">reviewed "Slow Horses" season 6</a> and consider it one of the very best shows of 2026, which will come as no surprise to fans of the series. Adapted from Mick Herron's novels <em>Joe Country</em> and <em>Slough House</em>, the latest episodes see the ragtag bunch of agents on the run after MI5 First Desk Diana Taverner puts them in the middle of a chaotic game of revenge.</p><p>Jackson Lamb and co. are now not only evading the dangerous tricks of those outside of MI5, but also those within. We have six fresh episodes to see how this one plays out, and the good news is they're all in one place, globally. Better yet, we already know there's a seventh season on the way, too.</p><p>Ready for more? Here's <strong>how to watch "Slow Horses" season 6</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-slow-horses-season-6-on-apple-tv"><span>How to watch 'Slow Horses' season 6 on Apple TV</span></h2><div class="product"><a data-dimension112="16584e68-ac4a-11f1-969d-f7b1651cf602" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Slow Horses" season 6 premieres on <a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow" data-dimension112="16584e68-ac4a-11f1-969d-f7b1651cf602" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Wednesday, September 16, 2026. </strong>New episodes will land on the streamer each Wednesday from then onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a couple of episodes before deciding whether to carry on with the series and the service.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $14.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong></p></div><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><h2 class="article-body__section" id="section-watch-slow-horses-season-6-from-anywhere"><span>Watch 'Slow Horses' season 6 from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="16585048-ac4a-11f1-ad7e-e9b7186f818d" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="16585048-ac4a-11f1-ad7e-e9b7186f818d" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Slow Horses" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="16585048-ac4a-11f1-ad7e-e9b7186f818d" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-slow-horses-season-6-trailer"><span>'Slow Horses' season 6 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/mZbJxpYHLuI" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-slow-horses-season-6-cast"><span>'Slow Horses' season 6 cast</span></h2><ul><li>Sir Gary Oldman as Jackson Lamb</li><li>Kristin Scott Thomas as Diana Taverner</li><li>Jack Lowden as River Cartwright</li><li>Saskia Reeves as Catherine Standish</li><li>Rosalind Eleazar as Louisa Guy</li><li>Christopher Chung as Roddy Ho</li><li>Aimee-Ffion Edwards as Shirley Dander</li><li>Tom Brooke as J.K. Coe</li><li>Olivia Cooke as Sidonie “Sid” Baker</li><li>Jonathan Pryce as David Cartwright</li><li>Hugo Weaving as Frank Harkness</li><li>Lenny Rush as Reece Nesmith</li><li>Harry Lloyd as Damien Cantor</li><li>Kyle Soller as Jim</li><li>MyAnna Buring as Jane</li><li>Ruth Bradley as Emma Flyte</li><li>Samuel West as Peter Judd</li><li>Joanna Scanlan as Moira Tregorian</li></ul><h2 id="39-slow-horses-39-season-6-episode-guide">'Slow Horses' season 6 episode guide</h2><p>There is no official synopsis for any of the "Slow Horses" season 6 episodes, but we do have episode titles and release dates...</p><ul><li><strong>Season 6, Episode 1, “Circle of Life”: </strong>Wednesday, September 16</li><li><strong>Season 6, Episode 2, “Daddy Issues”: </strong>Wednesday, September 23</li><li><strong>Season 6, Episode 3, “Resurrection”: </strong>Wednesday, September 30</li><li><strong>Season 6, Episode 4, “Lost and Found”: </strong>Wednesday, October 7</li><li><strong>Season 6, Episode 5, “Sayonara”: </strong>Wednesday, October 14</li><li><strong>Season 6, Episode 6, “Judgement Day”: </strong>Wednesday, October 21</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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear">How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' 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[ 7 Apple products expected to be announced in October — touchscreen MacBook Ultra, HomePad and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Apple's major "Surprise and Shine" event is behind us and the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a>, Apple's first foldable, is finally official. But there were some omissions based on the rumors, including a lack of smart home devices. </p><p>Those devices could still be on the way. Apple typically announces new MacBooks in October, and we could see some other products then as well. Here are the seven new Apple products that we could see next month.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYkKoW"></div>                            </div>                            <script src="https://kwizly.com/embed/XYkKoW.js" async=""></script><h2 id="touchscreen-macbook-ultra-with-oled">Touchscreen MacBook Ultra with OLED</h2><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="QPcja3jFKABn8AV7SjDfvd" name="MacBook Pro M5 Pro edit 5 final" alt="MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/QPcja3jFKABn8AV7SjDfvd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has already released a surprising number of Mac laptops and desktops this year. We had the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">M5 MacBook Air</a>, and M5 Pro and M5 Max MacBook Pros way back in the spring, plus late <a href="https://www.tomsguide.com/computing/apple-desktops/apple-is-turbocharging-the-mac-mini-with-its-new-m6-chip-but-the-model-with-an-m5-pro-is-actually-faster">refreshes of the Mac mini </a>and <a href="https://www.tomsguide.com/computing/apple-desktops/apple-just-announced-the-new-mac-studio-with-m5-ultra-and-it-will-be-a-local-ai-powerhouse">Mac Studio</a>.</p><p>Next month we're expecting an M6 version of the iMac, which also might get some new colorways, and an M6 MacBook Pro. </p><p>But the headliner should be a new <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Pro (or Ultra)</a>. The big change here should be a new OLED touchscreen display, which would make it the first OLED MacBook.</p><p>OLED panels are thinner, so the Ultra should be both slimmer and lighter in both 14- and 16-inch versions. It could be powered by the as-yet-unannounced M6 Pro and M6 Max chipsets. This does mean that we might not see the Ultra until early 2027, as Apple has pushed announcing those chips into the first half of the year.</p><p>Unfortunately, all these new features and higher-tier silicon mean that the Ultra could have a starting price around $2,499 for the 14-inch model, up from $2,199 for the current M5 Pro models.</p><h2 id="ipad-mini-with-oled">iPad mini with OLED</h2><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="FFvt6WRhhQWvHKtffpdzDX" name="iPad mini 7-LIST4.jpg" alt="iPad mini 7" src="https://cdn.mos.cms.futurecdn.net/FFvt6WRhhQWvHKtffpdzDX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The iPad Pro has had an OLED display since 2024, but we could finally see an <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">iPad mini with OLED</a> this October. Coincidentally, the mini hasn't received an update since October 2024, when the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7 </a>was released.</p><p>It will likely get a faster chip, probably the A19, if not the new A20, so it can run Apple Intelligence, especially the new Siri AI. It's not clear from rumors if any other design changes will be made. However, it might be thinner and lighter since the OLED panel is thinner.</p><p>We should also see an updated entry-level iPad. As far as we're aware the only update here would be new chips.</p><h2 id="smart-home-devices">Smart Home Devices</h2><p>We warned before the iPhone event that rumors about Apple's smart home options need to be taken with a grain of salt. For years, leaks and rumor mongers have suggested that Apple is planning to introduce a suite of smart home devices, including a revamped HomePod and an AI-powered Apple TV 4K set-top box.</p><p>Rumors suggested that Apple would announce these devices during the iPhone event, which obviously did not come to fruition.</p><p>Apple seems to have finally figured out <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> with <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a>. If it releases and works as pitched, we could finally start seeing Apple Home.</p><h3 id="homepod-home-hub">HomePod Home hub</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:3000px;"><p class="vanilla-image-block" style="padding-top:50.03%;"><img id="6cHdWWcJ7vz4iYUqsWBji4" name="Apple 2026 C HomePad Touch" alt="A rendering of an Apple HomePod with iPad-style touchscreen" src="https://cdn.mos.cms.futurecdn.net/6cHdWWcJ7vz4iYUqsWBji4-1920-80.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/Apple)</span></figcaption></figure><p>Previously, Bloomberg's Mark Gurman, long a reporter of the rumored HomePod updates, <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">believed </a>that a new <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod mini</a> could launch with the iPhones alongside the rumored HomePod Home hub. </p><p>However, right before the iPhone event, <a href="https://x.com/markgurman/status/2097687667471466751" target="_blank">Gurman cheekily tweeted</a>, "If you don't see the Apple TV, HomePod mini, home display and touch MacBook today, don't worry. It's only September."</p><p>Several different iterations of this device have been rumored, including one with a <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">$1,000 robot arm</a>. The most common version involves a <a href="https://www.tomsguide.com/home/smart-home/apple-tipped-to-launch-ai-wall-tablet-to-control-your-home-in-march-2025-everything-we-know-so-far">wall-mounted touchpad</a> or a HomePod speaker with a touch display about the size of an iPad mini. </p><p>This device would have a FaceTime camera for video calls and presence sensors to initiate smart home routines. </p><h3 id="homepod-mini-2">HomePod mini 2</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vBASuHrx9nHrVPyhDjThYN" name="apple-homepod-mini-midnight.jpg" alt="Apple HomePod mini in midnight with an iPhone" src="https://cdn.mos.cms.futurecdn.net/vBASuHrx9nHrVPyhDjThYN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>A  <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">new HomePod mini</a> might also debut, but it might not be as big of an upgrade as the Hub. Most rumors suggest that it will feature a new chip and audio improvements. It will probably get new colors.</p><p>The HomePod mini 2 has been on our <a href="https://www.tomsguide.com/news/hoping-for-a-homepod-mini-2-to-go-with-the-new-homepod-dont-hold-your-breath">rumor radar since at least 2023</a>. The current version debuted in 2020, and like the next device, is long overdue for an update.</p><h3 id="apple-tv-4k-2026">Apple TV 4K 2026</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="35tUhk2U4oNYnKewrYtsxJ" name="apple tv vpn.jpg" alt="Apple TV" src="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1920-80.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: Lebedev Yury/Shutterstock)</span></figcaption></figure><p>Like the HomePod series, Apple hasn't released a new version of the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a> since 2022. We're long overdue for an upgrade — even if it's only a more powerful chip for stronger performance. </p><p>Previously, it was suggested that a new Apple TV could feature <a href="https://www.tomsguide.com/entertainment/streaming-devices/new-apple-tv-4k-biggest-upgrades-just-leaked-ahead-of-launch">the A17 Pro chip</a>, but it's more likely it'll get the new A20 or, to save some money, last year's A19. The device should also get the <a href="https://www.tomsguide.com/phones/iphones/new-iphone-18-pro-chips-camera-upgrades-and-more-leaked-by-analyst-heres-what-we-know">rumored N2 chip </a>for better Wi-Fi and Bluetooth connectivity. </p><p>Outside of chips, the big upgrade would be Siri AI, which could let you connect the Apple TV as a hub for smart devices. One rumor suggested that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps:/www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera,</a> which would allow for FaceTime calls and gesture-based controls.</p><p>However, a rumored refresh of the Apple TV has been making the rounds for multiple years now. I won't believe this one until it actually happens.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo"><strong>I interviewed Apple CEO John Ternus on the making of the iPhone Duo — here's what made him say 'yes, that's it'</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/apple-intelligence/people-are-freaking-out-about-the-new-always-listening-apple-watches-heres-what-apple-ceo-john-ternus-told-us"><strong>People are freaking out about the new 'always-listening' Apple Watches — here's what Apple CEO John Ternus told us</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news"><strong>Apple Event recap — Hands-on with the iPhone Duo and all the big announcements</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/ipads/7-apple-products-expected-to-be-announced-in-october-touchscreen-macbook-ultra-homepad-and-more</link>
                                                                            <description>
                            <![CDATA[ From devices that were missing at the iPhone event to the normal releases of new MacBooks. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XDSSh5HeF7oorNEPg8qU6d</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/e23qstJHdTZC8CzcxTVBhS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Smart Home]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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-320-70.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;br&gt;Send secure tips on Signal: scyo1.55.&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/e23qstJHdTZC8CzcxTVBhS-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[John Ternus at Apple event]]></media:description>                                                            <media:text><![CDATA[John Ternus at Apple event]]></media:text>
                                <media:title type="plain"><![CDATA[John Ternus at Apple event]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/e23qstJHdTZC8CzcxTVBhS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple's major "Surprise and Shine" event is behind us and the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a>, Apple's first foldable, is finally official. But there were some omissions based on the rumors, including a lack of smart home devices. </p><p>Those devices could still be on the way. Apple typically announces new MacBooks in October, and we could see some other products then as well. Here are the seven new Apple products that we could see next month.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYkKoW"></div>                            </div>                            <script src="https://kwizly.com/embed/XYkKoW.js" async=""></script><h2 id="touchscreen-macbook-ultra-with-oled">Touchscreen MacBook Ultra with OLED</h2><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="QPcja3jFKABn8AV7SjDfvd" name="MacBook Pro M5 Pro edit 5 final" alt="MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/QPcja3jFKABn8AV7SjDfvd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has already released a surprising number of Mac laptops and desktops this year. We had the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">M5 MacBook Air</a>, and M5 Pro and M5 Max MacBook Pros way back in the spring, plus late <a href="https://www.tomsguide.com/computing/apple-desktops/apple-is-turbocharging-the-mac-mini-with-its-new-m6-chip-but-the-model-with-an-m5-pro-is-actually-faster">refreshes of the Mac mini </a>and <a href="https://www.tomsguide.com/computing/apple-desktops/apple-just-announced-the-new-mac-studio-with-m5-ultra-and-it-will-be-a-local-ai-powerhouse">Mac Studio</a>.</p><p>Next month we're expecting an M6 version of the iMac, which also might get some new colorways, and an M6 MacBook Pro. </p><p>But the headliner should be a new <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Pro (or Ultra)</a>. The big change here should be a new OLED touchscreen display, which would make it the first OLED MacBook.</p><p>OLED panels are thinner, so the Ultra should be both slimmer and lighter in both 14- and 16-inch versions. It could be powered by the as-yet-unannounced M6 Pro and M6 Max chipsets. This does mean that we might not see the Ultra until early 2027, as Apple has pushed announcing those chips into the first half of the year.</p><p>Unfortunately, all these new features and higher-tier silicon mean that the Ultra could have a starting price around $2,499 for the 14-inch model, up from $2,199 for the current M5 Pro models.</p><h2 id="ipad-mini-with-oled">iPad mini with OLED</h2><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="FFvt6WRhhQWvHKtffpdzDX" name="iPad mini 7-LIST4.jpg" alt="iPad mini 7" src="https://cdn.mos.cms.futurecdn.net/FFvt6WRhhQWvHKtffpdzDX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The iPad Pro has had an OLED display since 2024, but we could finally see an <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">iPad mini with OLED</a> this October. Coincidentally, the mini hasn't received an update since October 2024, when the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7 </a>was released.</p><p>It will likely get a faster chip, probably the A19, if not the new A20, so it can run Apple Intelligence, especially the new Siri AI. It's not clear from rumors if any other design changes will be made. However, it might be thinner and lighter since the OLED panel is thinner.</p><p>We should also see an updated entry-level iPad. As far as we're aware the only update here would be new chips.</p><h2 id="smart-home-devices">Smart Home Devices</h2><p>We warned before the iPhone event that rumors about Apple's smart home options need to be taken with a grain of salt. For years, leaks and rumor mongers have suggested that Apple is planning to introduce a suite of smart home devices, including a revamped HomePod and an AI-powered Apple TV 4K set-top box.</p><p>Rumors suggested that Apple would announce these devices during the iPhone event, which obviously did not come to fruition.</p><p>Apple seems to have finally figured out <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> with <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a>. If it releases and works as pitched, we could finally start seeing Apple Home.</p><h3 id="homepod-home-hub">HomePod Home hub</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:3000px;"><p class="vanilla-image-block" style="padding-top:50.03%;"><img id="6cHdWWcJ7vz4iYUqsWBji4" name="Apple 2026 C HomePad Touch" alt="A rendering of an Apple HomePod with iPad-style touchscreen" src="https://cdn.mos.cms.futurecdn.net/6cHdWWcJ7vz4iYUqsWBji4-1920-80.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/Apple)</span></figcaption></figure><p>Previously, Bloomberg's Mark Gurman, long a reporter of the rumored HomePod updates, <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">believed </a>that a new <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod mini</a> could launch with the iPhones alongside the rumored HomePod Home hub. </p><p>However, right before the iPhone event, <a href="https://x.com/markgurman/status/2097687667471466751" target="_blank">Gurman cheekily tweeted</a>, "If you don't see the Apple TV, HomePod mini, home display and touch MacBook today, don't worry. It's only September."</p><p>Several different iterations of this device have been rumored, including one with a <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">$1,000 robot arm</a>. The most common version involves a <a href="https://www.tomsguide.com/home/smart-home/apple-tipped-to-launch-ai-wall-tablet-to-control-your-home-in-march-2025-everything-we-know-so-far">wall-mounted touchpad</a> or a HomePod speaker with a touch display about the size of an iPad mini. </p><p>This device would have a FaceTime camera for video calls and presence sensors to initiate smart home routines. </p><h3 id="homepod-mini-2">HomePod mini 2</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vBASuHrx9nHrVPyhDjThYN" name="apple-homepod-mini-midnight.jpg" alt="Apple HomePod mini in midnight with an iPhone" src="https://cdn.mos.cms.futurecdn.net/vBASuHrx9nHrVPyhDjThYN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>A  <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">new HomePod mini</a> might also debut, but it might not be as big of an upgrade as the Hub. Most rumors suggest that it will feature a new chip and audio improvements. It will probably get new colors.</p><p>The HomePod mini 2 has been on our <a href="https://www.tomsguide.com/news/hoping-for-a-homepod-mini-2-to-go-with-the-new-homepod-dont-hold-your-breath">rumor radar since at least 2023</a>. The current version debuted in 2020, and like the next device, is long overdue for an update.</p><h3 id="apple-tv-4k-2026">Apple TV 4K 2026</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="35tUhk2U4oNYnKewrYtsxJ" name="apple tv vpn.jpg" alt="Apple TV" src="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1920-80.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: Lebedev Yury/Shutterstock)</span></figcaption></figure><p>Like the HomePod series, Apple hasn't released a new version of the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a> since 2022. We're long overdue for an upgrade — even if it's only a more powerful chip for stronger performance. </p><p>Previously, it was suggested that a new Apple TV could feature <a href="https://www.tomsguide.com/entertainment/streaming-devices/new-apple-tv-4k-biggest-upgrades-just-leaked-ahead-of-launch">the A17 Pro chip</a>, but it's more likely it'll get the new A20 or, to save some money, last year's A19. The device should also get the <a href="https://www.tomsguide.com/phones/iphones/new-iphone-18-pro-chips-camera-upgrades-and-more-leaked-by-analyst-heres-what-we-know">rumored N2 chip </a>for better Wi-Fi and Bluetooth connectivity. </p><p>Outside of chips, the big upgrade would be Siri AI, which could let you connect the Apple TV as a hub for smart devices. One rumor suggested that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps:/www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera,</a> which would allow for FaceTime calls and gesture-based controls.</p><p>However, a rumored refresh of the Apple TV has been making the rounds for multiple years now. I won't believe this one until it actually happens.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo"><strong>I interviewed Apple CEO John Ternus on the making of the iPhone Duo — here's what made him say 'yes, that's it'</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/apple-intelligence/people-are-freaking-out-about-the-new-always-listening-apple-watches-heres-what-apple-ceo-john-ternus-told-us"><strong>People are freaking out about the new 'always-listening' Apple Watches — here's what Apple CEO John Ternus told us</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news"><strong>Apple Event recap — Hands-on with the iPhone Duo and all the big announcements</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'I haven't farted since 1971': Gary Oldman on what separates him from Jackson Lamb ahead of 'Slow Horses' season 6 ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><a data-analytics-id="inline-link" href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far"><strong>Read our "Slow Horses" season 6 review</strong></a></li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p>"Slow Horses" season 6 is coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> later this week. Ahead of its September 16 premiere on Apple's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service,</a> I got a chance to sit in on a virtual press conference with the show's star, Sir Gary Oldman, who was in Edinburgh to receive the Edinburgh TV Festival's Global Icon Award.</p><p>It was an enlightening exchange; admittedly, any conversation with Sir Gary is likely to be enlightening. But over the course of a half-hour, the iconic actor discussed what separates him from the odorous spymaster he plays on TV, what it's like to work with Olivia Cooke, Jack Lowden and the rest of the Slough House crew, and why it's so important to him that the show delivers a new season every year to its fans.</p><p>Last week, I wrote about his comments regarding <a href="https://www.tomsguide.com/entertainment/apple-tv/gary-oldman-on-slow-horses-season-6-new-and-familiar-faces-to-expect-including-the-return-of-olivia-cooke">the return of Olivia Cooke to "Slow Horses" season 6</a>. Today, I wanted to bring you his thoughts on the Emmy Award-nominated character he portrays in the spy thriller. Here's <strong>Gary Oldman on what separates him from Jackson Lamb going into "Slow Horses" season 6</strong>. And don't forget to check out our <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">spoiler-free review of "Slow Horses" season 6</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async=""></script><h2 id="39-jackson-lamb-has-no-filter-39">'Jackson Lamb has no filter'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ge5qBpqJuJmWqDqq2eknYc" name="slowhorses-season4.jpg" alt="Gary Oldman as Jackson Lamb on the phone in Slow Horses season 4" src="https://cdn.mos.cms.futurecdn.net/ge5qBpqJuJmWqDqq2eknYc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV Plus)</span></figcaption></figure><p>With the way actors sink into a character these days, and given that Oldman has now played Lamb since 2022, it's fair to wonder if he and the character have started to merge. But the veteran actor was quick to quash that idea when asked.</p><p>"Well, I would hope not," Oldman responded when asked if he had picked up any of Lamb's bad habits. "[I] don't smoke. I don't drink anymore. I'm much softer than ... Jackson Lamb has no filter. So he'll be very, very direct with people. And I don't want confrontation. Life's too short."</p><div><blockquote><p>"Well, I would hope not."</p><p>Sir Gary Oldman on if he's picked up Jackson Lamb's bad habits</p></blockquote></div><p>Of course, that's not to say the actor thinks he was always a model citizen. "Maybe I liked to sort of, you know, rough it up a bit when I was younger," he explained. "But I'm far too ... I don't want to hurt people's feelings. I don't want to make people feel less than or uncomfortable. And Lamb, he does a bit. There's a side of him that actually takes pleasure in that. So I hope I've not picked up anything [from Lamb]."</p><h2 id="gary-oldman-wants-you-to-stop-asking-his-castmates-if-he-smells">Gary Oldman wants you to stop asking his castmates if he smells</h2><p>One of Lamb's defining characteristics is the general foul odor that comes alongside his foul temper. And Oldman was quick to point out that just because Lamb smells bad doesn't mean Sir Gary smells bad on set.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bYCy4zRrx5PGuwsVaEPUVE" name="slow-horses-s6" alt="Gary Oldman as Jackson Lamb in "Slow Horses"" src="https://cdn.mos.cms.futurecdn.net/bYCy4zRrx5PGuwsVaEPUVE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><div><blockquote><p>"I haven't farted since 1971" </p><p>Sir Gary Oldman on how he and Jackson Lamb differ in a major way</p></blockquote></div><p>"I don't smell," Oldman quickly retorted when asked whether his on-screen aroma was authentic. "People ask Kristen Scott Thomas and Jack Lowden, 'Does he smell?' Well, I don't smell. It's all smoke and mirrors, you know. It's all makeup and hair gel."</p><p>That said, Oldman did admit that he can slip into Lamb in an instant if needed, smelly or not. "It gets some of your skin a bit," Sir Gary explained. "It's not that you're conscious of Jackson Lamb in your everyday life, or when I'm not doing it. But he's there."</p><p>Oldman then reminisced about some past roles where he's been able to flip a switch and become the person he's playing. "I've done it with [Harry] Potter, and I've done it with the [Christopher Nolan] Batman trilogy. But that was sort of infrequent. It's not as continuous as this [portraying Lamb]."</p><p><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/hulu/3-new-hulu-shows-you-need-to-binge-watch-this-weekend-sept-11-13">3 new Hulu shows you need to binge-watch this weekend (Sept. 11-13)</a></li><li><a href="https://www.tomsguide.com/us/get-sunday-ticket-without-directv,review-3811.html">How to get NFL Sunday Ticket for 2026-2027 season — Pricing, where to watch and more</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/i-havent-farted-since-1971-gary-oldman-on-what-separates-him-from-jackson-lamb-ahead-of-slow-horses-season-6</link>
                                                                            <description>
                            <![CDATA[ Sir Gary Oldman discusses how he's far different from his character, Jackson Lamb, ahead of "Slow Horses" season 6. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9uUcewRGxuYCsLCQr7RNrK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GQukLg5pzEy6EdLohrpojB-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Sun, 13 Sep 2026 12:31:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/GQukLg5pzEy6EdLohrpojB-1920-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sir Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot; season 5 on Apple TV.]]></media:description>                                                            <media:text><![CDATA[Sir Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot; season 5 on Apple TV.]]></media:text>
                                <media:title type="plain"><![CDATA[Sir Gary Oldman as Jackson Lamb in &quot;Slow Horses&quot; season 5 on Apple TV.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GQukLg5pzEy6EdLohrpojB-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><a data-analytics-id="inline-link" href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far"><strong>Read our "Slow Horses" season 6 review</strong></a></li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p>"Slow Horses" season 6 is coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> later this week. Ahead of its September 16 premiere on Apple's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service,</a> I got a chance to sit in on a virtual press conference with the show's star, Sir Gary Oldman, who was in Edinburgh to receive the Edinburgh TV Festival's Global Icon Award.</p><p>It was an enlightening exchange; admittedly, any conversation with Sir Gary is likely to be enlightening. But over the course of a half-hour, the iconic actor discussed what separates him from the odorous spymaster he plays on TV, what it's like to work with Olivia Cooke, Jack Lowden and the rest of the Slough House crew, and why it's so important to him that the show delivers a new season every year to its fans.</p><p>Last week, I wrote about his comments regarding <a href="https://www.tomsguide.com/entertainment/apple-tv/gary-oldman-on-slow-horses-season-6-new-and-familiar-faces-to-expect-including-the-return-of-olivia-cooke">the return of Olivia Cooke to "Slow Horses" season 6</a>. Today, I wanted to bring you his thoughts on the Emmy Award-nominated character he portrays in the spy thriller. Here's <strong>Gary Oldman on what separates him from Jackson Lamb going into "Slow Horses" season 6</strong>. And don't forget to check out our <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">spoiler-free review of "Slow Horses" season 6</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async=""></script><h2 id="39-jackson-lamb-has-no-filter-39">'Jackson Lamb has no filter'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ge5qBpqJuJmWqDqq2eknYc" name="slowhorses-season4.jpg" alt="Gary Oldman as Jackson Lamb on the phone in Slow Horses season 4" src="https://cdn.mos.cms.futurecdn.net/ge5qBpqJuJmWqDqq2eknYc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV Plus)</span></figcaption></figure><p>With the way actors sink into a character these days, and given that Oldman has now played Lamb since 2022, it's fair to wonder if he and the character have started to merge. But the veteran actor was quick to quash that idea when asked.</p><p>"Well, I would hope not," Oldman responded when asked if he had picked up any of Lamb's bad habits. "[I] don't smoke. I don't drink anymore. I'm much softer than ... Jackson Lamb has no filter. So he'll be very, very direct with people. And I don't want confrontation. Life's too short."</p><div><blockquote><p>"Well, I would hope not."</p><p>Sir Gary Oldman on if he's picked up Jackson Lamb's bad habits</p></blockquote></div><p>Of course, that's not to say the actor thinks he was always a model citizen. "Maybe I liked to sort of, you know, rough it up a bit when I was younger," he explained. "But I'm far too ... I don't want to hurt people's feelings. I don't want to make people feel less than or uncomfortable. And Lamb, he does a bit. There's a side of him that actually takes pleasure in that. So I hope I've not picked up anything [from Lamb]."</p><h2 id="gary-oldman-wants-you-to-stop-asking-his-castmates-if-he-smells">Gary Oldman wants you to stop asking his castmates if he smells</h2><p>One of Lamb's defining characteristics is the general foul odor that comes alongside his foul temper. And Oldman was quick to point out that just because Lamb smells bad doesn't mean Sir Gary smells bad on set.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bYCy4zRrx5PGuwsVaEPUVE" name="slow-horses-s6" alt="Gary Oldman as Jackson Lamb in "Slow Horses"" src="https://cdn.mos.cms.futurecdn.net/bYCy4zRrx5PGuwsVaEPUVE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><div><blockquote><p>"I haven't farted since 1971" </p><p>Sir Gary Oldman on how he and Jackson Lamb differ in a major way</p></blockquote></div><p>"I don't smell," Oldman quickly retorted when asked whether his on-screen aroma was authentic. "People ask Kristen Scott Thomas and Jack Lowden, 'Does he smell?' Well, I don't smell. It's all smoke and mirrors, you know. It's all makeup and hair gel."</p><p>That said, Oldman did admit that he can slip into Lamb in an instant if needed, smelly or not. "It gets some of your skin a bit," Sir Gary explained. "It's not that you're conscious of Jackson Lamb in your everyday life, or when I'm not doing it. But he's there."</p><p>Oldman then reminisced about some past roles where he's been able to flip a switch and become the person he's playing. "I've done it with [Harry] Potter, and I've done it with the [Christopher Nolan] Batman trilogy. But that was sort of infrequent. It's not as continuous as this [portraying Lamb]."</p><p><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/hulu/3-new-hulu-shows-you-need-to-binge-watch-this-weekend-sept-11-13">3 new Hulu shows you need to binge-watch this weekend (Sept. 11-13)</a></li><li><a href="https://www.tomsguide.com/us/get-sunday-ticket-without-directv,review-3811.html">How to get NFL Sunday Ticket for 2026-2027 season — Pricing, where to watch and more</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Gary Oldman on 'Slow Horses' season 6: New and familiar faces to expect, including the return of Olivia Cooke ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><a data-analytics-id="inline-link" href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far"><strong>Read our "Slow Horses" season 6 review</strong></a></li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p>"Slow Horses" season 6 is coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> next week. But ahead of its September 16 premiere on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service,</a> I got a chance to sit in on a virtual press conference with the show's star (and probably the only person guaranteed to survive a given season), Sir Gary Oldman.</p><p>It was an enlightening exchange, not least of all because any conversation with Sir Gary is likely to be enlightening. But over the course of a half-hour, the legendary actor discussed what separates him from the odorous spymaster he plays on TV, what it's like to work with Olivia Cooke, Jack Lowden and the rest of the Slough House crew, and why it's so important to him that the show delivers a new season every year to its fans.</p><p>So, today, I wanted to bring you some of the more insightful comments from that conversation. Here's <strong>Gary Oldman on 'Slow Horses' season 6: New and familiar faces to expect, including the return of Olivia Cooke</strong>. And don't forget to check out our <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">spoiler-free review of "Slow Horses" season 6</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async=""></script><h2 id="gary-oldman-on-39-slow-horses-39-cast-39-it-39-s-like-a-big-family-39">Gary Oldman on 'Slow Horses' cast: 'It's like a big family'</h2><p>When asked if he missed playing Jackson Lamb, the head of Slough House in "Slow Horses," Gary Oldman quickly responded in a way seemingly uncharacteristic of the crotchety spy. He said it wasn't Lamb he missed, as much as it was all the people he gets to work with as Lamb each season.</p><div><blockquote><p>"As a new season gears up, and as my start date sort of nears, I get quite excited to think I'm going to get on the set again and see Saskia and see Jack, and Chris, and Aimee and Tom."</p><p>Sir Gary Oldman on the best part of playing Jackson Lamb</p></blockquote></div><p>"I tell you what I miss, really, in between the seasons," Oldman explained, "is I miss the sort of company and the camaraderie. The group of people that we've put together, with the cast and the crew over now six years, it's like a big family."</p><p>It seems the anticipation for these annual family reunions starts building quickly too. "As a new season gears up, and as my start date sort of nears, I get quite excited to think I'm going to get on the set again and see Saskia [Reeves] and see Jack [Lowden], and Chris [Chung], and Aimee [-Ffion Edwards] and Tom [Brooke]," he continued. "I think that that's been one of the things that has made it [filming] as enjoyable as it is over such a long period of time."</p><h2 id="39-we-were-thrilled-when-we-heard-that-sid-baker-was-coming-back-39">'We were thrilled when we heard that Sid Baker was coming back'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1501px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="oGCXbPaWCcwJ5HNqag9QAD" name="Slow_Horses_Photo_060302" alt="Olivia Cooke in "Slow Horses" season 6 on Apple TV" src="https://cdn.mos.cms.futurecdn.net/oGCXbPaWCcwJ5HNqag9QAD-1920-80.png" mos="" align="middle" fullscreen="" width="1501" height="844" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>In season 1 of "Slow Horses," Olivia Cooke quickly became a fan favorite as agent Sidonie "Sid" Baker. So it was quite shocking when, at the end of the season, she was shot in the head and presumed dead.</p><div><blockquote><p>"We loved Olivia. And thought she was so good in season one. So we were thrilled when we heard that Sid Baker was coming back." </p><p>Sir Gary Oldman on working with Olivia Cooke again</p></blockquote></div><p>Even more shocking was her sudden return in season 6. Not least of all because now she has her hands full with "House of the Dragon." According to Oldman, it seems like her return wasn't necessarily always in the cards.</p><p>"Well, for the longest time, we thought that Sid [Cooke] was dead," explains Oldman. "Then there were these rumors that she was coming back and that she wasn't dead, and we so we never really we never really knew for sure."</p><p>Things became more cemented, though, when Sid reappeared in Mick Herron's "Slough House" books. That's a creative decision Oldman seems to have no complaints about.</p><p>"We loved Olivia," Oldman continued, "and thought she was so good in season one. So we were thrilled when we heard that Sid Baker was coming back." </p><p>It seems that his character, Jackson Lamb, would have been thrilled too. "Lamb always had great—he had great respect for Sid," Oldman explained. "He thought Sid was a really good agent. In fact, she was, as you, as we know now, a plant. She was not a reject. She was put there specifically. So yeah, Lamb thinks that she's a good agent."</p><h2 id="on-newcomer-lenny-rush-39-he-39-s-an-interesting-challenge-for-jackson-lamb-39">On newcomer Lenny Rush: 'He's an interesting challenge for Jackson Lamb'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mZbJxpYHLuI" allowfullscreen=""></iframe></div></div><p>There, as always, are a few new faces to this season of "Slow Horses." But one of the most intriguing additions to the cast is Lenny Rush. The 17-year-old actor is a familiar face to British audiences, but an unknown to American audiences. He also represents a first for the show, as he'll be the first minor to play a major role in the spy thriller series.</p><div><blockquote><p>"I think he [Lamb] has respect because he [Rush] can give as good as he gets. So he's an interesting challenge for Jackson Lamb."</p><p>Sir Gary Oldman on working with newcomer Lenny Rush</p></blockquote></div><p>So, naturally, people had questions about his role in the upcoming season. Oldman, for his part, seemed to suggest that, despite his age, Rush can hang with these old washed up spie just fine.</p><p>"Well, he's really the key to unraveling all of this," Oldman explained. "Jackson Lamb, you know, being the great sort of detective that he is, realizes that he's [Rush] really may be the key to unlock all of this, but he's got no time for the snivelling old kid [Oldman lets out a laugh at this point]." </p><p>"So they have a very interesting combative relationship," Oldman continued. But I think he [Lamb] has respect because he [Rush] can give as good as he gets. So he's an interesting challenge for Jackson Lamb."</p><p>Having seen the season myself, Oldman frankly might be underselling the dynamic his character has with Rush on screen. So tune into the "Slow Horses" season 6 premiere to see these new and familiar faces back on your TV screen once more.</p><p><em></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-sept-7-13-2026">5 best new Netflix movies and shows to stream this week (Sept. 7-13)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/this-denzel-washington-and-russell-crowe-crime-drama-is-still-great-19-years-later-and-you-can-stream-it-for-free">This Denzel Washington and Russell Crowe crime drama is still great 19 years later — and you can stream it for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/gary-oldman-on-slow-horses-season-6-new-and-familiar-faces-to-expect-including-the-return-of-olivia-cooke</link>
                                                                            <description>
                            <![CDATA[ Sir Gary Oldman discusses new and familiar faces to expect in 'Slow Horses' season 6, including the return of Olivia Cooke, the arrival of Lenny Rush and more ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5Gn7p9Gf9mJkKjr6LAYR6b</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Uvxwz3K9QYbJTNeFcS6HtD-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/Uvxwz3K9QYbJTNeFcS6HtD-1920-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(L-R) Sir Gary Oldman and Olivia Cooke in &quot;Slow Horses&quot; season 6 on Apple TV]]></media:description>                                                            <media:text><![CDATA[(L-R) Sir Gary Oldman and Olivia Cooke in &quot;Slow Horses&quot; season 6 on Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[(L-R) Sir Gary Oldman and Olivia Cooke in &quot;Slow Horses&quot; season 6 on Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Uvxwz3K9QYbJTNeFcS6HtD-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><a data-analytics-id="inline-link" href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far"><strong>Read our "Slow Horses" season 6 review</strong></a></li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p>"Slow Horses" season 6 is coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> next week. But ahead of its September 16 premiere on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service,</a> I got a chance to sit in on a virtual press conference with the show's star (and probably the only person guaranteed to survive a given season), Sir Gary Oldman.</p><p>It was an enlightening exchange, not least of all because any conversation with Sir Gary is likely to be enlightening. But over the course of a half-hour, the legendary actor discussed what separates him from the odorous spymaster he plays on TV, what it's like to work with Olivia Cooke, Jack Lowden and the rest of the Slough House crew, and why it's so important to him that the show delivers a new season every year to its fans.</p><p>So, today, I wanted to bring you some of the more insightful comments from that conversation. Here's <strong>Gary Oldman on 'Slow Horses' season 6: New and familiar faces to expect, including the return of Olivia Cooke</strong>. And don't forget to check out our <a href="https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far">spoiler-free review of "Slow Horses" season 6</a>.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async=""></script><h2 id="gary-oldman-on-39-slow-horses-39-cast-39-it-39-s-like-a-big-family-39">Gary Oldman on 'Slow Horses' cast: 'It's like a big family'</h2><p>When asked if he missed playing Jackson Lamb, the head of Slough House in "Slow Horses," Gary Oldman quickly responded in a way seemingly uncharacteristic of the crotchety spy. He said it wasn't Lamb he missed, as much as it was all the people he gets to work with as Lamb each season.</p><div><blockquote><p>"As a new season gears up, and as my start date sort of nears, I get quite excited to think I'm going to get on the set again and see Saskia and see Jack, and Chris, and Aimee and Tom."</p><p>Sir Gary Oldman on the best part of playing Jackson Lamb</p></blockquote></div><p>"I tell you what I miss, really, in between the seasons," Oldman explained, "is I miss the sort of company and the camaraderie. The group of people that we've put together, with the cast and the crew over now six years, it's like a big family."</p><p>It seems the anticipation for these annual family reunions starts building quickly too. "As a new season gears up, and as my start date sort of nears, I get quite excited to think I'm going to get on the set again and see Saskia [Reeves] and see Jack [Lowden], and Chris [Chung], and Aimee [-Ffion Edwards] and Tom [Brooke]," he continued. "I think that that's been one of the things that has made it [filming] as enjoyable as it is over such a long period of time."</p><h2 id="39-we-were-thrilled-when-we-heard-that-sid-baker-was-coming-back-39">'We were thrilled when we heard that Sid Baker was coming back'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1501px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="oGCXbPaWCcwJ5HNqag9QAD" name="Slow_Horses_Photo_060302" alt="Olivia Cooke in "Slow Horses" season 6 on Apple TV" src="https://cdn.mos.cms.futurecdn.net/oGCXbPaWCcwJ5HNqag9QAD-1920-80.png" mos="" align="middle" fullscreen="" width="1501" height="844" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>In season 1 of "Slow Horses," Olivia Cooke quickly became a fan favorite as agent Sidonie "Sid" Baker. So it was quite shocking when, at the end of the season, she was shot in the head and presumed dead.</p><div><blockquote><p>"We loved Olivia. And thought she was so good in season one. So we were thrilled when we heard that Sid Baker was coming back." </p><p>Sir Gary Oldman on working with Olivia Cooke again</p></blockquote></div><p>Even more shocking was her sudden return in season 6. Not least of all because now she has her hands full with "House of the Dragon." According to Oldman, it seems like her return wasn't necessarily always in the cards.</p><p>"Well, for the longest time, we thought that Sid [Cooke] was dead," explains Oldman. "Then there were these rumors that she was coming back and that she wasn't dead, and we so we never really we never really knew for sure."</p><p>Things became more cemented, though, when Sid reappeared in Mick Herron's "Slough House" books. That's a creative decision Oldman seems to have no complaints about.</p><p>"We loved Olivia," Oldman continued, "and thought she was so good in season one. So we were thrilled when we heard that Sid Baker was coming back." </p><p>It seems that his character, Jackson Lamb, would have been thrilled too. "Lamb always had great—he had great respect for Sid," Oldman explained. "He thought Sid was a really good agent. In fact, she was, as you, as we know now, a plant. She was not a reject. She was put there specifically. So yeah, Lamb thinks that she's a good agent."</p><h2 id="on-newcomer-lenny-rush-39-he-39-s-an-interesting-challenge-for-jackson-lamb-39">On newcomer Lenny Rush: 'He's an interesting challenge for Jackson Lamb'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mZbJxpYHLuI" allowfullscreen=""></iframe></div></div><p>There, as always, are a few new faces to this season of "Slow Horses." But one of the most intriguing additions to the cast is Lenny Rush. The 17-year-old actor is a familiar face to British audiences, but an unknown to American audiences. He also represents a first for the show, as he'll be the first minor to play a major role in the spy thriller series.</p><div><blockquote><p>"I think he [Lamb] has respect because he [Rush] can give as good as he gets. So he's an interesting challenge for Jackson Lamb."</p><p>Sir Gary Oldman on working with newcomer Lenny Rush</p></blockquote></div><p>So, naturally, people had questions about his role in the upcoming season. Oldman, for his part, seemed to suggest that, despite his age, Rush can hang with these old washed up spie just fine.</p><p>"Well, he's really the key to unraveling all of this," Oldman explained. "Jackson Lamb, you know, being the great sort of detective that he is, realizes that he's [Rush] really may be the key to unlock all of this, but he's got no time for the snivelling old kid [Oldman lets out a laugh at this point]." </p><p>"So they have a very interesting combative relationship," Oldman continued. But I think he [Lamb] has respect because he [Rush] can give as good as he gets. So he's an interesting challenge for Jackson Lamb."</p><p>Having seen the season myself, Oldman frankly might be underselling the dynamic his character has with Rush on screen. So tune into the "Slow Horses" season 6 premiere to see these new and familiar faces back on your TV screen once more.</p><p><em></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-sept-7-13-2026">5 best new Netflix movies and shows to stream this week (Sept. 7-13)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/this-denzel-washington-and-russell-crowe-crime-drama-is-still-great-19-years-later-and-you-can-stream-it-for-free">This Denzel Washington and Russell Crowe crime drama is still great 19 years later — and you can stream it for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 best shows like 'Silo' to watch while you wait for season 4 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As quickly as it came, <a href="https://www.tomsguide.com/entertainment/streaming/silo-season-3-everything-we-know-so-far">"Silo" season 3</a> went. The third installment of the <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> sci-fi drama, which is based on the novel trilogy ("Wool," "Shift" and "Dust" by author Hugh Howey), wrapped up its 10th and final episode on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> on Friday, Sept. 4. </p><p>Don't worry, there's plenty more dystopian fun in the future, with a fourth season of the Rebecca Ferguson-led series already picked up and expected to hit the streamer in July 2027. But if you need a little something to keep you distracted from that nearly yearlong wait until new episodes, we've got five recommendations: equally excellent series like "Silo," each equipped with a futuristic sci-fi edge, a rich sense of world-building and a high-stakes mystery that will keep you guessing. </p><p>If you like "Silo," here are five sci-fi dramas to watch next. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="39-paradise-39">'Paradise'</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/tCObCpYScdE" allowfullscreen=""></iframe></div></div><p>Sterling K. Brown leads Hulu political thriller "<a href="https://www.tomsguide.com/entertainment/hulu/paradise-season-2-finale-delivers-seismic-revelations-and-promises-an-earth-shattering-final-season">Paradise</a>" as Xavier Collins, the lead Secret Service agent tasked with detailing U.S. President Cal Bradford (played by James Marsden) — that is, until the POTUS is found killed in his bedroom. That shocking murder sets off a high-stakes investigation that finds Brown's character at the center as the primary suspect.</p><p>Oh, and did we forget to mention that this is all taking place following a global apocalypse that has destroyed the outside world, in a high-tech underground bunker filled with the world's most prominent and powerful people? Speaking of, the stacked ensemble includes Julianne Nicholson, Sarah Shahi, Nicole Brydon Bloom, Krys Marshall, Enuka Okuma, Tuc Watkins, Thomas Doherty and Shailene Woodley, the latter of whom just received an Emmy Award for her performance here.</p><p><em><strong>Stream </strong></em><a href="https://www.hulu.com/series/2b4b8988-50c9-4097-bf93-bc34a99a5b4f" target="_blank" rel="nofollow"><em><strong>"Paradise" on Hulu</strong></em></a><em><strong> now</strong></em></p><h2 id="39-pluribus-39">'Pluribus'</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/a6lzvWby9UE" allowfullscreen=""></iframe></div></div><p>For his first foray outside of the "<a href="https://www.tomsguide.com/news/best-shows-like-breaking-bad">Breaking Bad</a>" universe since "<a href="https://www.tomsguide.com/news/better-call-saul-season-5-release-date-cast-and-everything-we-know">Better Call Saul</a>" ended in 2022, creator Vince Gilligan left the world of gritty realism in favor of post-apocalyptic science fiction, led by a familiar face.  In a Golden Globe and Critics' Choice Award-winning lead performance, Rhea Seehorn stars as Carol Sturka, a chronically unhappy romance novelist who finds herself one of only a handful of people on Earth who are naturally immune to an alien virus that has transformed the rest of humanity into an overly happy hive mind. (The title "Pluribus<em>"</em> plays on the Latin phrase "e pluribus unum," or "out of many, one.")</p><p>While the rest of the world delights in their artificial peacefulness, cynical Carol is desperate to reclaim human agency and joins together with fellow survivors to break the collective consciousness.</p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/show/pluribus/umc.cmc.37axgovs2yozlyh3c2cmwzlza" target="_blank" rel="nofollow"><em><strong>"Pluribus" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-severance-39">'Severance'</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/xEQP4VVuyrY" allowfullscreen=""></iframe></div></div><p>From director Ben Stiller and creator Dan Erickson, "Severance"<em> </em>is a sci-fi thriller about a company where employees surgically split their memories between work and personal life. "Their 'innie' exists only at the office, while their 'outie' never knows what happens there," according to <a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-and-claude-to-summarize-severance-heres-the-one-that-id-send-to-my-friends-and-family">our ChatGPT tinkering</a>. "What starts as a clean solution to work–life balance becomes a disturbing exploration of control, identity, and what a job is allowed to take from you."</p><p>It's all a little more mind-bending than that, but to fantastic effect: The acclaimed drama series — which stars Adam Scott, Oscar winner Patricia Arquette and Christopher Walken and Emmy winners John Turturro, Britt Lower and Tramell Tillman, among others — has a stellar 95% approval rating on Rotten Tomatoes, where the site's critical consensus praises: "Audacious, mysterious, and bringing fresh insight into the perils of corporate drudgery, <em>Severance</em> is the complete package."</p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/show/severance/umc.cmc.1srk2goyh2q2zdxcx605w8vtx" target="_blank" rel="nofollow"><em><strong>"Severance" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-station-eleven-39">'Station Eleven'</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/0h-7BMDSc6U" allowfullscreen=""></iframe></div></div><p>If you want your sci-fi saga neatly packaged in an easily digestible miniseries format, this is the one for you: Based on the 2014 novel of the same name by Emily St. John Mandel, "Station Eleven" ran for 10 episodes on HBO Max and packed in a whole lot of dystopian drama into that runtime. </p><p>Starring Mackenzie Davis (who won a Critics' Choice award for her lead performance), Himesh Patel, Daniel Zovatto, Nabhaan Rizwan, Daniel Zovatto and Lori Petty, the limited series centers on the survivors of a devastating flu as they work as traveling performers and try to rebuild their world following the collapse of civilization. Its surprisingly complex characters and non-linear story structure help make it <a href="https://www.tomsguide.com/opinion/the-last-of-us-is-great-but-station-eleven-is-the-best-post-apocalypse-show-ive-ever-seen">one of the best post-apocalypse shows.</a></p><p><em><strong>Stream </strong></em><a href="https://www.hbomax.com/show/5f205b2b-80b6-47db-be11-35baa657eb4c" target="_blank" rel="nofollow"><em><strong>"Station Eleven" on HBO Max</strong></em></a><em><strong> now</strong></em></p><h2 id="39-fallout-39">'Fallout'</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/0kQ8i2FpRDk" allowfullscreen=""></iframe></div></div><p>“Fallout” quickly became one of the most successful video game adaptations on television when it debuted on Prime Video back in April 2024 (65 million viewers worldwide within the first 16 days is pretty good proof, no?) and it continued that hot streak with an even "darker, bloodier and still delightfully funny" <a href="https://www.tomsguide.com/entertainment/prime-video/fallout-season-2-review-darker-bloodier-and-still-delightfully-funny">second season</a> this past December. </p><p>A third season is currently in the works but if you haven't dabbled in this dystopian gem just yet, now's a great time: The series takes place 200 years after a global nuclear apocalypse, where survivors live in secure, luxury underground vaults. However, when they're forced to leave those safe and cushy confines, they're shocked to discover the highly violent universe waiting for them on the outside.  The action-packed sci-fi series counts Ella Purnell, Aaron Moten, Kyle MacLachlan, Moisés Arias, Xelia Mendes-Jones, Walton Goggins, and Frances Turner among its cast regulars. </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CN4GGGQ2" target="_blank" rel="nofollow"><em><strong>"Fallout" on Prime Video</strong></em></a><em><strong> now</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/movies/im-an-alien-superfan-and-ridley-scotts-return-has-me-seriously-worried-for-the-sci-fi-franchises-future">I’m an ‘Alien’ superfan, and Ridley Scott’s return has me seriously worried for the sci-fi franchise’s future</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/from-dune-to-the-handmaids-tale-24-classic-sci-fi-novels-to-celebrate-national-read-a-book-day">From Dune to The Handmaid's Tale: 24 classic sci-fi novels to celebrate National Read A Book Day</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-sci-fi-thriller-movie-could-have-been-the-streamers-best-movie-of-the-year-but-the-watered-down-finale-sinks-it">Netflix’s new sci-fi thriller could have been the streamer’s best movie of the year — but the watered-down finale sinks it</a></li></ul><div data-model-name="Netflix,Peacock TV,Paramount Plus,Hulu,Apple TV,Amazon Prime Video,Disney+" data-widget-type="multimodelreview" data-widget-title="Today's best streaming deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/5-best-shows-like-silo-to-watch-while-you-wait-for-season-4</link>
                                                                            <description>
                            <![CDATA[ Love the Rebecca Ferguson-led sci-fi series 'Silo'? You should add these five great dramas to your watch list. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TtHMuy6KgLahLv98nEfqxB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/o7hFwoN8uskypfr6xE3tph-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 09 Sep 2026 06:30:00 +0000</pubDate>                                                                                                                                <updated>Wed, 09 Sep 2026 08:27:19 +0000</updated>
                                                                                                                                            <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-320-70.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/o7hFwoN8uskypfr6xE3tph-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Rebecca Ferguson in Silo]]></media:description>                                                            <media:text><![CDATA[Rebecca Ferguson in Silo]]></media:text>
                                <media:title type="plain"><![CDATA[Rebecca Ferguson in Silo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/o7hFwoN8uskypfr6xE3tph-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As quickly as it came, <a href="https://www.tomsguide.com/entertainment/streaming/silo-season-3-everything-we-know-so-far">"Silo" season 3</a> went. The third installment of the <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> sci-fi drama, which is based on the novel trilogy ("Wool," "Shift" and "Dust" by author Hugh Howey), wrapped up its 10th and final episode on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> on Friday, Sept. 4. </p><p>Don't worry, there's plenty more dystopian fun in the future, with a fourth season of the Rebecca Ferguson-led series already picked up and expected to hit the streamer in July 2027. But if you need a little something to keep you distracted from that nearly yearlong wait until new episodes, we've got five recommendations: equally excellent series like "Silo," each equipped with a futuristic sci-fi edge, a rich sense of world-building and a high-stakes mystery that will keep you guessing. </p><p>If you like "Silo," here are five sci-fi dramas to watch next. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="39-paradise-39">'Paradise'</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/tCObCpYScdE" allowfullscreen=""></iframe></div></div><p>Sterling K. Brown leads Hulu political thriller "<a href="https://www.tomsguide.com/entertainment/hulu/paradise-season-2-finale-delivers-seismic-revelations-and-promises-an-earth-shattering-final-season">Paradise</a>" as Xavier Collins, the lead Secret Service agent tasked with detailing U.S. President Cal Bradford (played by James Marsden) — that is, until the POTUS is found killed in his bedroom. That shocking murder sets off a high-stakes investigation that finds Brown's character at the center as the primary suspect.</p><p>Oh, and did we forget to mention that this is all taking place following a global apocalypse that has destroyed the outside world, in a high-tech underground bunker filled with the world's most prominent and powerful people? Speaking of, the stacked ensemble includes Julianne Nicholson, Sarah Shahi, Nicole Brydon Bloom, Krys Marshall, Enuka Okuma, Tuc Watkins, Thomas Doherty and Shailene Woodley, the latter of whom just received an Emmy Award for her performance here.</p><p><em><strong>Stream </strong></em><a href="https://www.hulu.com/series/2b4b8988-50c9-4097-bf93-bc34a99a5b4f" target="_blank" rel="nofollow"><em><strong>"Paradise" on Hulu</strong></em></a><em><strong> now</strong></em></p><h2 id="39-pluribus-39">'Pluribus'</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/a6lzvWby9UE" allowfullscreen=""></iframe></div></div><p>For his first foray outside of the "<a href="https://www.tomsguide.com/news/best-shows-like-breaking-bad">Breaking Bad</a>" universe since "<a href="https://www.tomsguide.com/news/better-call-saul-season-5-release-date-cast-and-everything-we-know">Better Call Saul</a>" ended in 2022, creator Vince Gilligan left the world of gritty realism in favor of post-apocalyptic science fiction, led by a familiar face.  In a Golden Globe and Critics' Choice Award-winning lead performance, Rhea Seehorn stars as Carol Sturka, a chronically unhappy romance novelist who finds herself one of only a handful of people on Earth who are naturally immune to an alien virus that has transformed the rest of humanity into an overly happy hive mind. (The title "Pluribus<em>"</em> plays on the Latin phrase "e pluribus unum," or "out of many, one.")</p><p>While the rest of the world delights in their artificial peacefulness, cynical Carol is desperate to reclaim human agency and joins together with fellow survivors to break the collective consciousness.</p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/show/pluribus/umc.cmc.37axgovs2yozlyh3c2cmwzlza" target="_blank" rel="nofollow"><em><strong>"Pluribus" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-severance-39">'Severance'</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/xEQP4VVuyrY" allowfullscreen=""></iframe></div></div><p>From director Ben Stiller and creator Dan Erickson, "Severance"<em> </em>is a sci-fi thriller about a company where employees surgically split their memories between work and personal life. "Their 'innie' exists only at the office, while their 'outie' never knows what happens there," according to <a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-and-claude-to-summarize-severance-heres-the-one-that-id-send-to-my-friends-and-family">our ChatGPT tinkering</a>. "What starts as a clean solution to work–life balance becomes a disturbing exploration of control, identity, and what a job is allowed to take from you."</p><p>It's all a little more mind-bending than that, but to fantastic effect: The acclaimed drama series — which stars Adam Scott, Oscar winner Patricia Arquette and Christopher Walken and Emmy winners John Turturro, Britt Lower and Tramell Tillman, among others — has a stellar 95% approval rating on Rotten Tomatoes, where the site's critical consensus praises: "Audacious, mysterious, and bringing fresh insight into the perils of corporate drudgery, <em>Severance</em> is the complete package."</p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/show/severance/umc.cmc.1srk2goyh2q2zdxcx605w8vtx" target="_blank" rel="nofollow"><em><strong>"Severance" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="39-station-eleven-39">'Station Eleven'</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/0h-7BMDSc6U" allowfullscreen=""></iframe></div></div><p>If you want your sci-fi saga neatly packaged in an easily digestible miniseries format, this is the one for you: Based on the 2014 novel of the same name by Emily St. John Mandel, "Station Eleven" ran for 10 episodes on HBO Max and packed in a whole lot of dystopian drama into that runtime. </p><p>Starring Mackenzie Davis (who won a Critics' Choice award for her lead performance), Himesh Patel, Daniel Zovatto, Nabhaan Rizwan, Daniel Zovatto and Lori Petty, the limited series centers on the survivors of a devastating flu as they work as traveling performers and try to rebuild their world following the collapse of civilization. Its surprisingly complex characters and non-linear story structure help make it <a href="https://www.tomsguide.com/opinion/the-last-of-us-is-great-but-station-eleven-is-the-best-post-apocalypse-show-ive-ever-seen">one of the best post-apocalypse shows.</a></p><p><em><strong>Stream </strong></em><a href="https://www.hbomax.com/show/5f205b2b-80b6-47db-be11-35baa657eb4c" target="_blank" rel="nofollow"><em><strong>"Station Eleven" on HBO Max</strong></em></a><em><strong> now</strong></em></p><h2 id="39-fallout-39">'Fallout'</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/0kQ8i2FpRDk" allowfullscreen=""></iframe></div></div><p>“Fallout” quickly became one of the most successful video game adaptations on television when it debuted on Prime Video back in April 2024 (65 million viewers worldwide within the first 16 days is pretty good proof, no?) and it continued that hot streak with an even "darker, bloodier and still delightfully funny" <a href="https://www.tomsguide.com/entertainment/prime-video/fallout-season-2-review-darker-bloodier-and-still-delightfully-funny">second season</a> this past December. </p><p>A third season is currently in the works but if you haven't dabbled in this dystopian gem just yet, now's a great time: The series takes place 200 years after a global nuclear apocalypse, where survivors live in secure, luxury underground vaults. However, when they're forced to leave those safe and cushy confines, they're shocked to discover the highly violent universe waiting for them on the outside.  The action-packed sci-fi series counts Ella Purnell, Aaron Moten, Kyle MacLachlan, Moisés Arias, Xelia Mendes-Jones, Walton Goggins, and Frances Turner among its cast regulars. </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CN4GGGQ2" target="_blank" rel="nofollow"><em><strong>"Fallout" on Prime Video</strong></em></a><em><strong> now</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/movies/im-an-alien-superfan-and-ridley-scotts-return-has-me-seriously-worried-for-the-sci-fi-franchises-future">I’m an ‘Alien’ superfan, and Ridley Scott’s return has me seriously worried for the sci-fi franchise’s future</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/from-dune-to-the-handmaids-tale-24-classic-sci-fi-novels-to-celebrate-national-read-a-book-day">From Dune to The Handmaid's Tale: 24 classic sci-fi novels to celebrate National Read A Book Day</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-sci-fi-thriller-movie-could-have-been-the-streamers-best-movie-of-the-year-but-the-watered-down-finale-sinks-it">Netflix’s new sci-fi thriller could have been the streamer’s best movie of the year — but the watered-down finale sinks it</a></li></ul><div data-model-name="Netflix,Peacock TV,Paramount Plus,Hulu,Apple TV,Amazon Prime Video,Disney+" data-widget-type="multimodelreview" data-widget-title="Today's best streaming deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Slow Horses' season 6 review: One of the 10 best shows of 2026 so far ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: 4.5/5 stars</strong></li><li><strong>Verdict: </strong>"Slow Horses" excels for three reasons: brilliant writing, quick pacing and it's not afraid to kill its characters. Going into season 6, the writing staff changed and for the first time, two "Slough House" books are being covered in a single season. Fortunately, this show remains as excellent as ever, bringing back some familiar faces and killing some others. </li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p><strong>"Slow Horses" season 6 will be a contender for Outstanding Drama Series</strong> at the Emmys this time next year.</p><p>Apple's spy thriller is perennially a contender for not just the Emmys. It's a contender yearly for the title of best show on television. And when I say yearly, I mean it. Unlike many shows (including some other <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> shows), "Slow Horses" returns to Apple's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> every year. Like clockwork. In 2022, it even came twice.</p><p>But "Slow Horses" season 6 comes with some major changes to the series. Longtime showrunner Will Smith (not that Will Smith) stepped aside, and Gaby Chiappe took over as head writer. While she's a seasoned pro with experience developing a show, <br />"Slow Horses" will be the premier name on her resume by a mile or a kilometer, whichever you prefer.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async=""></script><p>That wasn't the only change to the way the show is written either. Normally, this show takes six episodes to adapt a single novel from Mick Herron's "Slough House" series. But this season, the show's writers are combining <em>two</em> novels into the same six episodes: "Joe Country" and "Slough House."</p><p>If that has alarm bells ringing in your head, I understand. Such major changes would be enough to have even the most professional spy ready for Moscow Rules. Thankfully, having seen the entirety of season 6 for myself, I can confirm that you have no reason to be worried about "Slow Horses" season 6. Not only is this show still as good as ever, but it's still good for the same reasons it's always been good, despite a change in lead writer.</p><h2 id="39-slow-horses-39-isn-39-t-afraid-to-kill-its-darlings-six-seasons-in">'Slow Horses' isn't afraid to kill its darlings six seasons in</h2><p>"Slow Horses" season 6 kicks off with its foot already fully on the gas. Jackson Lamb's (Sir Gary Oldman) former "Joes" (spies) are dropping like flies. Well, more accurately, they're being burned alive in shipping containers, among other terrible ways to go. Turns out, there's a list with all current and former Slough House residents, and a pair of hitmen (Kyle Soller and MyAnna Buring) are tearing through it with professional ease.</p><p>And to make matters worse, MI5 and its leader, Diana Taverner (Kristin Scott Thomas), seem generally unconcerned about this development. </p><p>Of course, being generally unconcerned with the loss of life is a hallmark of "Slow Horses." It's one of the things that separates it from the other spy thrillers out there. In most shows, there are a few characters where you go, "Well, surely they'll survive." Or, you might go, "Well, there's no way they'll kill off a beloved character." But in "Slow Horses," unless it's Oldman's aged spymaster, anyone and everyone can be killed off.</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:1501px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="oGCXbPaWCcwJ5HNqag9QAD" name="Slow_Horses_Photo_060302" alt="Olivia Cooke in "Slow Horses" season 6 on Apple TV" src="https://cdn.mos.cms.futurecdn.net/oGCXbPaWCcwJ5HNqag9QAD-1920-80.png" mos="" align="middle" fullscreen="" width="1501" height="844" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Case in point: this season, we'll get the return of Sid Baker, played by Olivia Cooke. It was a character who was an instant hit in season 1, played by a rising star who anyone would want on their call sheet. She was killed off by the end of the season, only to return this season to reveal her death was faked.</p><p>Rest assured, the writers will deliver similar death blows to beloved characters this season, and unlike Sid's death, they won't be faked. The show constantly keeps you guessing about who will make it out alive, and at least one death in the Slough House family will leave you shocked. In fact, you'll get a bombshell reveal that you won't see coming (provided you haven't read Herron's novels).</p><h2 id="verdict-39-slow-horses-39-season-6-doesn-39-t-deviate-from-an-award-winning-formula">Verdict: 'Slow Horses' season 6 doesn't deviate from an award-winning formula</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mZbJxpYHLuI" allowfullscreen=""></iframe></div></div><p>If I hadn't known that this show had a new writer, that it had the task of combining two books into just six episodes, I wouldn't have known just from watching "Slow Horses" season 6. This season felt just as polished, just as seamless as the previous five seasons.</p><p>I'm not sure it's my favorite season (the first two are still my top two, with season 4 close behind), but it has at least entered the conversation. River (Jack Lowden) and Lamb are still as good together as ever with their dysfunctional father-son dynamic. River and Frank Harkness (Hugo Weaving) are even better than ever with their actual father-son relationship that would give Luke Skywalker and Darth Vader a run for their money. Honestly, this show's best success story might be that I found myself wanting those two to be in the same room together as much as possible, not something I often say about a hero and villain.</p><p>Plus, the new faces added to the "Slow Horses" cast this season are all hits. Lenny Rush is a delight as Reece Nesmith, and can go toe-to-toe with Lamb when it comes to getting one over on people, as well as inappropriate flatulence. Fans of "Andor" will be excited to see Soller as one of the two hitmen taking out the Slough House alumni one by one, and Buring is well-placed alongside him.</p><p>Cooke ... well, she is not really a new face, and it shows. Her chemistry with Lowden as River is instant; it's like she never left. </p><p>So, if for some reason you were on the fence about this season of "Slow Horses," don't be. If you were thinking about watching this show for the first time, start with season 1, but then absolutely catch up to season 6. This spy thriller has stuck to its award-winning formula for yet another round, and it's officially one of my top 10 shows of the year so far.</p><p><em></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-sept-7-13-2026">5 best new Netflix movies and shows to stream this week (Sept. 7-13)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/this-denzel-washington-and-russell-crowe-crime-drama-is-still-great-19-years-later-and-you-can-stream-it-for-free">This Denzel Washington and Russell Crowe crime drama is still great 19 years later — and you can stream it for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/slow-horses-season-6-review-one-of-the-10-best-shows-of-2026-so-far</link>
                                                                            <description>
                            <![CDATA[ "Slow Horses" faced major changes going into season 6. It hasn't lost a step. Apple TV's spy thriller remains one of the best shows you can watch. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zEFbmwbRTRWWHqbhLMMdEW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/X3Hz3u85wu56LftFneuEVX-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 08 Sep 2026 07:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 08 Sep 2026 18:41:27 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/X3Hz3u85wu56LftFneuEVX-1920-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(L-R) Jack Lowden and Sir Gary Oldman in &quot;Slow Horses&quot; season 6]]></media:description>                                                            <media:text><![CDATA[(L-R) Jack Lowden and Sir Gary Oldman in &quot;Slow Horses&quot; season 6]]></media:text>
                                <media:title type="plain"><![CDATA[(L-R) Jack Lowden and Sir Gary Oldman in &quot;Slow Horses&quot; season 6]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/X3Hz3u85wu56LftFneuEVX-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Slow Horses' season 6</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: 4.5/5 stars</strong></li><li><strong>Verdict: </strong>"Slow Horses" excels for three reasons: brilliant writing, quick pacing and it's not afraid to kill its characters. Going into season 6, the writing staff changed and for the first time, two "Slough House" books are being covered in a single season. Fortunately, this show remains as excellent as ever, bringing back some familiar faces and killing some others. </li><li><strong>Premiere date/time:</strong> Season 6 premieres on Apple TV on September 16</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream "Slow Horses" on Apple TV</a></li></ul></p></div></div><p><strong>"Slow Horses" season 6 will be a contender for Outstanding Drama Series</strong> at the Emmys this time next year.</p><p>Apple's spy thriller is perennially a contender for not just the Emmys. It's a contender yearly for the title of best show on television. And when I say yearly, I mean it. Unlike many shows (including some other <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> shows), "Slow Horses" returns to Apple's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> every year. Like clockwork. In 2022, it even came twice.</p><p>But "Slow Horses" season 6 comes with some major changes to the series. Longtime showrunner Will Smith (not that Will Smith) stepped aside, and Gaby Chiappe took over as head writer. While she's a seasoned pro with experience developing a show, <br />"Slow Horses" will be the premier name on her resume by a mile or a kilometer, whichever you prefer.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xkw8JX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xkw8JX.js" async=""></script><p>That wasn't the only change to the way the show is written either. Normally, this show takes six episodes to adapt a single novel from Mick Herron's "Slough House" series. But this season, the show's writers are combining <em>two</em> novels into the same six episodes: "Joe Country" and "Slough House."</p><p>If that has alarm bells ringing in your head, I understand. Such major changes would be enough to have even the most professional spy ready for Moscow Rules. Thankfully, having seen the entirety of season 6 for myself, I can confirm that you have no reason to be worried about "Slow Horses" season 6. Not only is this show still as good as ever, but it's still good for the same reasons it's always been good, despite a change in lead writer.</p><h2 id="39-slow-horses-39-isn-39-t-afraid-to-kill-its-darlings-six-seasons-in">'Slow Horses' isn't afraid to kill its darlings six seasons in</h2><p>"Slow Horses" season 6 kicks off with its foot already fully on the gas. Jackson Lamb's (Sir Gary Oldman) former "Joes" (spies) are dropping like flies. Well, more accurately, they're being burned alive in shipping containers, among other terrible ways to go. Turns out, there's a list with all current and former Slough House residents, and a pair of hitmen (Kyle Soller and MyAnna Buring) are tearing through it with professional ease.</p><p>And to make matters worse, MI5 and its leader, Diana Taverner (Kristin Scott Thomas), seem generally unconcerned about this development. </p><p>Of course, being generally unconcerned with the loss of life is a hallmark of "Slow Horses." It's one of the things that separates it from the other spy thrillers out there. In most shows, there are a few characters where you go, "Well, surely they'll survive." Or, you might go, "Well, there's no way they'll kill off a beloved character." But in "Slow Horses," unless it's Oldman's aged spymaster, anyone and everyone can be killed off.</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:1501px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="oGCXbPaWCcwJ5HNqag9QAD" name="Slow_Horses_Photo_060302" alt="Olivia Cooke in "Slow Horses" season 6 on Apple TV" src="https://cdn.mos.cms.futurecdn.net/oGCXbPaWCcwJ5HNqag9QAD-1920-80.png" mos="" align="middle" fullscreen="" width="1501" height="844" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Case in point: this season, we'll get the return of Sid Baker, played by Olivia Cooke. It was a character who was an instant hit in season 1, played by a rising star who anyone would want on their call sheet. She was killed off by the end of the season, only to return this season to reveal her death was faked.</p><p>Rest assured, the writers will deliver similar death blows to beloved characters this season, and unlike Sid's death, they won't be faked. The show constantly keeps you guessing about who will make it out alive, and at least one death in the Slough House family will leave you shocked. In fact, you'll get a bombshell reveal that you won't see coming (provided you haven't read Herron's novels).</p><h2 id="verdict-39-slow-horses-39-season-6-doesn-39-t-deviate-from-an-award-winning-formula">Verdict: 'Slow Horses' season 6 doesn't deviate from an award-winning formula</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mZbJxpYHLuI" allowfullscreen=""></iframe></div></div><p>If I hadn't known that this show had a new writer, that it had the task of combining two books into just six episodes, I wouldn't have known just from watching "Slow Horses" season 6. This season felt just as polished, just as seamless as the previous five seasons.</p><p>I'm not sure it's my favorite season (the first two are still my top two, with season 4 close behind), but it has at least entered the conversation. River (Jack Lowden) and Lamb are still as good together as ever with their dysfunctional father-son dynamic. River and Frank Harkness (Hugo Weaving) are even better than ever with their actual father-son relationship that would give Luke Skywalker and Darth Vader a run for their money. Honestly, this show's best success story might be that I found myself wanting those two to be in the same room together as much as possible, not something I often say about a hero and villain.</p><p>Plus, the new faces added to the "Slow Horses" cast this season are all hits. Lenny Rush is a delight as Reece Nesmith, and can go toe-to-toe with Lamb when it comes to getting one over on people, as well as inappropriate flatulence. Fans of "Andor" will be excited to see Soller as one of the two hitmen taking out the Slough House alumni one by one, and Buring is well-placed alongside him.</p><p>Cooke ... well, she is not really a new face, and it shows. Her chemistry with Lowden as River is instant; it's like she never left. </p><p>So, if for some reason you were on the fence about this season of "Slow Horses," don't be. If you were thinking about watching this show for the first time, start with season 1, but then absolutely catch up to season 6. This spy thriller has stuck to its award-winning formula for yet another round, and it's officially one of my top 10 shows of the year so far.</p><p><em></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em>Stream "Slow Horses" on Apple TV</em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-sept-7-13-2026">5 best new Netflix movies and shows to stream this week (Sept. 7-13)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/this-denzel-washington-and-russell-crowe-crime-drama-is-still-great-19-years-later-and-you-can-stream-it-for-free">This Denzel Washington and Russell Crowe crime drama is still great 19 years later — and you can stream it for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-september-2026">Missed it in theaters? Here's every movie finally arriving on streaming in September 2026</a></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple Sept. 9 event — iPhone Ultra, iPhone 18 Pro all the new products to expect ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">APPLE EVENT LATEST NEWS AND RUMORS</div><div class="fancy_box_body"><p class="fancy-box__body-text"><em><strong>Updated September 7</strong></em></p><p class="fancy-box__body-text">• This is why the A20 Pro cvhip will be such a big deal for iPhone Ultra and 18 Pro<br />•  Here's what you need to know about the new <a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/smart-home/apple-homepad-rumored-release-date-price-and-all-the-latest-leaks">Apple HomePad</a><br />• The <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/iphone-ultra-price-rumors-heres-how-much-you-can-expect-to-pay-for-apples-first-foldable">iPhone Ultra price</a> could be even higher than you expect<br />• Our i<a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/iphone-ultra-exclusive-gurman-on-price-release-date-and-secret-weapon-versus-android">Phone Ultra preview interview</a> has all the details you need to know<br />• <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">"Surprise and shine"</a> event officially set for Wednesday, September 9</p></div></div><p>Apple's huge "Surprise and Shine" is just days away and the first major event under the leadership of incoming CEO John Ternus' promises to be a big one. And now we have a fairly clear picture of what the company should announce.</p><p>Bloomberg's Mark Gurman has dropped a <a href="https://www.bloomberg.com/news/newsletters/2026-09-06/apple-s-new-ceo-like-cook-pay-package-shows-he-s-going-nowhere-sept-9-event-mtpvpcj1" target="_blank">massive report</a> that outlines everything Apple should release over the next year. And we expect 9 of those new devices to come at the Apple September event, including Apple's first foldable phone in the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a>.</p><p>We've got a full breakdown of the devices likely headed your way, from the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pr</a>o series and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-12-and-ultra-4-rumors-your-next-apple-watch-could-have-a-ceramic-case">Apple Watch 12</a> to a new HomePad.</p><h3 class="article-body__section" id="section-when-is-the-apple-event"><span>When is the Apple event?</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:2066px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="fnjPCS2zVb2TZ4GCnuqwK5" name="Apple suprise and shine" alt="Apple fall event 2026." src="https://cdn.mos.cms.futurecdn.net/fnjPCS2zVb2TZ4GCnuqwK5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2066" height="1162" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has slated its "Surprise and shine" event for <strong>Wednesday, September 9 at Apple Park</strong>. Typically, Apple would hold its event on a Tuesday, but this year it's coming right after Labor Day, meaning it's being pushed to Wednesday.</p><p>This has happened before and Apple's reasoning has been that the company doesn't want to ask attendees to travel on the holiday weekend. As an example, the <a href="https://www.tomsguide.com/reviews/iphone-14">iPhone 14</a> launched on Wednesday, September 7, following Labor Day on Monday 5.</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/rQHEN3kngZo" allowfullscreen=""></iframe></div></div><p>The <strong>event is set to take place at 10am PT / 1pm ET / 6pm BST</strong> and will be livestreamed on various social media platforms as well as Apple's own site.</p><p>iPhones generally go up for pre-order the Friday following the Apple event, but this year that's September 11. Gurman has reported that pre-orders will be <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-iphone-18-pro-pre-order-date-just-tipped-heres-when-you-can-get-yours">pushed to Saturday, September 12</a>.</p><p>New CEO John Ternus is expected to host the monster event, and his tenure appears ready to start with a bang.</p><h2 class="article-body__section" id="section-iphone-18-pro-and-pro-max"><span>iPhone 18 Pro and Pro Max</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:2490px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="bc3v2xma2LGpb9mYSNpejc" name="iphone 18 pro render in dark cherry" alt="iphone 18 pro in dark cherry color from macworld" src="https://cdn.mos.cms.futurecdn.net/bc3v2xma2LGpb9mYSNpejc-1920-80.png" mos="" align="middle" fullscreen="" width="2490" height="1401" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Macworld)</span></figcaption></figure><p>This year, we believe that Apple will only launch the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> models. The entry-level iPhone 18 and iPhone 18 Plus reportedly <a href="https://www.tomsguide.com/phones/iphones/iphone-18-release-schedule-could-be-changing-but-this-rumor-makes-no-sense">won't debut until next spring</a> alongside the iPhone 18e.</p><p>The design of the Pro models should look similar to last year's iPhone 17 Pro models. However, the Dynamic Island should be smaller, with a 24MP selfie camera. <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-camera-upgrades-everything-we-know-about-the-new-sensor">Rumors suggest the Pro Max</a> model will also gain exclusive access new <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-be-the-first-iphone-to-get-a-variable-aperture-why-that-matters">variable aperture lens</a> and might also have a longer 6x zoom.</p><p>Both models should feature Apple's new 2nm <a href="https://www.tomsguide.com/phones/iphones/apple-a20-pro-chip-why-its-such-a-big-deal-for-the-iphone-ultra-and-iphone-18-pro-max">A20 Pro chip</a> and a new C2 modem. A <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-iphone-18-pro-a20-chip-leak-reveals-the-biggest-gpu-ever-inside-an-iphone">recent leak suggests</a> the A20 Pro could feature the largest ever GPU inside an iPhone, meaning better, more efficient performance. Speaking of performance, the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-battery-rumors-it-could-be-a-record-breaking-year-for-apple">latest rumors</a> suggest the iPhone 18 Pro Max could pack a new battery somewhere between 5,391 mAh and 5,567 mAh, and if Apple pushes the silicon's efficiency performance closer to 30%, it could last over 23 hours on a single charge. </p><p>For more, see our <a href="https://www.tomsguide.com/phones/iphones/3-big-reasons-to-buy-iphone-18-pro-max-over-the-iphone-18-pro-this-year">iPhone 18 Pro vs iPhone 18 Pro Max</a> comparison.</p><p>Unfortunately, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-see-absolutely-massive-price-hike-according-to-researchers">analysts have predicted</a> that the new iPhone 18 Pro models could cost between $200 and $250 more than the iPhone 17 Pro family. Here's hoping you have that extra money saved to cover the difference.</p><h3 class="article-body__section" id="section-iphone-ultra"><span>iPhone Ultra</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g5Ndi778wD3dSpn6XzB5te" name="iPhone Ultra Back AppleTrack-2" alt="iPhone Ultra render shown in hand" src="https://cdn.mos.cms.futurecdn.net/g5Ndi778wD3dSpn6XzB5te-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AppleTrack)</span></figcaption></figure><p>The biggest announcement of the Apple event is sure to be the debut of the foldable iPhone Ultra.</p><p>An <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-18-pro-max-unboxed-ahead-of-apple-event-these-could-be-the-final-designs">unboxing video</a> from this week revealed a squat passport shape similar to the new <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, with a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-specs-potentially-revealed-heres-how-it-would-stack-up-against-samsung-galaxy-z-fold-8">7.8-inch foldable display and a 5.5-inch cover screen</a>. Apple has allegedly made a crease-free display, one of the hangs up that stopped the company from making a foldable until now.</p><p>The Ultra could measure between 4.5 and 4.8mm when unfolded, making it one of the thinnest iPhones ever.</p><p>Inside, the Ultra would also feature the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-a20-pro-chip-apples-first-2nm-processor-to-power-new-foldable-phone">A20 Pro chipset</a> and Apple's in-house C2 modem, plus a Touch ID fingerprint scanner in the power button — in lieu of Face ID. It's supposed to feature a fairly larger 4,883 mAh battery.</p><p>The rear panel should house two 48MP cameras horizontally positioned (wide and ultrawide) and two separate 24MP selfie cameras — one for the cover display and one for the interior screen. </p><p>Apple reportedly delayed releasing a folding iPhone until it could eliminate the crease in the display, but whether it's accomplished this remains to be seen. Even Samsung and Oppo, despite their long lead time, have only <a href="https://www.tomsguide.com/phones/samsung-phones/comparing-galaxy-z-fold-8-vs-oppo-find-n6-crease">had moderate success</a>.</p><p>One downside is that the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-price-rumors-heres-how-much-you-can-expect-to-pay-for-apples-first-foldable">iPhone Ultra price</a> could be very expensive, costing anywhere from $2,000 to 2,500. And a recent leak suggests that<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-leakers-reveal-new-details-around-release-and-extremely-limited-availability"> iPhone Ultra may not be immediately available, </a>with only "extremely limited" availability.</p><p>Just keep in mind that the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-trade-offs-the-biggest-things-youre-not-getting-versus-iphone-18-pro">iPhone Ultra could have a number of trade-offs</a> versus the iPhone 18 Pro, including the lack of a telephoto zoom.</p><h2 class="article-body__section" id="section-airpods-5"><span>AirPods 5</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2ZeAyG6YEDw3Uu4QoJaXYA" name="Airpods 4.jpg" alt="Airpods 4" src="https://cdn.mos.cms.futurecdn.net/2ZeAyG6YEDw3Uu4QoJaXYA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The rumor mill has been excitedly leaking information about the AirPods Ultra, which could <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-with-cameras-are-nearly-ready-heres-4-features-you-need-to-know">feature a camera</a> that will feed into Siri to allow it to "see" the world. But according to a <a href="https://www.tomsguide.com/audio/airpods/gurman-ai-airpods-with-cameras-just-tipped-for-2027-launch-in-flurry-of-new-releases">Mark Gurman report</a>, we aren't expecting the <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-everything-we-know-so-far-about-apples-camera-earbuds">AirPods Ultra</a> until 2027 at the earliest. </p><p>Instead, we should get a slightly upgraded pair of AirPods 5. AppleTrack claims the design will be similar to the current AirPods 4. </p><p>Only two real upgrades have been suggested, including a better chip, volume control on the buds and a heart sensor similar to the Pro models. From a software side, the new AirPods 5 will likely take advantage of the more <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">powerful Siri AI </a>releasing this fall, though what features it gets remains to be seen.</p><h2 class="article-body__section" id="section-apple-watch-12-and-apple-watch-ultra-4"><span>Apple Watch 12 and Apple Watch Ultra 4</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:589px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="fYpaDpUGy9ie37wUcNrzwZ" name="Apple Watch Ultra 3" alt="Apple Watch Ultra 3" src="https://cdn.mos.cms.futurecdn.net/fYpaDpUGy9ie37wUcNrzwZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="589" height="331" 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>Similar to the AirPods, the leakers have been fairly quiet about the next Apple Watches. We are expecting to see the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch Series 12</a> and the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-these-are-the-upgrades-apple-needs-to-make-to-remain-the-smartwatch-king">Apple Watch Ultra 4</a>.</p><p>The designs shouldn't change too much, though Apple might  <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">offer a ceramic case </a><a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">option </a>for the new watches. The biggest change might be a <a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">new kind of band attachment</a>. This does mean that your old bands might not be compatible with the new watches.</p><p>AppleTrack suggests Apple will put a new S12 chip in the watches with a focus on speed and battery life, though exactly how fast and how much better was not revealed.</p><p>Both watches should get new health and fitness features. We already know that <a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year#section-watchos-27-new-health-and-fitness-features">watchOS 27</a> will bring new AI features, an updated Workout Buddy and more useful data tracking. Plus, it should feature better integration with the upgraded Siri AI, which we've already seen in 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 beta</a>.</p><h3 class="article-body__section" id="section-apple-tv-4k"><span>Apple TV 4K</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="35tUhk2U4oNYnKewrYtsxJ" name="apple tv vpn.jpg" alt="Apple TV" src="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1920-80.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: Lebedev Yury/Shutterstock)</span></figcaption></figure><p>Apple hasn't released a new version of the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a> since 2022. We're long overdue for an upgrade — even if it's only a more powerful chip for stronger performance. </p><p>Like everything else this year, don't expect new designs. It should look similar to older editions. Rumors have repeatedly suggested that the streaming box will feature the <a href="https://www.tomsguide.com/entertainment/streaming-devices/new-apple-tv-4k-biggest-upgrades-just-leaked-ahead-of-launch">A17 Pro chip</a> — the same as in the <a href="https://www.tomsguide.com/news/a17-pro">iPhone 15 Pro models</a>. It should also get the in-house N1 chip for better Wi-Fi and Bluetooth connectivity.</p><p>Outside of chips, the big upgrade would be Siri AI, which could let you connect the Apple TV as a hub for smart devices. One rumor suggested that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps:/www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera,</a> which would allow for FaceTime calls and gesture-based controls.</p><p>AppleTrack suggests that the new Apple TV will be expensive, possibly costlier than the current edition, which is currently <a href="https://www.tomsguide.com/entertainment/apple-tv/apples-price-hikes-finally-made-me-pick-up-the-apple-tv-4k-ive-been-eyeing-for-weeks-and-you-can-still-grab-one-at-the-old-price">priced at $199 and $179 following price hikes</a> this summer.</p><h2 class="article-body__section" id="section-smart-home"><span>Smart Home</span></h2><p>Since Apple Intelligence was introduced in 2024, rumors and leaks have hinted at Apple's ambitious plans to create a suite of smart home devices, and it all starts with revamped HomePods. The <a href="https://www.tomsguide.com/home/smart-home/apple-smart-home-hub-we-just-got-bad-news-about-the-release-window">problem has been a lack of a viable AI-powered Siri,</a> which will finally come to fruition thanks to iOS 27.  </p><p>If it actually releases and works as pitched, this year could actually be the start of Apple Home. </p><h3 id="homepad-home-hub">HomePad Home hub</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Maj5caC4eG4rJYyquwrf3L" name="HomePod with screen edit" alt="HomePod with display concept render" src="https://cdn.mos.cms.futurecdn.net/Maj5caC4eG4rJYyquwrf3L-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Yanko Design)</span></figcaption></figure><p>The totally redesigned HomePod would likely get a new name, the HomePad, because it's functionally an iPad stapled to a HomePod speaker. </p><p>Several different iterations of this device have been rumored, including one with a <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">$1,000 robot arm</a>. Currently, rumors claim it will launch in two versions: the iPad/speaker and a <a href="https://www.tomsguide.com/home/smart-home/apple-tipped-to-launch-ai-wall-tablet-to-control-your-home-in-march-2025-everything-we-know-so-far">wall-mounted touchpad</a> similar to the Google Nest Hub or Amazon's Echo Show 8. </p><p>The system would run a new HomeOS, based on watchOS. It could have a FaceTime camera for video calls and presence sensors to initiate smart home routines. The camera might enable face recognition that would display personalized displays based on the user.</p><p>For more check out our <a href="https://www.tomsguide.com/home/smart-home/apple-homepad-rumored-release-date-price-and-all-the-latest-leaks">HomePad rumor roundup</a>.</p><h3 id="homepod-mini-2-2">HomePod mini 2</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hwxPhQRyonEzSsGSe5nfRN" name="HomePod mini Apple.jpg" alt="Apple HomePod mini" src="https://cdn.mos.cms.futurecdn.net/hwxPhQRyonEzSsGSe5nfRN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass/Voice)</span></figcaption></figure><p>Bloomberg's Mark Gurman, long a reporter of the rumored HomePod updates, <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">believes </a>that a new <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod mini</a> could launch this September alongside the rumored HomePod Home hub.</p><p>A <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">new HomePod mini</a> might debut, but it probably won't be as big of an upgrade as the Hub. Most rumors suggest that it will feature a new chip and audio improvements. The current version debuted in 2020, and like the Apple TV 4K, is long overdue for an update.</p><p>Like the HomePad, it will use Siri AI to run smart home routines, though only through voice commands.</p><h2 class="article-body__section" id="section-apple-s-future-products"><span>Apple's future products </span></h2><p>While the Surprise and Shine event will take the headlines next week, Gurman's <a href="https://www.bloomberg.com/news/newsletters/2026-09-06/apple-s-new-ceo-like-cook-pay-package-shows-he-s-going-nowhere-sept-9-event-mtpvpcj1" target="_blank">report</a> reveals a total of 41 devices that Apple could launch over the next three years. </p><p>This includes everything from an OLED iPad mini and M6 Macs to a MacBook Neo refresh and the<a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-rumors-5-biggest-expected-upgrades"> iPhone Air 2</a>. There is even speculation on devices that could launch in 2028 and beyond. We'll get into all that elsewhere but for now, here's what should round out the year.</p><h2 id="other-apple-devices-slated-for-2026">Other Apple devices slated for 2026</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NEFHMiWXieMCYDucFj4vq8" name="iPad mini 7.jpg" alt="iPad mini 7" src="https://cdn.mos.cms.futurecdn.net/NEFHMiWXieMCYDucFj4vq8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Outside of new M6 chips, the big updates on this list are all about adding OLED to Apple's Mac lineup. If Apple sticks with its usual schedule, these will launch around October, maybe early November at the latest.</p><ul><li><strong>iPad mini with OLED screen: </strong>Outside of chips, the iPad mini has retained the same design since 2021. <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">An OLED display</a> would be one of the biggest updates in years. It should making gaming, watching media and general tasks more enjoyable. Though with everything getting more expensive don't expect the same $599 price tag.</li><li><strong>M6 iMac refresh: </strong>We've already seen the M6 chipset in action with the <a href="https://www.tomsguide.com/computing/apple-desktops/apple-is-turbocharging-the-mac-mini-with-its-new-m6-chip-but-the-model-with-an-m5-pro-is-actually-faster">announced M6 Mac mini</a>, which proved efficient. The iMac should get a similar update this fall.</li><li><strong>M6 14-inch MacBook Pro refresh: </strong>Like the iMac, we're only expecting a chip update from the M5 to the M6, but it should prove powerful.</li><li><strong>First MacBooks with touch display and OLED: </strong>Like the iPad mini, MacBooks might finally get a touch display and OLED panel this year. However, it will likely feature the M5 Pro and M5 Max processors, not the M6. Additionally, it might get a new name, <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>, and a higher price tag.</li></ul><p>Will you be tuning in to Apple's event? Let me know which device you're most hyped for in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-exclusive-gurman-on-price-release-date-and-secret-weapon-versus-android">iPhone Ultra exclusive: Gurman on price, release date rumors and 'day one' weapon against Android</a></li><li><a href="https://www.tomsguide.com/computing/mobile-apps/mapquest-is-suddenly-no-4-in-the-apple-app-store-heres-why">'We're not changing it': MapQuest hits No. 1 in App Store after refusing to rename Lake Ontario to Lake America</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-18-pro-max-unboxed-ahead-of-apple-event-these-could-be-the-final-designs">iPhone Ultra and 18 Pro Max unboxed ahead of Apple event — these could be the final designs</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/apple-september-event-preview-all-the-new-products-to-expect-at-iphone-18-pro-launch-and-beyond</link>
                                                                            <description>
                            <![CDATA[ With Apple's "Surprise and Shine" event days away, here's everything we expect to see on September 9. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Ddtg5wKafnD6K8rqUNzdNR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4Qqq6ok3k7yMqGWwkBhFdR-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 05 Sep 2026 04:45:00 +0000</pubDate>                                                                                                                                <updated>Mon, 07 Sep 2026 23:35:08 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Airpods]]></category>
                                                    <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></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-320-70.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;br&gt;Send secure tips on Signal: scyo1.55.&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/4Qqq6ok3k7yMqGWwkBhFdR-1920-80.jpg">
                                                            <media:credit><![CDATA[Unbox Therapy, Apple Track, Apple, edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 18 Pro, iPhone Ultra, Apple Watch]]></media:description>                                                            <media:text><![CDATA[iPhone 18 Pro, iPhone Ultra, Apple Watch]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 18 Pro, iPhone Ultra, Apple Watch]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4Qqq6ok3k7yMqGWwkBhFdR-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">APPLE EVENT LATEST NEWS AND RUMORS</div><div class="fancy_box_body"><p class="fancy-box__body-text"><em><strong>Updated September 7</strong></em></p><p class="fancy-box__body-text">• This is why the A20 Pro cvhip will be such a big deal for iPhone Ultra and 18 Pro<br />•  Here's what you need to know about the new <a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/smart-home/apple-homepad-rumored-release-date-price-and-all-the-latest-leaks">Apple HomePad</a><br />• The <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/iphone-ultra-price-rumors-heres-how-much-you-can-expect-to-pay-for-apples-first-foldable">iPhone Ultra price</a> could be even higher than you expect<br />• Our i<a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/iphone-ultra-exclusive-gurman-on-price-release-date-and-secret-weapon-versus-android">Phone Ultra preview interview</a> has all the details you need to know<br />• <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">"Surprise and shine"</a> event officially set for Wednesday, September 9</p></div></div><p>Apple's huge "Surprise and Shine" is just days away and the first major event under the leadership of incoming CEO John Ternus' promises to be a big one. And now we have a fairly clear picture of what the company should announce.</p><p>Bloomberg's Mark Gurman has dropped a <a href="https://www.bloomberg.com/news/newsletters/2026-09-06/apple-s-new-ceo-like-cook-pay-package-shows-he-s-going-nowhere-sept-9-event-mtpvpcj1" target="_blank">massive report</a> that outlines everything Apple should release over the next year. And we expect 9 of those new devices to come at the Apple September event, including Apple's first foldable phone in the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a>.</p><p>We've got a full breakdown of the devices likely headed your way, from the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">iPhone 18 Pr</a>o series and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-12-and-ultra-4-rumors-your-next-apple-watch-could-have-a-ceramic-case">Apple Watch 12</a> to a new HomePad.</p><h3 class="article-body__section" id="section-when-is-the-apple-event"><span>When is the Apple event?</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:2066px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="fnjPCS2zVb2TZ4GCnuqwK5" name="Apple suprise and shine" alt="Apple fall event 2026." src="https://cdn.mos.cms.futurecdn.net/fnjPCS2zVb2TZ4GCnuqwK5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2066" height="1162" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has slated its "Surprise and shine" event for <strong>Wednesday, September 9 at Apple Park</strong>. Typically, Apple would hold its event on a Tuesday, but this year it's coming right after Labor Day, meaning it's being pushed to Wednesday.</p><p>This has happened before and Apple's reasoning has been that the company doesn't want to ask attendees to travel on the holiday weekend. As an example, the <a href="https://www.tomsguide.com/reviews/iphone-14">iPhone 14</a> launched on Wednesday, September 7, following Labor Day on Monday 5.</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/rQHEN3kngZo" allowfullscreen=""></iframe></div></div><p>The <strong>event is set to take place at 10am PT / 1pm ET / 6pm BST</strong> and will be livestreamed on various social media platforms as well as Apple's own site.</p><p>iPhones generally go up for pre-order the Friday following the Apple event, but this year that's September 11. Gurman has reported that pre-orders will be <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-iphone-18-pro-pre-order-date-just-tipped-heres-when-you-can-get-yours">pushed to Saturday, September 12</a>.</p><p>New CEO John Ternus is expected to host the monster event, and his tenure appears ready to start with a bang.</p><h2 class="article-body__section" id="section-iphone-18-pro-and-pro-max"><span>iPhone 18 Pro and Pro Max</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:2490px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="bc3v2xma2LGpb9mYSNpejc" name="iphone 18 pro render in dark cherry" alt="iphone 18 pro in dark cherry color from macworld" src="https://cdn.mos.cms.futurecdn.net/bc3v2xma2LGpb9mYSNpejc-1920-80.png" mos="" align="middle" fullscreen="" width="2490" height="1401" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Macworld)</span></figcaption></figure><p>This year, we believe that Apple will only launch the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> models. The entry-level iPhone 18 and iPhone 18 Plus reportedly <a href="https://www.tomsguide.com/phones/iphones/iphone-18-release-schedule-could-be-changing-but-this-rumor-makes-no-sense">won't debut until next spring</a> alongside the iPhone 18e.</p><p>The design of the Pro models should look similar to last year's iPhone 17 Pro models. However, the Dynamic Island should be smaller, with a 24MP selfie camera. <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-camera-upgrades-everything-we-know-about-the-new-sensor">Rumors suggest the Pro Max</a> model will also gain exclusive access new <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-be-the-first-iphone-to-get-a-variable-aperture-why-that-matters">variable aperture lens</a> and might also have a longer 6x zoom.</p><p>Both models should feature Apple's new 2nm <a href="https://www.tomsguide.com/phones/iphones/apple-a20-pro-chip-why-its-such-a-big-deal-for-the-iphone-ultra-and-iphone-18-pro-max">A20 Pro chip</a> and a new C2 modem. A <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-iphone-18-pro-a20-chip-leak-reveals-the-biggest-gpu-ever-inside-an-iphone">recent leak suggests</a> the A20 Pro could feature the largest ever GPU inside an iPhone, meaning better, more efficient performance. Speaking of performance, the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-battery-rumors-it-could-be-a-record-breaking-year-for-apple">latest rumors</a> suggest the iPhone 18 Pro Max could pack a new battery somewhere between 5,391 mAh and 5,567 mAh, and if Apple pushes the silicon's efficiency performance closer to 30%, it could last over 23 hours on a single charge. </p><p>For more, see our <a href="https://www.tomsguide.com/phones/iphones/3-big-reasons-to-buy-iphone-18-pro-max-over-the-iphone-18-pro-this-year">iPhone 18 Pro vs iPhone 18 Pro Max</a> comparison.</p><p>Unfortunately, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-see-absolutely-massive-price-hike-according-to-researchers">analysts have predicted</a> that the new iPhone 18 Pro models could cost between $200 and $250 more than the iPhone 17 Pro family. Here's hoping you have that extra money saved to cover the difference.</p><h3 class="article-body__section" id="section-iphone-ultra"><span>iPhone Ultra</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g5Ndi778wD3dSpn6XzB5te" name="iPhone Ultra Back AppleTrack-2" alt="iPhone Ultra render shown in hand" src="https://cdn.mos.cms.futurecdn.net/g5Ndi778wD3dSpn6XzB5te-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AppleTrack)</span></figcaption></figure><p>The biggest announcement of the Apple event is sure to be the debut of the foldable iPhone Ultra.</p><p>An <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-18-pro-max-unboxed-ahead-of-apple-event-these-could-be-the-final-designs">unboxing video</a> from this week revealed a squat passport shape similar to the new <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, with a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-specs-potentially-revealed-heres-how-it-would-stack-up-against-samsung-galaxy-z-fold-8">7.8-inch foldable display and a 5.5-inch cover screen</a>. Apple has allegedly made a crease-free display, one of the hangs up that stopped the company from making a foldable until now.</p><p>The Ultra could measure between 4.5 and 4.8mm when unfolded, making it one of the thinnest iPhones ever.</p><p>Inside, the Ultra would also feature the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-a20-pro-chip-apples-first-2nm-processor-to-power-new-foldable-phone">A20 Pro chipset</a> and Apple's in-house C2 modem, plus a Touch ID fingerprint scanner in the power button — in lieu of Face ID. It's supposed to feature a fairly larger 4,883 mAh battery.</p><p>The rear panel should house two 48MP cameras horizontally positioned (wide and ultrawide) and two separate 24MP selfie cameras — one for the cover display and one for the interior screen. </p><p>Apple reportedly delayed releasing a folding iPhone until it could eliminate the crease in the display, but whether it's accomplished this remains to be seen. Even Samsung and Oppo, despite their long lead time, have only <a href="https://www.tomsguide.com/phones/samsung-phones/comparing-galaxy-z-fold-8-vs-oppo-find-n6-crease">had moderate success</a>.</p><p>One downside is that the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-price-rumors-heres-how-much-you-can-expect-to-pay-for-apples-first-foldable">iPhone Ultra price</a> could be very expensive, costing anywhere from $2,000 to 2,500. And a recent leak suggests that<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-leakers-reveal-new-details-around-release-and-extremely-limited-availability"> iPhone Ultra may not be immediately available, </a>with only "extremely limited" availability.</p><p>Just keep in mind that the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-trade-offs-the-biggest-things-youre-not-getting-versus-iphone-18-pro">iPhone Ultra could have a number of trade-offs</a> versus the iPhone 18 Pro, including the lack of a telephoto zoom.</p><h2 class="article-body__section" id="section-airpods-5"><span>AirPods 5</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2ZeAyG6YEDw3Uu4QoJaXYA" name="Airpods 4.jpg" alt="Airpods 4" src="https://cdn.mos.cms.futurecdn.net/2ZeAyG6YEDw3Uu4QoJaXYA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The rumor mill has been excitedly leaking information about the AirPods Ultra, which could <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-with-cameras-are-nearly-ready-heres-4-features-you-need-to-know">feature a camera</a> that will feed into Siri to allow it to "see" the world. But according to a <a href="https://www.tomsguide.com/audio/airpods/gurman-ai-airpods-with-cameras-just-tipped-for-2027-launch-in-flurry-of-new-releases">Mark Gurman report</a>, we aren't expecting the <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-everything-we-know-so-far-about-apples-camera-earbuds">AirPods Ultra</a> until 2027 at the earliest. </p><p>Instead, we should get a slightly upgraded pair of AirPods 5. AppleTrack claims the design will be similar to the current AirPods 4. </p><p>Only two real upgrades have been suggested, including a better chip, volume control on the buds and a heart sensor similar to the Pro models. From a software side, the new AirPods 5 will likely take advantage of the more <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">powerful Siri AI </a>releasing this fall, though what features it gets remains to be seen.</p><h2 class="article-body__section" id="section-apple-watch-12-and-apple-watch-ultra-4"><span>Apple Watch 12 and Apple Watch Ultra 4</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:589px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="fYpaDpUGy9ie37wUcNrzwZ" name="Apple Watch Ultra 3" alt="Apple Watch Ultra 3" src="https://cdn.mos.cms.futurecdn.net/fYpaDpUGy9ie37wUcNrzwZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="589" height="331" 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>Similar to the AirPods, the leakers have been fairly quiet about the next Apple Watches. We are expecting to see the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch Series 12</a> and the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-these-are-the-upgrades-apple-needs-to-make-to-remain-the-smartwatch-king">Apple Watch Ultra 4</a>.</p><p>The designs shouldn't change too much, though Apple might  <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">offer a ceramic case </a><a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">option </a>for the new watches. The biggest change might be a <a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">new kind of band attachment</a>. This does mean that your old bands might not be compatible with the new watches.</p><p>AppleTrack suggests Apple will put a new S12 chip in the watches with a focus on speed and battery life, though exactly how fast and how much better was not revealed.</p><p>Both watches should get new health and fitness features. We already know that <a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year#section-watchos-27-new-health-and-fitness-features">watchOS 27</a> will bring new AI features, an updated Workout Buddy and more useful data tracking. Plus, it should feature better integration with the upgraded Siri AI, which we've already seen in 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 beta</a>.</p><h3 class="article-body__section" id="section-apple-tv-4k"><span>Apple TV 4K</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="35tUhk2U4oNYnKewrYtsxJ" name="apple tv vpn.jpg" alt="Apple TV" src="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1920-80.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: Lebedev Yury/Shutterstock)</span></figcaption></figure><p>Apple hasn't released a new version of the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a> since 2022. We're long overdue for an upgrade — even if it's only a more powerful chip for stronger performance. </p><p>Like everything else this year, don't expect new designs. It should look similar to older editions. Rumors have repeatedly suggested that the streaming box will feature the <a href="https://www.tomsguide.com/entertainment/streaming-devices/new-apple-tv-4k-biggest-upgrades-just-leaked-ahead-of-launch">A17 Pro chip</a> — the same as in the <a href="https://www.tomsguide.com/news/a17-pro">iPhone 15 Pro models</a>. It should also get the in-house N1 chip for better Wi-Fi and Bluetooth connectivity.</p><p>Outside of chips, the big upgrade would be Siri AI, which could let you connect the Apple TV as a hub for smart devices. One rumor suggested that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps:/www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera,</a> which would allow for FaceTime calls and gesture-based controls.</p><p>AppleTrack suggests that the new Apple TV will be expensive, possibly costlier than the current edition, which is currently <a href="https://www.tomsguide.com/entertainment/apple-tv/apples-price-hikes-finally-made-me-pick-up-the-apple-tv-4k-ive-been-eyeing-for-weeks-and-you-can-still-grab-one-at-the-old-price">priced at $199 and $179 following price hikes</a> this summer.</p><h2 class="article-body__section" id="section-smart-home"><span>Smart Home</span></h2><p>Since Apple Intelligence was introduced in 2024, rumors and leaks have hinted at Apple's ambitious plans to create a suite of smart home devices, and it all starts with revamped HomePods. The <a href="https://www.tomsguide.com/home/smart-home/apple-smart-home-hub-we-just-got-bad-news-about-the-release-window">problem has been a lack of a viable AI-powered Siri,</a> which will finally come to fruition thanks to iOS 27.  </p><p>If it actually releases and works as pitched, this year could actually be the start of Apple Home. </p><h3 id="homepad-home-hub">HomePad Home hub</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Maj5caC4eG4rJYyquwrf3L" name="HomePod with screen edit" alt="HomePod with display concept render" src="https://cdn.mos.cms.futurecdn.net/Maj5caC4eG4rJYyquwrf3L-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Yanko Design)</span></figcaption></figure><p>The totally redesigned HomePod would likely get a new name, the HomePad, because it's functionally an iPad stapled to a HomePod speaker. </p><p>Several different iterations of this device have been rumored, including one with a <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">$1,000 robot arm</a>. Currently, rumors claim it will launch in two versions: the iPad/speaker and a <a href="https://www.tomsguide.com/home/smart-home/apple-tipped-to-launch-ai-wall-tablet-to-control-your-home-in-march-2025-everything-we-know-so-far">wall-mounted touchpad</a> similar to the Google Nest Hub or Amazon's Echo Show 8. </p><p>The system would run a new HomeOS, based on watchOS. It could have a FaceTime camera for video calls and presence sensors to initiate smart home routines. The camera might enable face recognition that would display personalized displays based on the user.</p><p>For more check out our <a href="https://www.tomsguide.com/home/smart-home/apple-homepad-rumored-release-date-price-and-all-the-latest-leaks">HomePad rumor roundup</a>.</p><h3 id="homepod-mini-2-2">HomePod mini 2</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hwxPhQRyonEzSsGSe5nfRN" name="HomePod mini Apple.jpg" alt="Apple HomePod mini" src="https://cdn.mos.cms.futurecdn.net/hwxPhQRyonEzSsGSe5nfRN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass/Voice)</span></figcaption></figure><p>Bloomberg's Mark Gurman, long a reporter of the rumored HomePod updates, <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">believes </a>that a new <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod mini</a> could launch this September alongside the rumored HomePod Home hub.</p><p>A <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">new HomePod mini</a> might debut, but it probably won't be as big of an upgrade as the Hub. Most rumors suggest that it will feature a new chip and audio improvements. The current version debuted in 2020, and like the Apple TV 4K, is long overdue for an update.</p><p>Like the HomePad, it will use Siri AI to run smart home routines, though only through voice commands.</p><h2 class="article-body__section" id="section-apple-s-future-products"><span>Apple's future products </span></h2><p>While the Surprise and Shine event will take the headlines next week, Gurman's <a href="https://www.bloomberg.com/news/newsletters/2026-09-06/apple-s-new-ceo-like-cook-pay-package-shows-he-s-going-nowhere-sept-9-event-mtpvpcj1" target="_blank">report</a> reveals a total of 41 devices that Apple could launch over the next three years. </p><p>This includes everything from an OLED iPad mini and M6 Macs to a MacBook Neo refresh and the<a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-rumors-5-biggest-expected-upgrades"> iPhone Air 2</a>. There is even speculation on devices that could launch in 2028 and beyond. We'll get into all that elsewhere but for now, here's what should round out the year.</p><h2 id="other-apple-devices-slated-for-2026">Other Apple devices slated for 2026</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NEFHMiWXieMCYDucFj4vq8" name="iPad mini 7.jpg" alt="iPad mini 7" src="https://cdn.mos.cms.futurecdn.net/NEFHMiWXieMCYDucFj4vq8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Outside of new M6 chips, the big updates on this list are all about adding OLED to Apple's Mac lineup. If Apple sticks with its usual schedule, these will launch around October, maybe early November at the latest.</p><ul><li><strong>iPad mini with OLED screen: </strong>Outside of chips, the iPad mini has retained the same design since 2021. <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">An OLED display</a> would be one of the biggest updates in years. It should making gaming, watching media and general tasks more enjoyable. Though with everything getting more expensive don't expect the same $599 price tag.</li><li><strong>M6 iMac refresh: </strong>We've already seen the M6 chipset in action with the <a href="https://www.tomsguide.com/computing/apple-desktops/apple-is-turbocharging-the-mac-mini-with-its-new-m6-chip-but-the-model-with-an-m5-pro-is-actually-faster">announced M6 Mac mini</a>, which proved efficient. The iMac should get a similar update this fall.</li><li><strong>M6 14-inch MacBook Pro refresh: </strong>Like the iMac, we're only expecting a chip update from the M5 to the M6, but it should prove powerful.</li><li><strong>First MacBooks with touch display and OLED: </strong>Like the iPad mini, MacBooks might finally get a touch display and OLED panel this year. However, it will likely feature the M5 Pro and M5 Max processors, not the M6. Additionally, it might get a new name, <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>, and a higher price tag.</li></ul><p>Will you be tuning in to Apple's event? Let me know which device you're most hyped for in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-exclusive-gurman-on-price-release-date-and-secret-weapon-versus-android">iPhone Ultra exclusive: Gurman on price, release date rumors and 'day one' weapon against Android</a></li><li><a href="https://www.tomsguide.com/computing/mobile-apps/mapquest-is-suddenly-no-4-in-the-apple-app-store-heres-why">'We're not changing it': MapQuest hits No. 1 in App Store after refusing to rename Lake Ontario to Lake America</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-18-pro-max-unboxed-ahead-of-apple-event-these-could-be-the-final-designs">iPhone Ultra and 18 Pro Max unboxed ahead of Apple event — these could be the final designs</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 best new movies to stream this weekend on Netflix, Disney+, Apple TV, and more (September 5-6) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>A new month means there's no shortage of things to watch across <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a>, but narrowing down which movies are worth your time can quickly become a headache. That's why I'm here every weekend, highlighting the best new movies on streaming so you don't waste your precious down time scrolling. </p><p>Leading the pack this week is Ryan Reynolds and Kenneth Branagh in an '80s-style spy caper called <strong>"Mayday"</strong> on Apple TV. You can get your dose of baby Yoda in <strong>"Star Wars: the Mandalorian and Grogu"</strong> now that it's finally on Disney+. Or, for a silly LEGO-fied version of the show's familiar beats, look no further than <strong>"LEGO Star Wars: The Mandalorian." </strong>Over on HBO Max, millennials will love <strong>"The Robot Chicken Adult Swim Special"</strong> for a nostalgia flashbang that brings back your favorite characters from the last 25 years of Adult Swim. Meanwhile, Netflix just got some new nightmare fuel in the form of <strong>"Smile 2," </strong>a surprisingly competent sequel.</p><p>So without further ado, let's dive into the best new movies to watch this weekend on streaming. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X851me"></div>                            </div>                            <script src="https://kwizly.com/embed/X851me.js" async=""></script><h2 id="39-mayday-39-apple-tv">'Mayday' (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/om5Un9X720M" allowfullscreen=""></iframe></div></div><p><u><em>The vibe</em></u><em>:</em> A cross between an '80s action movie and buddy comedy back in the U.S.S.R</p><p><u><em>Why you should watch it</em></u><em>:</em> "Mayday" is <strong>a solid spy caper that cashes in on nostalgia for glossy '80s action flicks</strong>. Set in 1987, it stars <strong>Ryan Reynolds</strong> as a<strong> hotshot U.S. Navy pilot</strong> whose flying high since the blockbuster success of "Top Gun." That is, until he gets shot down and stranded in the Russian wilderness during a top-secret Cold War mission over Soviet territory. To have any hope of getting home in one piece, he has to team up with <strong>Kenneth Branagh's gruff ex-KGB agent with a soft spot for American culture</strong>.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/mayday/umc.cmc.shin43vzfoz3h4ggx41z8rf" target="_blank" rel="nofollow"><em><strong>"Mayday" on Apple TV+</strong></em></a><em><strong> now</strong></em></p><h2 id="39-star-wars-the-mandalorian-and-grogu-39-disney">'Star Wars: The Mandalorian and Grogu' (Disney+)</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><u><em>The vibe</em></u>: More shenanigans with the galaxy's dreamiest bounty hunter and his pint-sized companion</p><p><u><em>Why you should watch it</em></u>: If you ask me, this is where "The Mandalorian and Grogu" should have premiered instead of in theaters. It feels like<strong> </strong>a mini "Mandalorian" marathon retrofitted to the big screen, which might explain why it was the lowest-grossing Star Wars movie in history. Din Djarin (Pedro Pascal) and Grogu <strong>take on a mission for the New Republic to rescue Rotta the Hutt (voiced by "The Bear's" Jeremy Allen White)</strong>, Jabba's heir, from a rival crime syndicate to dig up some intel on an Imperial warlord. Their assignment spirals into <strong>a galaxy-spanning adventure</strong> filled with all the blaster fights and Force magic you'd expect of a Star Wars outing.</p><p><em><strong>Watch </strong></em><a href="https://www.disneyplus.com/browse/entity-d830ec57-499e-498c-b6b3-2b85a18a5f51" target="_blank" rel="nofollow"><em><strong>"The Mandalorian and Grogu" on Disney+</strong></em></a><em><strong> now</strong></em></p><h2 id="lego-star-wars-the-mandalorian-disney">‘LEGO Star Wars: The Mandalorian’ (Disney+)</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/NEqBkXeEpkk" allowfullscreen=""></iframe></div></div><p><u><em>The vibe</em></u>: Even more Mando and Grogu shenanigans (this time with LEGO!)</p><p><u><em>Why you should watch it</em></u>: The LEGO video game and movie adaptations <em>should </em>be blatant cash grabs, but the goofy sense of humor and genuine artistry (you can tell the animators had fun!) always manage to steal my heart nonetheless. <strong>This animated special covers the entire three-season saga of "The Mandalorian,"</strong> featuring a returning voice cast that includes Amy Sedaris, Rosario Dawson, Timothy Olyphant and Katee Sackhoff. And of course, <strong>plenty of LEGO Baby Yoda cuteness </strong>to melt your heart. </p><p><em><strong>Watch </strong></em><a href="https://www.disneyplus.com/browse/entity-e1234eda-704c-4729-a47e-e8be088bc61f" target="_blank" rel="nofollow"><em><strong>"LEGO Star Wars: The Mandalorian" on Disney+</strong></em></a><em><strong> now</strong></em></p><h2 id="the-robot-chicken-adult-swim-special-hbo-max">‘The Robot Chicken Adult Swim Special’ (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/QqJbimJ6uuM" allowfullscreen=""></iframe></div></div><p><u><em>The vibe</em></u>: A nostalgia flashbang of Adult Swim's biggest shows (and the ones we all forgot about)</p><p><u><em>Why you should watch it</em></u>: If, like me, you spent your formative years staying up way to late watching <strong>"Adult Swim," this 25th anniversary special</strong> is for you. In the trailer alone, I counted like five shows I haven't thought about in years — and some, like "Assy McGee," that should have stayed forgotten. <strong>Adult Swim's weirdest characters over the years</strong> from shows like "The Venture Bros.," "Smiling Friends," and "Aqua Teen Hunger Force" <strong>all meet up on a cruise</strong> to celebrate the occasion, brought to life through <strong>claymation a la "Robot Chicken." </strong>It all culminates in <strong>a comedic whodunit </strong>that eventually lands in court, and you know Harvey Birdman's prepared to take the case.</p><p><em><strong>Watch </strong></em><a href="https://www.hbomax.com/movie/484c970b-711f-46bb-8b21-1ba4ad45846b" target="_blank" rel="nofollow"><em><strong>"The Robot Chicken Adult Swim Special" on HBO Max</strong></em></a><em><strong> now</strong></em></p><h2 id="39-smile-2-39-netflix">'Smile 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/0HY6QFlBzUY" allowfullscreen=""></iframe></div></div><p><u><em>The vibe</em></u>: A shockingly good sequel to get you into the Halloween spirit (don't worry, you don't need to see the first to follow along)</p><p><u><em>Why you should watch it</em></u>: <strong>Naomi Scott stars as pop star Skye Riley</strong>, who's finally setting out on a world tour after a difficult year. Her comeback's thrown off course when she witnesses a horrifying death and starts to experience increasingly <strong>disturbing encounters with people who seem to be smiling at her.</strong> With her mental health in tatters, she struggles to figure out what's real and what's all in her head. With her tour approaching, Skye seeks help from an emergency-room nurse who seems like the only person who understands what she’s going through — and better yet, might have the key to make it stop. </p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/81978231" target="_blank" rel="nofollow"><em><strong>"Smile 2" on Netflix</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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/prime-video/3-best-new-to-prime-video-movies-to-binge-watch-this-weekend-sept-4-6-including-a-historic-best-picture-winner">3 best new to Prime Video movies to binge-watch this weekend (Sept. 4-6) — including a historic Best Picture winner</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/9-new-movies-and-shows-to-watch-this-weekend-mayday-silo-the-gentlemen-and-more-sept-4-6">9 new movies and shows to watch this weekend — 'Mayday,' 'Silo,' 'The Gentlemen' and more (Sept. 4-6)</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-new-to-netflix-movies-you-should-stream-this-weekend-september-4-6">3 best new to Netflix movies you should stream this weekend (September 4-6)</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/5-best-new-movies-to-stream-this-weekend-on-netflix-disney-apple-tv-and-more-september-5-6</link>
                                                                            <description>
                            <![CDATA[ Looking for what to watch this weekend? 'The Mandalorian and Grogu,' 'Mayday,' a 'Robot Chicken' anniversary special, and more great hits just landed on streaming. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uWnm8mMxPWf6ymCZJDH2QV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MuucqUPbVajzzH737rXC6h-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Sat, 05 Sep 2026 04:15:00 +0000</pubDate>                                                                                                                                <updated>Sat, 05 Sep 2026 13:48:51 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc-320-70.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/png" url="https://cdn.mos.cms.futurecdn.net/MuucqUPbVajzzH737rXC6h-1920-80.png">
                                                            <media:credit><![CDATA[Disney]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(L-R) Pedro Pascal as The Mandalorian, and Grogu, in &quot;The Mandalorian and Grogu&quot; (2026)]]></media:description>                                                            <media:text><![CDATA[(L-R) Pedro Pascal as The Mandalorian, and Grogu, in &quot;The Mandalorian and Grogu&quot; (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[(L-R) Pedro Pascal as The Mandalorian, and Grogu, in &quot;The Mandalorian and Grogu&quot; (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MuucqUPbVajzzH737rXC6h-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A new month means there's no shortage of things to watch across <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a>, but narrowing down which movies are worth your time can quickly become a headache. That's why I'm here every weekend, highlighting the best new movies on streaming so you don't waste your precious down time scrolling. </p><p>Leading the pack this week is Ryan Reynolds and Kenneth Branagh in an '80s-style spy caper called <strong>"Mayday"</strong> on Apple TV. You can get your dose of baby Yoda in <strong>"Star Wars: the Mandalorian and Grogu"</strong> now that it's finally on Disney+. Or, for a silly LEGO-fied version of the show's familiar beats, look no further than <strong>"LEGO Star Wars: The Mandalorian." </strong>Over on HBO Max, millennials will love <strong>"The Robot Chicken Adult Swim Special"</strong> for a nostalgia flashbang that brings back your favorite characters from the last 25 years of Adult Swim. Meanwhile, Netflix just got some new nightmare fuel in the form of <strong>"Smile 2," </strong>a surprisingly competent sequel.</p><p>So without further ado, let's dive into the best new movies to watch this weekend on streaming. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X851me"></div>                            </div>                            <script src="https://kwizly.com/embed/X851me.js" async=""></script><h2 id="39-mayday-39-apple-tv">'Mayday' (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/om5Un9X720M" allowfullscreen=""></iframe></div></div><p><u><em>The vibe</em></u><em>:</em> A cross between an '80s action movie and buddy comedy back in the U.S.S.R</p><p><u><em>Why you should watch it</em></u><em>:</em> "Mayday" is <strong>a solid spy caper that cashes in on nostalgia for glossy '80s action flicks</strong>. Set in 1987, it stars <strong>Ryan Reynolds</strong> as a<strong> hotshot U.S. Navy pilot</strong> whose flying high since the blockbuster success of "Top Gun." That is, until he gets shot down and stranded in the Russian wilderness during a top-secret Cold War mission over Soviet territory. To have any hope of getting home in one piece, he has to team up with <strong>Kenneth Branagh's gruff ex-KGB agent with a soft spot for American culture</strong>.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/mayday/umc.cmc.shin43vzfoz3h4ggx41z8rf" target="_blank" rel="nofollow"><em><strong>"Mayday" on Apple TV+</strong></em></a><em><strong> now</strong></em></p><h2 id="39-star-wars-the-mandalorian-and-grogu-39-disney">'Star Wars: The Mandalorian and Grogu' (Disney+)</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><u><em>The vibe</em></u>: More shenanigans with the galaxy's dreamiest bounty hunter and his pint-sized companion</p><p><u><em>Why you should watch it</em></u>: If you ask me, this is where "The Mandalorian and Grogu" should have premiered instead of in theaters. It feels like<strong> </strong>a mini "Mandalorian" marathon retrofitted to the big screen, which might explain why it was the lowest-grossing Star Wars movie in history. Din Djarin (Pedro Pascal) and Grogu <strong>take on a mission for the New Republic to rescue Rotta the Hutt (voiced by "The Bear's" Jeremy Allen White)</strong>, Jabba's heir, from a rival crime syndicate to dig up some intel on an Imperial warlord. Their assignment spirals into <strong>a galaxy-spanning adventure</strong> filled with all the blaster fights and Force magic you'd expect of a Star Wars outing.</p><p><em><strong>Watch </strong></em><a href="https://www.disneyplus.com/browse/entity-d830ec57-499e-498c-b6b3-2b85a18a5f51" target="_blank" rel="nofollow"><em><strong>"The Mandalorian and Grogu" on Disney+</strong></em></a><em><strong> now</strong></em></p><h2 id="lego-star-wars-the-mandalorian-disney">‘LEGO Star Wars: The Mandalorian’ (Disney+)</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/NEqBkXeEpkk" allowfullscreen=""></iframe></div></div><p><u><em>The vibe</em></u>: Even more Mando and Grogu shenanigans (this time with LEGO!)</p><p><u><em>Why you should watch it</em></u>: The LEGO video game and movie adaptations <em>should </em>be blatant cash grabs, but the goofy sense of humor and genuine artistry (you can tell the animators had fun!) always manage to steal my heart nonetheless. <strong>This animated special covers the entire three-season saga of "The Mandalorian,"</strong> featuring a returning voice cast that includes Amy Sedaris, Rosario Dawson, Timothy Olyphant and Katee Sackhoff. And of course, <strong>plenty of LEGO Baby Yoda cuteness </strong>to melt your heart. </p><p><em><strong>Watch </strong></em><a href="https://www.disneyplus.com/browse/entity-e1234eda-704c-4729-a47e-e8be088bc61f" target="_blank" rel="nofollow"><em><strong>"LEGO Star Wars: The Mandalorian" on Disney+</strong></em></a><em><strong> now</strong></em></p><h2 id="the-robot-chicken-adult-swim-special-hbo-max">‘The Robot Chicken Adult Swim Special’ (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/QqJbimJ6uuM" allowfullscreen=""></iframe></div></div><p><u><em>The vibe</em></u>: A nostalgia flashbang of Adult Swim's biggest shows (and the ones we all forgot about)</p><p><u><em>Why you should watch it</em></u>: If, like me, you spent your formative years staying up way to late watching <strong>"Adult Swim," this 25th anniversary special</strong> is for you. In the trailer alone, I counted like five shows I haven't thought about in years — and some, like "Assy McGee," that should have stayed forgotten. <strong>Adult Swim's weirdest characters over the years</strong> from shows like "The Venture Bros.," "Smiling Friends," and "Aqua Teen Hunger Force" <strong>all meet up on a cruise</strong> to celebrate the occasion, brought to life through <strong>claymation a la "Robot Chicken." </strong>It all culminates in <strong>a comedic whodunit </strong>that eventually lands in court, and you know Harvey Birdman's prepared to take the case.</p><p><em><strong>Watch </strong></em><a href="https://www.hbomax.com/movie/484c970b-711f-46bb-8b21-1ba4ad45846b" target="_blank" rel="nofollow"><em><strong>"The Robot Chicken Adult Swim Special" on HBO Max</strong></em></a><em><strong> now</strong></em></p><h2 id="39-smile-2-39-netflix">'Smile 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/0HY6QFlBzUY" allowfullscreen=""></iframe></div></div><p><u><em>The vibe</em></u>: A shockingly good sequel to get you into the Halloween spirit (don't worry, you don't need to see the first to follow along)</p><p><u><em>Why you should watch it</em></u>: <strong>Naomi Scott stars as pop star Skye Riley</strong>, who's finally setting out on a world tour after a difficult year. Her comeback's thrown off course when she witnesses a horrifying death and starts to experience increasingly <strong>disturbing encounters with people who seem to be smiling at her.</strong> With her mental health in tatters, she struggles to figure out what's real and what's all in her head. With her tour approaching, Skye seeks help from an emergency-room nurse who seems like the only person who understands what she’s going through — and better yet, might have the key to make it stop. </p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/81978231" target="_blank" rel="nofollow"><em><strong>"Smile 2" on Netflix</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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/prime-video/3-best-new-to-prime-video-movies-to-binge-watch-this-weekend-sept-4-6-including-a-historic-best-picture-winner">3 best new to Prime Video movies to binge-watch this weekend (Sept. 4-6) — including a historic Best Picture winner</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/9-new-movies-and-shows-to-watch-this-weekend-mayday-silo-the-gentlemen-and-more-sept-4-6">9 new movies and shows to watch this weekend — 'Mayday,' 'Silo,' 'The Gentlemen' and more (Sept. 4-6)</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-new-to-netflix-movies-you-should-stream-this-weekend-september-4-6">3 best new to Netflix movies you should stream this weekend (September 4-6)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Huge new Apple report details all 41 products coming under new CEO John Ternus ]]></title>
                                                                                                <dc:content><![CDATA[ <p>John Ternus has finally taken over as CEO of Apple, and his term could kickstart a wave of new and redefined Apple devices. It all starts next week with the <a href="https://www.tomsguide.com/phones/iphones/apple-sept-9-event-all-9-new-products-were-expecting-to-see">"Surprise and Shine" iPhone event</a>.</p><p>However, that's just the beginning, and <a href="https://www.bloomberg.com/news/articles/2026-09-04/what-to-expect-at-sept-9-apple-event-foldable-iphone-iphone-18-pro-watch">Bloomberg's Mark Gurman</a> just released a massive report that highlights 41 devices that could be released in the next three years and beyond. </p><p>That includes new devices like the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a> and Apple's <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">first foray into smart glasses</a>. </p><h2 id="later-2026-and-early-2027">Later 2026 and Early 2027</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:59.60%;"><img id="BXFPFEcaHQrVivQScPBNff" name="iPhone Ultra" alt="iPhone Ultra." src="https://cdn.mos.cms.futurecdn.net/BXFPFEcaHQrVivQScPBNff-1920-80.jpg" mos="" align="middle" fullscreen="" width="1510" height="900" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Most every device meant to launch in the next six months should arrive during one of two events: the September 9 iPhone soiree and an announcement in October or early November. </p><p>Mostly, the difference here is that new MacBooks are usually announced in mid-fall, usually with a new chipset. </p><p>The key devices to be aware of in the next few months include Apple's first foldable<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-latest-release-date-rumors-heres-when-we-expect-it-to-launch" target="_blank"> iPhone</a><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-latest-release-date-rumors-heres-when-we-expect-it-to-launch"> Ultra</a> and the <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> models, all of which are expected to launch next week. There's also the first iPad mini <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">with an OLED </a><a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried" target="_blank">screen </a>and the rumored HomePad with a screen, which should be Apple's next steps into smart home devices.</p><p>There's also the rumored <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>, a high-end version of Apple's Pro laptop with a touch display and OLED panel. Personally, I'm interested in the refreshed  <a href="https://www.tomsguide.com/entertainment/streaming-devices/apple-tv-4k-could-get-its-long-awaited-refresh-this-year-what-we-know-so-far">Apple TV 4K </a> with a faster chip and more Siri features. Though that has been rumored for years now and has yet to actually be released.</p><ul><li><strong>iPhone Ultra</strong></li><li><strong>iPhone 18 Pro and Pro Max</strong></li><li><strong>Apple Watch Series 12 and Ultra 4</strong></li><li><strong>AirPods 5</strong></li><li><strong>Apple TV 4K set-top box</strong></li><li><strong>HomePod mini</strong></li><li><strong>HomePad</strong></li><li><strong>iPad mini with OLED screen</strong></li><li><strong>M6 iMac refresh</strong></li><li><strong>M6 14-inch MacBook Pro refresh</strong></li><li><strong>MacBook Ultra</strong></li></ul><h2 id="in-development-for-2027">In development for 2027</h2><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="tbGfgnwudZZvAWqyL687hg" name="Tim-Cook-Apple-Glasses-LEDE2" alt="Tim Cook with Apple Glass render" src="https://cdn.mos.cms.futurecdn.net/tbGfgnwudZZvAWqyL687hg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Martin Hajek/ iDrop News/ Shutterstock/ Tom’s Guide)</span></figcaption></figure><p>Next year is when we could start seeing some truly updated designs for Apple's products from the all-glass iPhone 20 to redesigned Apple Watches and even more smart home products. </p><p>Some devices will be a simple chip refresh, like the M6 MacBook Air or the <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-could-get-these-two-major-performance-upgrades-in-2027-but-i-want-apple-to-fix-this-instead">A19 Pro MacBook Neo,</a> which proved so popular the first go-round that Apple <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-inventory-has-reportedly-sold-out-what-you-need-to-know">couldn't keep it in stock</a>.</p><p>A slew of iPads, from a refreshed <a href="https://www.tomsguide.com/computing/ipads/ipad-12-just-got-teased-by-an-accessory-maker-and-theres-a-disappointing-bit-of-news">iPad 12</a> to an <a href="https://www.tomsguide.com/computing/ipads/ipad-air-oled-tipped-for-long-overdue-2027-launch-but-at-what-cost">iPad Air OLED</a> are also expected next year.</p><p>iPhones will get weird next year starting in the spring where Apple <a href="https://www.tomsguide.com/phones/iphones/iphone-18-tipped-for-cost-cutting-downgrades-heres-what-we-know">splits the launch </a>of the iPhone 18 series. We should see the<a href="https://www.tomsguide.com/phones/iphone-18-release-just-tipped-for-major-shakeup-heres-when-all-the-new-models-could-launch"> vanilla iPhone 18</a>, alongside the iPhone 18e and<a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-rumors-5-biggest-expected-upgrades"> iPhone Air 2</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1456px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r2pW7STcGyqWJttRcb5SAH" name="iPhone 20 render" alt="iPhone 20 render" src="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1920-80.jpg" mos="" align="middle" fullscreen="" width="1456" height="819" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AppleTrack)</span></figcaption></figure><p>In the back half of the year, the 20th anniversary iPhone could feature one of the largest design changes in years. The biggest is a curvy all-glass wraparound design that seamlessly covers the entire phone. An analyst <a href="https://www.tomsguide.com/phones/iphones/all-glass-iphone-20-reportedly-canceled-20th-anniversary-iphone-hits-major-setback">claimed this design was canceled</a> in August, but Mark Gurman pushed back, saying that it's still on track. There are <a href="https://www.tomsguide.com/phones/iphones/new-iphone-20-video-reveals-the-8-biggest-upgrades-to-expect-from-the-20th-anniversary-iphone">more potential changes, </a>but the glass look will be immediately noticeable.</p><p>We were expecting to see <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-everything-we-know-so-far-about-apples-camera-earbuds">camera-laden AirPods</a> this year after leaked code and videos appeared, but Gurman claims these have been delayed until 2027. The cameras would enable Siri AI to "see" the world around you and respond to queries. People are voicing privacy concerns already, but presumably the cameras would not record photos or video.</p><p>Finally, <a href="https://www.tomsguide.com/computing/vr-ar/lighter-and-cheaper-apple-vision-pro-2-sounds-like-a-headset-youll-actually-buy-but-heres-why-you-shouldnt">Tim Cook was allegedly obsessed</a> with <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">Apple Glasses</a>, but it's not clear if Ternus shares that same excitement. Apple's take on the form should arrive next year and be similar to the Meta Ray-Ban allowing you to take calls, pictures and videos but lacking a display. Rumors had slated the glasses for 2028 but a summer report claimed <a href="https://www.tomsguide.com/computing/smart-glasses/apple-is-rethinking-its-future-product-roadmap-after-losing-smart-glasses-chief-to-openai-analysts-say">Apple was rethinking its roadmap</a> after Vision head Paul Meade left for OpenAI.</p><ul><li><strong>M6 MacBook Air</strong></li><li><strong>A19 Pro MacBook Neo</strong></li><li><strong>Entry-level iPad refresh</strong></li><li><strong>iPad Air OLED</strong></li><li><strong>iPad Pro</strong></li><li><strong>New Apple Pencils</strong>.</li><li><strong>iPhone 18 and 18e</strong></li><li><strong>iPhone Air 2</strong></li><li><strong>M7 14-inch MacBook Pro</strong></li><li><strong>AirPods with cameras</strong></li><li><strong>In-home security sensor and system</strong>.</li><li><strong>Apple Glasses</strong></li><li><strong>iPhone 20 (XX)</strong></li><li><strong>iPhone Ultra 2</strong></li><li><strong>Redesigned Apple Watches</strong></li><li><strong>M7 Pro and M7 Max MacBooks</strong></li></ul><h2 id="2028-2029-and-beyond">2028, 2029 and beyond</h2><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="h6GpFcSGTZ9Rtx4HpLMVE7" name="apple-campus.jpeg" alt="Apple Event" src="https://cdn.mos.cms.futurecdn.net/h6GpFcSGTZ9Rtx4HpLMVE7-1920-80.jpeg" 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: Apple)</span></figcaption></figure><p>The next batch of potential Apple devices could be released any time between 2028 and 2030. Some are chip and OLED updates, but a couple are new devices that we haven't seen from Apple before.</p><p>The <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">HomePod on a robot arm</a> was rumored two years ago and apparently will actually debut in the next couple of years. Per Gurman, this version will have a 9-inch display and advanced AI features. </p><p>Before the rumor mill settled on the foldable iPhone, Apple's first foldable device was actually supposed to be a  <a href="https://www.tomsguide.com/tablets/ipads/apple-reportedly-has-an-18-8-inch-foldable-ipad-prototype-with-under-display-face-id">giant foldable 18-inch iPad</a> or MacBook. Apparently, this is still in the works and <a href="https://www.tomsguide.com/computing/ipads/apples-giant-foldable-ipad-likely-wont-launch-until-2028-what-weve-heard">could launch in 2028</a>. Gurman claims manufacturing issues pushed a potential launch back.</p><p>Apple allegedly wants to release its own AR glasses à la the <a href="https://www.tomsguide.com/computing/smart-glasses/ive-been-wearing-the-meta-ray-ban-display-smart-glasses-for-24-hours-heres-what-i-like-and-hate">Meta Ray-Ban Display</a>. The glasses would superimpose data on your real-world view. There's no specific release year for these, but they could arrive before 2030.</p><p>Apple is apparently working on an AI pendant as well. <a href="https://www.tomsguide.com/computing/apples-ai-wearable-roadmap-is-getting-wild-prepare-for-ai-pendant-smart-glasses-and-airpods-with-cameras">The Apple version </a>would work with your iPhone and use AI and the camera for tasks.</p><ul><li><strong>HomePad with a robot arm</strong></li><li><strong>M7 Max and M7 Ultra Mac Studio</strong></li><li><strong>Apple Vision Pro revamp</strong></li><li><strong>AI Pendant</strong></li><li><strong>Larger foldable iPhone</strong></li><li><strong>Foldable iPad  </strong></li><li><strong>MacBook Air OLED</strong></li><li><strong>Higher-end iMac OLED</strong></li><li><strong>Augmented reality glasses</strong></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/home/smart-home/apple-homepad-rumored-release-date-price-and-all-the-latest-leaks">Apple HomePad rumored release date, price and all the latest leaks</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-price-rumors-heres-how-much-you-can-expect-to-pay-for-apples-first-foldable">iPhone Ultra price rumors — here's how much you can expect to pay for Apple’s first foldable</a></li><li><a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/macbooks/huge-new-apple-report-details-all-41-products-coming-under-new-ceo-john-ternus</link>
                                                                            <description>
                            <![CDATA[ A massive report reveals about 41 devices that Apple could launch in the next three years. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">b6F32CnPvCcV3mLyRLeoJV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TrT3r6fXvJDENQATkwjnxN-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 19:32:30 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 22:28:53 +0000</updated>
                                                                                                                                            <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Smart Home]]></category>
                                                    <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[VR & AR]]></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-320-70.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;br&gt;Send secure tips on Signal: scyo1.55.&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/TrT3r6fXvJDENQATkwjnxN-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[John Ternus in front of the Apple logo]]></media:description>                                                            <media:text><![CDATA[John Ternus in front of the Apple logo]]></media:text>
                                <media:title type="plain"><![CDATA[John Ternus in front of the Apple logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TrT3r6fXvJDENQATkwjnxN-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>John Ternus has finally taken over as CEO of Apple, and his term could kickstart a wave of new and redefined Apple devices. It all starts next week with the <a href="https://www.tomsguide.com/phones/iphones/apple-sept-9-event-all-9-new-products-were-expecting-to-see">"Surprise and Shine" iPhone event</a>.</p><p>However, that's just the beginning, and <a href="https://www.bloomberg.com/news/articles/2026-09-04/what-to-expect-at-sept-9-apple-event-foldable-iphone-iphone-18-pro-watch">Bloomberg's Mark Gurman</a> just released a massive report that highlights 41 devices that could be released in the next three years and beyond. </p><p>That includes new devices like the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a> and Apple's <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">first foray into smart glasses</a>. </p><h2 id="later-2026-and-early-2027">Later 2026 and Early 2027</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:59.60%;"><img id="BXFPFEcaHQrVivQScPBNff" name="iPhone Ultra" alt="iPhone Ultra." src="https://cdn.mos.cms.futurecdn.net/BXFPFEcaHQrVivQScPBNff-1920-80.jpg" mos="" align="middle" fullscreen="" width="1510" height="900" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Most every device meant to launch in the next six months should arrive during one of two events: the September 9 iPhone soiree and an announcement in October or early November. </p><p>Mostly, the difference here is that new MacBooks are usually announced in mid-fall, usually with a new chipset. </p><p>The key devices to be aware of in the next few months include Apple's first foldable<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-latest-release-date-rumors-heres-when-we-expect-it-to-launch" target="_blank"> iPhone</a><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-latest-release-date-rumors-heres-when-we-expect-it-to-launch"> Ultra</a> and the <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> models, all of which are expected to launch next week. There's also the first iPad mini <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">with an OLED </a><a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried" target="_blank">screen </a>and the rumored HomePad with a screen, which should be Apple's next steps into smart home devices.</p><p>There's also the rumored <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>, a high-end version of Apple's Pro laptop with a touch display and OLED panel. Personally, I'm interested in the refreshed  <a href="https://www.tomsguide.com/entertainment/streaming-devices/apple-tv-4k-could-get-its-long-awaited-refresh-this-year-what-we-know-so-far">Apple TV 4K </a> with a faster chip and more Siri features. Though that has been rumored for years now and has yet to actually be released.</p><ul><li><strong>iPhone Ultra</strong></li><li><strong>iPhone 18 Pro and Pro Max</strong></li><li><strong>Apple Watch Series 12 and Ultra 4</strong></li><li><strong>AirPods 5</strong></li><li><strong>Apple TV 4K set-top box</strong></li><li><strong>HomePod mini</strong></li><li><strong>HomePad</strong></li><li><strong>iPad mini with OLED screen</strong></li><li><strong>M6 iMac refresh</strong></li><li><strong>M6 14-inch MacBook Pro refresh</strong></li><li><strong>MacBook Ultra</strong></li></ul><h2 id="in-development-for-2027">In development for 2027</h2><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="tbGfgnwudZZvAWqyL687hg" name="Tim-Cook-Apple-Glasses-LEDE2" alt="Tim Cook with Apple Glass render" src="https://cdn.mos.cms.futurecdn.net/tbGfgnwudZZvAWqyL687hg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Martin Hajek/ iDrop News/ Shutterstock/ Tom’s Guide)</span></figcaption></figure><p>Next year is when we could start seeing some truly updated designs for Apple's products from the all-glass iPhone 20 to redesigned Apple Watches and even more smart home products. </p><p>Some devices will be a simple chip refresh, like the M6 MacBook Air or the <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-could-get-these-two-major-performance-upgrades-in-2027-but-i-want-apple-to-fix-this-instead">A19 Pro MacBook Neo,</a> which proved so popular the first go-round that Apple <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-inventory-has-reportedly-sold-out-what-you-need-to-know">couldn't keep it in stock</a>.</p><p>A slew of iPads, from a refreshed <a href="https://www.tomsguide.com/computing/ipads/ipad-12-just-got-teased-by-an-accessory-maker-and-theres-a-disappointing-bit-of-news">iPad 12</a> to an <a href="https://www.tomsguide.com/computing/ipads/ipad-air-oled-tipped-for-long-overdue-2027-launch-but-at-what-cost">iPad Air OLED</a> are also expected next year.</p><p>iPhones will get weird next year starting in the spring where Apple <a href="https://www.tomsguide.com/phones/iphones/iphone-18-tipped-for-cost-cutting-downgrades-heres-what-we-know">splits the launch </a>of the iPhone 18 series. We should see the<a href="https://www.tomsguide.com/phones/iphone-18-release-just-tipped-for-major-shakeup-heres-when-all-the-new-models-could-launch"> vanilla iPhone 18</a>, alongside the iPhone 18e and<a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-rumors-5-biggest-expected-upgrades"> iPhone Air 2</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1456px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r2pW7STcGyqWJttRcb5SAH" name="iPhone 20 render" alt="iPhone 20 render" src="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1920-80.jpg" mos="" align="middle" fullscreen="" width="1456" height="819" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AppleTrack)</span></figcaption></figure><p>In the back half of the year, the 20th anniversary iPhone could feature one of the largest design changes in years. The biggest is a curvy all-glass wraparound design that seamlessly covers the entire phone. An analyst <a href="https://www.tomsguide.com/phones/iphones/all-glass-iphone-20-reportedly-canceled-20th-anniversary-iphone-hits-major-setback">claimed this design was canceled</a> in August, but Mark Gurman pushed back, saying that it's still on track. There are <a href="https://www.tomsguide.com/phones/iphones/new-iphone-20-video-reveals-the-8-biggest-upgrades-to-expect-from-the-20th-anniversary-iphone">more potential changes, </a>but the glass look will be immediately noticeable.</p><p>We were expecting to see <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-everything-we-know-so-far-about-apples-camera-earbuds">camera-laden AirPods</a> this year after leaked code and videos appeared, but Gurman claims these have been delayed until 2027. The cameras would enable Siri AI to "see" the world around you and respond to queries. People are voicing privacy concerns already, but presumably the cameras would not record photos or video.</p><p>Finally, <a href="https://www.tomsguide.com/computing/vr-ar/lighter-and-cheaper-apple-vision-pro-2-sounds-like-a-headset-youll-actually-buy-but-heres-why-you-shouldnt">Tim Cook was allegedly obsessed</a> with <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">Apple Glasses</a>, but it's not clear if Ternus shares that same excitement. Apple's take on the form should arrive next year and be similar to the Meta Ray-Ban allowing you to take calls, pictures and videos but lacking a display. Rumors had slated the glasses for 2028 but a summer report claimed <a href="https://www.tomsguide.com/computing/smart-glasses/apple-is-rethinking-its-future-product-roadmap-after-losing-smart-glasses-chief-to-openai-analysts-say">Apple was rethinking its roadmap</a> after Vision head Paul Meade left for OpenAI.</p><ul><li><strong>M6 MacBook Air</strong></li><li><strong>A19 Pro MacBook Neo</strong></li><li><strong>Entry-level iPad refresh</strong></li><li><strong>iPad Air OLED</strong></li><li><strong>iPad Pro</strong></li><li><strong>New Apple Pencils</strong>.</li><li><strong>iPhone 18 and 18e</strong></li><li><strong>iPhone Air 2</strong></li><li><strong>M7 14-inch MacBook Pro</strong></li><li><strong>AirPods with cameras</strong></li><li><strong>In-home security sensor and system</strong>.</li><li><strong>Apple Glasses</strong></li><li><strong>iPhone 20 (XX)</strong></li><li><strong>iPhone Ultra 2</strong></li><li><strong>Redesigned Apple Watches</strong></li><li><strong>M7 Pro and M7 Max MacBooks</strong></li></ul><h2 id="2028-2029-and-beyond">2028, 2029 and beyond</h2><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="h6GpFcSGTZ9Rtx4HpLMVE7" name="apple-campus.jpeg" alt="Apple Event" src="https://cdn.mos.cms.futurecdn.net/h6GpFcSGTZ9Rtx4HpLMVE7-1920-80.jpeg" 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: Apple)</span></figcaption></figure><p>The next batch of potential Apple devices could be released any time between 2028 and 2030. Some are chip and OLED updates, but a couple are new devices that we haven't seen from Apple before.</p><p>The <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">HomePod on a robot arm</a> was rumored two years ago and apparently will actually debut in the next couple of years. Per Gurman, this version will have a 9-inch display and advanced AI features. </p><p>Before the rumor mill settled on the foldable iPhone, Apple's first foldable device was actually supposed to be a  <a href="https://www.tomsguide.com/tablets/ipads/apple-reportedly-has-an-18-8-inch-foldable-ipad-prototype-with-under-display-face-id">giant foldable 18-inch iPad</a> or MacBook. Apparently, this is still in the works and <a href="https://www.tomsguide.com/computing/ipads/apples-giant-foldable-ipad-likely-wont-launch-until-2028-what-weve-heard">could launch in 2028</a>. Gurman claims manufacturing issues pushed a potential launch back.</p><p>Apple allegedly wants to release its own AR glasses à la the <a href="https://www.tomsguide.com/computing/smart-glasses/ive-been-wearing-the-meta-ray-ban-display-smart-glasses-for-24-hours-heres-what-i-like-and-hate">Meta Ray-Ban Display</a>. The glasses would superimpose data on your real-world view. There's no specific release year for these, but they could arrive before 2030.</p><p>Apple is apparently working on an AI pendant as well. <a href="https://www.tomsguide.com/computing/apples-ai-wearable-roadmap-is-getting-wild-prepare-for-ai-pendant-smart-glasses-and-airpods-with-cameras">The Apple version </a>would work with your iPhone and use AI and the camera for tasks.</p><ul><li><strong>HomePad with a robot arm</strong></li><li><strong>M7 Max and M7 Ultra Mac Studio</strong></li><li><strong>Apple Vision Pro revamp</strong></li><li><strong>AI Pendant</strong></li><li><strong>Larger foldable iPhone</strong></li><li><strong>Foldable iPad  </strong></li><li><strong>MacBook Air OLED</strong></li><li><strong>Higher-end iMac OLED</strong></li><li><strong>Augmented reality glasses</strong></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/home/smart-home/apple-homepad-rumored-release-date-price-and-all-the-latest-leaks">Apple HomePad rumored release date, price and all the latest leaks</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-price-rumors-heres-how-much-you-can-expect-to-pay-for-apples-first-foldable">iPhone Ultra price rumors — here's how much you can expect to pay for Apple’s first foldable</a></li><li><a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch Italian Grand Prix on Apple TV ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Formula 1 2026 season heads to Monza this weekend for the Italian Grand Prix with home hero Kimi Antonelli leading the Drivers' Championship by 59 points.</p><p>The good news – if you live in the U.S. – is that you can watch the Italian Grand Prix on Apple TV with a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>FREE 7-day trial</strong></a>. </p><p>Read on to learn how to <a href="https://tv.apple.com/" target="_blank" rel="nofollow">stream Italian Grand Prix on Apple TV</a> in the U.S. If you're a new or returning subscriber.</p><h2 id="how-to-watch-italian-grand-prix-on-apple-tv">How to watch Italian Grand Prix on Apple TV</h2><div class="product"><a data-dimension112="40ae2804-a6e1-11f1-8b9c-d5b30b0a3bd9" data-action="Deal Block" data-label="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension48="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="imZK858YrzU3hnq7d2zHmT" name="Apple TV Formula 1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/imZK858YrzU3hnq7d2zHmT-1920-80.jpg" mos="" align="middle" fullscreen="" width="900" height="900" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong>▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on </strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="40ae2804-a6e1-11f1-8b9c-d5b30b0a3bd9" data-action="Deal Block" data-label="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension48="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension25=""><strong>Apple TV</strong></a><strong> in the U.S..</strong><br /><br />Subscriptions start at $14.99 per month or $119 per year, and new users get access to a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day FREE trial</strong></a>.</p><p>Apple TV feature a dedicated F1 section that will house all live streams, including practice sessions, qualifying, sprint races, and Sunday’s main race, along with driver onboard cameras and other special features. To encourage new viewers, Apple TV will stream all practice sessions from every Grand Prix for free. <a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="40ae2804-a6e1-11f1-8b9c-d5b30b0a3bd9" data-action="Deal Block" data-label="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension48="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-how-to-watch-italian-grand-prix-on-apple-tv-from-anywhere"><span>How to watch Italian Grand Prix on Apple TV from anywhere</span></h2><div class="product"><a data-dimension112="40ae29e4-a6e1-11f1-8e01-851d129334d5" data-action="Deal Block" data-label="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN exclusive deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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-1920-80.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&amp;utm_medium=affiliate&amp;utm_term=&amp;utm_content=TG&amp;utm_campaign=off564&amp;utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="40ae29e4-a6e1-11f1-8e01-851d129334d5" data-action="Deal Block" data-label="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN exclusive deal: 75% Off + 3 Months 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 regional streaming</strong><br /><br />Use Nord to unblock your usual coverage and watch Formula 1 on Apple TV with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="40ae29e4-a6e1-11f1-8e01-851d129334d5" data-action="Deal Block" data-label="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension25="">View Deal</a></p></div><section class="article__schema-question"><h3>What time does the Italian Grand Prix start?</h3><article class="article__schema-answer"><p>The Italian Grand Prix starts at 9 a.m. ET on Sunday in the U.S. which is 2 p.m. BST in the U.K. and 11 p.m. AEST in Australia.</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-f1-live-online">How to watch F1 2026 online</a></li><li><a href="https://www.tomsguide.com/reviews/paramount-plus" target="_blank">Paramount+ full review</a></li><li><a href="https://www.tomsguide.com/entertainment/sports/how-to-watch-premier-league-2025-26-tv-guide" target="_blank">How to watch Premier League</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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/how-to-watch-italian-grand-prix-on-apple-tv</link>
                                                                            <description>
                            <![CDATA[ Here's how you can watch the Italian Grand Prix live from Monza on Apple TV from anywhere in the world. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yWyPr9BrpMyvtQc9DdJHXD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/uurR5B6rzefuijbUZ2uosU-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 03 Sep 2026 19:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jacob Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/MVd5AB5fRo4H8yGGGhSSDk-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/uurR5B6rzefuijbUZ2uosU-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Kimi Antonelli - Italian Grand Prix]]></media:description>                                                            <media:text><![CDATA[Kimi Antonelli - Italian Grand Prix]]></media:text>
                                <media:title type="plain"><![CDATA[Kimi Antonelli - Italian Grand Prix]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/uurR5B6rzefuijbUZ2uosU-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Formula 1 2026 season heads to Monza this weekend for the Italian Grand Prix with home hero Kimi Antonelli leading the Drivers' Championship by 59 points.</p><p>The good news – if you live in the U.S. – is that you can watch the Italian Grand Prix on Apple TV with a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>FREE 7-day trial</strong></a>. </p><p>Read on to learn how to <a href="https://tv.apple.com/" target="_blank" rel="nofollow">stream Italian Grand Prix on Apple TV</a> in the U.S. If you're a new or returning subscriber.</p><h2 id="how-to-watch-italian-grand-prix-on-apple-tv">How to watch Italian Grand Prix on Apple TV</h2><div class="product"><a data-dimension112="40ae2804-a6e1-11f1-8b9c-d5b30b0a3bd9" data-action="Deal Block" data-label="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension48="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="imZK858YrzU3hnq7d2zHmT" name="Apple TV Formula 1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/imZK858YrzU3hnq7d2zHmT-1920-80.jpg" mos="" align="middle" fullscreen="" width="900" height="900" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong>▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on </strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="40ae2804-a6e1-11f1-8b9c-d5b30b0a3bd9" data-action="Deal Block" data-label="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension48="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension25=""><strong>Apple TV</strong></a><strong> in the U.S..</strong><br /><br />Subscriptions start at $14.99 per month or $119 per year, and new users get access to a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day FREE trial</strong></a>.</p><p>Apple TV feature a dedicated F1 section that will house all live streams, including practice sessions, qualifying, sprint races, and Sunday’s main race, along with driver onboard cameras and other special features. To encourage new viewers, Apple TV will stream all practice sessions from every Grand Prix for free. <a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="40ae2804-a6e1-11f1-8b9c-d5b30b0a3bd9" data-action="Deal Block" data-label="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension48="▶︎ Every Grand Prix, practice and qualifying session of the Italian Grand Prix is available to stream on Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-how-to-watch-italian-grand-prix-on-apple-tv-from-anywhere"><span>How to watch Italian Grand Prix on Apple TV from anywhere</span></h2><div class="product"><a data-dimension112="40ae29e4-a6e1-11f1-8e01-851d129334d5" data-action="Deal Block" data-label="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN exclusive deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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-1920-80.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&amp;utm_medium=affiliate&amp;utm_term=&amp;utm_content=TG&amp;utm_campaign=off564&amp;utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="40ae29e4-a6e1-11f1-8e01-851d129334d5" data-action="Deal Block" data-label="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN exclusive deal: 75% Off + 3 Months 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 regional streaming</strong><br /><br />Use Nord to unblock your usual coverage and watch Formula 1 on Apple TV with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="40ae29e4-a6e1-11f1-8e01-851d129334d5" data-action="Deal Block" data-label="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN exclusive deal: 75% Off + 3 Months FREE" data-dimension25="">View Deal</a></p></div><section class="article__schema-question"><h3>What time does the Italian Grand Prix start?</h3><article class="article__schema-answer"><p>The Italian Grand Prix starts at 9 a.m. ET on Sunday in the U.S. which is 2 p.m. BST in the U.K. and 11 p.m. AEST in Australia.</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-f1-live-online">How to watch F1 2026 online</a></li><li><a href="https://www.tomsguide.com/reviews/paramount-plus" target="_blank">Paramount+ full review</a></li><li><a href="https://www.tomsguide.com/entertainment/sports/how-to-watch-premier-league-2025-26-tv-guide" target="_blank">How to watch Premier League</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[ Apple TV Report Card 2026: Do prestige TV shows make up for a tiny library? ]]></title>
                                                                                                <dc:content><![CDATA[ <p><strong>Apple TV</strong> has a slightly unusual problem for a streaming service: It has some of the best TV on television, but not much else. That's not necessarily a bad thing. In fact, Apple has spent the past few years building one of the strongest original-programming libraries in streaming. "Severance," "The Morning Show," "Ted Lasso," "Slow Horses" and "The Studio" have helped make Apple TV a legitimate destination for prestige television. But try to use it as your <em>only</em> streaming service and the limitations become obvious.</p><p>There are relatively few movies and older shows compared with competitors, and the service's live TV offerings are limited. Still, Apple has one major advantage: It knows what it wants to be. Apple TV isn't trying to be Netflix. It's trying to be the place where you go for a handful of very good shows — and increasingly, a handful of live sports, too.</p><p>Tom's Guide's streaming team is constantly watching the latest movies and TV shows. That means we're also constantly using and evaluating the streaming services those movies and shows live on. To make it easier to figure out which services are actually worth your money, <strong>we've put together report cards for the biggest streaming services in the U.S., grading each across the categories that matter most: price, library, original content, interface and live programming.</strong></p><p>So, without further ado, let's see how Apple's streaming service stacks up — and whether its excellent originals can make up for everything it lacks.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:69.53%;"><img id="PMrzvhKTZtu8PAeEDUHn5L" name="Apple-TV_Streaming-Report-Card-2026_v3" alt="Apple TV Streaming Report Card 2026" src="https://cdn.mos.cms.futurecdn.net/PMrzvhKTZtu8PAeEDUHn5L-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1780" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nick Bush for Tom's Guide)</span></figcaption></figure><h2 id="apple-tv-pricing">Apple TV: Pricing</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Tier</strong></p></td><td  ><p><strong>Price (monthly)</strong></p></td><td  ><p><strong>Ads</strong></p></td><td  ><p><strong>Live sports</strong></p></td><td  ><p><strong>Concurrent streaming</strong></p></td><td  ><p><strong>Offline downloads</strong></p></td></tr><tr><td class="firstcol " ><p>Apple TV</p></td><td  ><p>$12.99</p></td><td  ><p>No</p></td><td  ><p>Yes</p></td><td  ><p>6 devices</p></td><td  ><p>Yes</p></td></tr></tbody></table></div><p>Apple TV is refreshingly simple when it comes to pricing. For the past year it's been $12.99 a month, with no ad-supported tier and no confusing menu of plans. However, Apple has just raised the price to $14.99, which will likely impact our value grade in next year's survey.</p><p>You get access to Apple's entire library of original shows and movies, along with its growing slate of live sports. You can also share the subscription with your Family Sharing group, which makes the effective cost considerably lower if you're already in an Apple-heavy household.</p><p>Apple also makes it easy to bundle Apple TV with its other services through Apple One. Depending on which bundle you choose, you can combine Apple TV with services such as Apple Music, Apple Arcade and iCloud+.</p><p>Apple TV isn't the cheapest streamer around. But unlike some competitors, you get the full service with no ads for one relatively reasonable monthly fee.</p><p><strong>Grade: B+</strong></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2d5vX"></div>                            </div>                            <script src="https://kwizly.com/embed/W2d5vX.js" async=""></script><h2 id="apple-tv-library">Apple TV: Library</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3504px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ge62N6e6fGbA4fgHsSsgh5" name="2JF57D6 (1).jpg" alt="Mark Watney (Matt Damon) in a spacesuit kneeling in the sand on the surface of Mars in "The Martian"" src="https://cdn.mos.cms.futurecdn.net/Ge62N6e6fGbA4fgHsSsgh5-1920-80.jpg" mos="" align="middle" fullscreen="" width="3504" height="1971" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alamy)</span></figcaption></figure><p>Here's where things get dicey: Apple TV has a library problem. Unlike Netflix, Hulu or HBO Max, Apple doesn't have decades of television and movies sitting around waiting to be streamed. Apple TV's catalog is almost entirely made up of Apple originals, which means there's a lot of quality but comparatively little <em>stuff</em>.</p><div><blockquote><p>This is a service where the average quality of the library is unusually high, but the quantity is unusually low.</p></blockquote></div><p>Apple has made some moves to beef things up, particularly with licensed movies (like "The Martian," pictured above) and kids' programming, but it still doesn't come close to the depth of the major general-interest streamers. There's no equivalent of Peacock's "The Office" or Bravo library, Netflix's endless supply of movies and reality TV, or HBO Max's decades of HBO programming.</p><p>This is a service where the <em>average quality</em> of the library is unusually high, but the <em>quantity</em> is unusually low. That's a perfectly reasonable strategy if you're looking for great television. It's much less appealing if you want a service you can endlessly browse.</p><p><strong>Grade: C-</strong></p><h2 id="apple-tv-originals">Apple TV: Originals</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2700px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="jhTpwcc5uu4uKuxzprXUEg" name="Severance_Photo_020104" alt="Adam Scott in "Severance," now streaming on Apple TV Plus." src="https://cdn.mos.cms.futurecdn.net/jhTpwcc5uu4uKuxzprXUEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2700" height="1519" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Apple TV has quietly assembled one of the most impressive collections of original television in streaming. "Severance" is appointment television. "Slow Horses" has become one of the most reliably excellent spy series around. "Ted Lasso" was a genuine cultural phenomenon. "The Studio" proved Apple can do sharp comedy as well as prestige drama. And shows like "Shrinking," "Silo," "The Morning Show" and "For All Mankind" give the service a deeper bench than its relatively small library might suggest.</p><div><blockquote><p>There's prestige drama, sci-fi, comedy, workplace drama, thrillers and big-budget genre series.</p></blockquote></div><p>The biggest compliment you can give Apple is that its shows increasingly feel like <em>Apple shows</em> without all feeling the same. There's prestige drama, sci-fi, comedy, workplace drama, thrillers and big-budget genre series.</p><p>The movie side is more uneven, though there have been some notable successes like "F1" and "Eternity." But generally, it has a tendency toward "very expensive movie you might watch eventually" rather than "movie everyone is talking about right now."</p><p>Still, this is the category that makes an Apple TV subscription a slam dunk. You may not always have something to watch, but when Apple gets it right, it really gets it right.</p><p><strong>Grade: A-</strong></p><h2 id="apple-tv-interface">Apple TV: Interface</h2><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="jpcvGyQ7SeioDDGcSiFSgR" name="apple-tv-interface-screenshot" alt="A screenshot of the Apple TV homepage on desktop" src="https://cdn.mos.cms.futurecdn.net/jpcvGyQ7SeioDDGcSiFSgR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple's interface is generally clean, polished and easy to navigate, which already puts it ahead of most streaming services. The app does a good job of surfacing Apple's originals without making the whole experience feel like an endless advertising carousel. Continue Watching is easy to find, show pages are straightforward and the overall design feels appropriately uncluttered.</p><div><blockquote><p>Apple TV generally makes sense.</p></blockquote></div><p>There is, however, one major annoyance: Apple TV is increasingly becoming a portal for content that you don't necessarily own or subscribe to. The service does a good job integrating rentals, purchases and other channels into the broader Apple TV experience, but that can also make it less obvious what's actually included with your subscription.</p><p>It's a relatively minor complaint compared with some competitors' interfaces, where simply finding the next episode can feel like an escape room. Apple TV generally makes sense. It just occasionally makes you ask, "Wait, do I have access to this?"</p><p><strong>Grade: B</strong></p><h2 id="apple-tv-live-content">Apple TV: Live content</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2510px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mL8d7rYsDUSEwVWQBDfhdV" name="F1-25-deal" alt="Screenshot from F1 25 on PS5" src="https://cdn.mos.cms.futurecdn.net/mL8d7rYsDUSEwVWQBDfhdV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2510" height="1412" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Electronic Arts)</span></figcaption></figure><p>Apple has made a surprisingly serious push into live sports, and Formula 1 is a big reason why. Apple TV's F1 coverage goes well beyond simply putting the race on a stream. Subscribers can watch every Grand Prix, qualifying session, Sprint and practice session live, making it one of the most comprehensive ways to follow the F1 season.</p><p>Then there's Multiview, which lets you watch up to four feeds at once. F1 fans can also get considerably closer to the action with 22 onboard driver cameras, a live driver tracker and real-time data feeds during races. </p><div><blockquote><p>Rather than trying to carry everything, it has invested heavily in a handful of sports</p></blockquote></div><p>F1 isn't Apple's only live-sports play. MLS remains a major part of the service, while Friday Night Baseball brings a weekly slate of MLB games during the season. Apple has also continued to expand its live sports offerings, giving the service more to offer between seasons.</p><p>It's still nowhere near the breadth of a service like Peacock, which has the Olympics, NFL, NBA and other major events. But Apple has taken a smart approach: Rather than trying to carry everything, it has invested heavily in a handful of sports and built genuinely impressive viewing experiences around them.</p><p><em>Note: This is just an evaluation of the live programming on offer in the U.S. Live programming varies by market.</em></p><p><strong>Grade: B</strong></p><h2 id="apple-tv-overall-grade-b">Apple TV overall grade: B-</h2><p>Apple TV is a little difficult to grade because its strengths and weaknesses are almost perfectly opposed. On one hand, you're getting a relatively affordable subscription with an excellent collection of original TV, a polished interface and an increasingly interesting live-sports lineup. On the other, the library is tiny compared with what you get from the bigger general-interest streamers.</p><p>That means Apple TV makes a fantastic second streaming service; it's considerably harder to recommend as your only one.</p><p>If you want some of the best original TV in streaming, Apple TV is almost impossible to ignore. If you want something to put on every night for the next six months, you'll probably run out of options considerably faster than you would on Netflix, Peacock or HBO Max. Apple isn't trying to win the streaming volume game, and honestly, it doesn't need to. The strategy is quality over quantity — and it's a great one.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/upcoming-marvel-mcu-movie-tv-show-release-dates">Every upcoming Marvel movie and TV show coming to the MCU</a></li><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/every-upcoming-dc-universe-movie-and-tv-show">Every upcoming DC Universe movie and TV show</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/apple-tv-report-card-2026-do-prestige-tv-shows-make-up-for-a-tiny-library</link>
                                                                            <description>
                            <![CDATA[ Our 2026 streaming report card for Apple TV grades the platform on its price, originals, library, interface and live content. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">j5QaS3bPNyLeM8Z3DwWKxi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 02 Sep 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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-320-70.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/hrTBe4yDuQUeE7F6eLMCvS-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV on a sunset background]]></media:description>                                                            <media:text><![CDATA[Apple TV on a sunset background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV on a sunset background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><strong>Apple TV</strong> has a slightly unusual problem for a streaming service: It has some of the best TV on television, but not much else. That's not necessarily a bad thing. In fact, Apple has spent the past few years building one of the strongest original-programming libraries in streaming. "Severance," "The Morning Show," "Ted Lasso," "Slow Horses" and "The Studio" have helped make Apple TV a legitimate destination for prestige television. But try to use it as your <em>only</em> streaming service and the limitations become obvious.</p><p>There are relatively few movies and older shows compared with competitors, and the service's live TV offerings are limited. Still, Apple has one major advantage: It knows what it wants to be. Apple TV isn't trying to be Netflix. It's trying to be the place where you go for a handful of very good shows — and increasingly, a handful of live sports, too.</p><p>Tom's Guide's streaming team is constantly watching the latest movies and TV shows. That means we're also constantly using and evaluating the streaming services those movies and shows live on. To make it easier to figure out which services are actually worth your money, <strong>we've put together report cards for the biggest streaming services in the U.S., grading each across the categories that matter most: price, library, original content, interface and live programming.</strong></p><p>So, without further ado, let's see how Apple's streaming service stacks up — and whether its excellent originals can make up for everything it lacks.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:69.53%;"><img id="PMrzvhKTZtu8PAeEDUHn5L" name="Apple-TV_Streaming-Report-Card-2026_v3" alt="Apple TV Streaming Report Card 2026" src="https://cdn.mos.cms.futurecdn.net/PMrzvhKTZtu8PAeEDUHn5L-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1780" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nick Bush for Tom's Guide)</span></figcaption></figure><h2 id="apple-tv-pricing">Apple TV: Pricing</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Tier</strong></p></td><td  ><p><strong>Price (monthly)</strong></p></td><td  ><p><strong>Ads</strong></p></td><td  ><p><strong>Live sports</strong></p></td><td  ><p><strong>Concurrent streaming</strong></p></td><td  ><p><strong>Offline downloads</strong></p></td></tr><tr><td class="firstcol " ><p>Apple TV</p></td><td  ><p>$12.99</p></td><td  ><p>No</p></td><td  ><p>Yes</p></td><td  ><p>6 devices</p></td><td  ><p>Yes</p></td></tr></tbody></table></div><p>Apple TV is refreshingly simple when it comes to pricing. For the past year it's been $12.99 a month, with no ad-supported tier and no confusing menu of plans. However, Apple has just raised the price to $14.99, which will likely impact our value grade in next year's survey.</p><p>You get access to Apple's entire library of original shows and movies, along with its growing slate of live sports. You can also share the subscription with your Family Sharing group, which makes the effective cost considerably lower if you're already in an Apple-heavy household.</p><p>Apple also makes it easy to bundle Apple TV with its other services through Apple One. Depending on which bundle you choose, you can combine Apple TV with services such as Apple Music, Apple Arcade and iCloud+.</p><p>Apple TV isn't the cheapest streamer around. But unlike some competitors, you get the full service with no ads for one relatively reasonable monthly fee.</p><p><strong>Grade: B+</strong></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2d5vX"></div>                            </div>                            <script src="https://kwizly.com/embed/W2d5vX.js" async=""></script><h2 id="apple-tv-library">Apple TV: Library</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3504px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ge62N6e6fGbA4fgHsSsgh5" name="2JF57D6 (1).jpg" alt="Mark Watney (Matt Damon) in a spacesuit kneeling in the sand on the surface of Mars in "The Martian"" src="https://cdn.mos.cms.futurecdn.net/Ge62N6e6fGbA4fgHsSsgh5-1920-80.jpg" mos="" align="middle" fullscreen="" width="3504" height="1971" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alamy)</span></figcaption></figure><p>Here's where things get dicey: Apple TV has a library problem. Unlike Netflix, Hulu or HBO Max, Apple doesn't have decades of television and movies sitting around waiting to be streamed. Apple TV's catalog is almost entirely made up of Apple originals, which means there's a lot of quality but comparatively little <em>stuff</em>.</p><div><blockquote><p>This is a service where the average quality of the library is unusually high, but the quantity is unusually low.</p></blockquote></div><p>Apple has made some moves to beef things up, particularly with licensed movies (like "The Martian," pictured above) and kids' programming, but it still doesn't come close to the depth of the major general-interest streamers. There's no equivalent of Peacock's "The Office" or Bravo library, Netflix's endless supply of movies and reality TV, or HBO Max's decades of HBO programming.</p><p>This is a service where the <em>average quality</em> of the library is unusually high, but the <em>quantity</em> is unusually low. That's a perfectly reasonable strategy if you're looking for great television. It's much less appealing if you want a service you can endlessly browse.</p><p><strong>Grade: C-</strong></p><h2 id="apple-tv-originals">Apple TV: Originals</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2700px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="jhTpwcc5uu4uKuxzprXUEg" name="Severance_Photo_020104" alt="Adam Scott in "Severance," now streaming on Apple TV Plus." src="https://cdn.mos.cms.futurecdn.net/jhTpwcc5uu4uKuxzprXUEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2700" height="1519" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Apple TV has quietly assembled one of the most impressive collections of original television in streaming. "Severance" is appointment television. "Slow Horses" has become one of the most reliably excellent spy series around. "Ted Lasso" was a genuine cultural phenomenon. "The Studio" proved Apple can do sharp comedy as well as prestige drama. And shows like "Shrinking," "Silo," "The Morning Show" and "For All Mankind" give the service a deeper bench than its relatively small library might suggest.</p><div><blockquote><p>There's prestige drama, sci-fi, comedy, workplace drama, thrillers and big-budget genre series.</p></blockquote></div><p>The biggest compliment you can give Apple is that its shows increasingly feel like <em>Apple shows</em> without all feeling the same. There's prestige drama, sci-fi, comedy, workplace drama, thrillers and big-budget genre series.</p><p>The movie side is more uneven, though there have been some notable successes like "F1" and "Eternity." But generally, it has a tendency toward "very expensive movie you might watch eventually" rather than "movie everyone is talking about right now."</p><p>Still, this is the category that makes an Apple TV subscription a slam dunk. You may not always have something to watch, but when Apple gets it right, it really gets it right.</p><p><strong>Grade: A-</strong></p><h2 id="apple-tv-interface">Apple TV: Interface</h2><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="jpcvGyQ7SeioDDGcSiFSgR" name="apple-tv-interface-screenshot" alt="A screenshot of the Apple TV homepage on desktop" src="https://cdn.mos.cms.futurecdn.net/jpcvGyQ7SeioDDGcSiFSgR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple's interface is generally clean, polished and easy to navigate, which already puts it ahead of most streaming services. The app does a good job of surfacing Apple's originals without making the whole experience feel like an endless advertising carousel. Continue Watching is easy to find, show pages are straightforward and the overall design feels appropriately uncluttered.</p><div><blockquote><p>Apple TV generally makes sense.</p></blockquote></div><p>There is, however, one major annoyance: Apple TV is increasingly becoming a portal for content that you don't necessarily own or subscribe to. The service does a good job integrating rentals, purchases and other channels into the broader Apple TV experience, but that can also make it less obvious what's actually included with your subscription.</p><p>It's a relatively minor complaint compared with some competitors' interfaces, where simply finding the next episode can feel like an escape room. Apple TV generally makes sense. It just occasionally makes you ask, "Wait, do I have access to this?"</p><p><strong>Grade: B</strong></p><h2 id="apple-tv-live-content">Apple TV: Live content</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2510px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mL8d7rYsDUSEwVWQBDfhdV" name="F1-25-deal" alt="Screenshot from F1 25 on PS5" src="https://cdn.mos.cms.futurecdn.net/mL8d7rYsDUSEwVWQBDfhdV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2510" height="1412" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Electronic Arts)</span></figcaption></figure><p>Apple has made a surprisingly serious push into live sports, and Formula 1 is a big reason why. Apple TV's F1 coverage goes well beyond simply putting the race on a stream. Subscribers can watch every Grand Prix, qualifying session, Sprint and practice session live, making it one of the most comprehensive ways to follow the F1 season.</p><p>Then there's Multiview, which lets you watch up to four feeds at once. F1 fans can also get considerably closer to the action with 22 onboard driver cameras, a live driver tracker and real-time data feeds during races. </p><div><blockquote><p>Rather than trying to carry everything, it has invested heavily in a handful of sports</p></blockquote></div><p>F1 isn't Apple's only live-sports play. MLS remains a major part of the service, while Friday Night Baseball brings a weekly slate of MLB games during the season. Apple has also continued to expand its live sports offerings, giving the service more to offer between seasons.</p><p>It's still nowhere near the breadth of a service like Peacock, which has the Olympics, NFL, NBA and other major events. But Apple has taken a smart approach: Rather than trying to carry everything, it has invested heavily in a handful of sports and built genuinely impressive viewing experiences around them.</p><p><em>Note: This is just an evaluation of the live programming on offer in the U.S. Live programming varies by market.</em></p><p><strong>Grade: B</strong></p><h2 id="apple-tv-overall-grade-b">Apple TV overall grade: B-</h2><p>Apple TV is a little difficult to grade because its strengths and weaknesses are almost perfectly opposed. On one hand, you're getting a relatively affordable subscription with an excellent collection of original TV, a polished interface and an increasingly interesting live-sports lineup. On the other, the library is tiny compared with what you get from the bigger general-interest streamers.</p><p>That means Apple TV makes a fantastic second streaming service; it's considerably harder to recommend as your only one.</p><p>If you want some of the best original TV in streaming, Apple TV is almost impossible to ignore. If you want something to put on every night for the next six months, you'll probably run out of options considerably faster than you would on Netflix, Peacock or HBO Max. Apple isn't trying to win the streaming volume game, and honestly, it doesn't need to. The strategy is quality over quantity — and it's a great one.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/upcoming-marvel-mcu-movie-tv-show-release-dates">Every upcoming Marvel movie and TV show coming to the MCU</a></li><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/every-upcoming-dc-universe-movie-and-tv-show">Every upcoming DC Universe movie and TV show</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Dark Matter' season 2 review: The multiverse drama gets more ambitious in its second season ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: “Dark Matter” season 2</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: 3/5 Stars</strong></li><li><strong>Verdict: </strong> The second season of “Dark Matter” expands on the multiverse adventures of the Dessen family and their associates, with some exciting and affecting developments. But the storytelling still feels a bit limited for a show in which literally anything is possible, and the convoluted plot, with multiple versions of multiple characters, can be overwhelming to follow.</li><li><strong>Premiere date/time:</strong> New episodes premiere Fridays starting Aug. 28</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/dark-matter/umc.cmc.4luj45vtqpmjsvb6sc2675oeg" target="_blank" rel="nofollow">Stream on Apple TV</a></li></ul></p></div></div><p>As much as I enjoyed the first season of <strong>“Dark Matter” on Apple TV</strong>, it seemed to me that the sci-fi series was just reaching the true potential of its premise at the end of the season. So I was excited to see that even though the show is based on a book that was completely adapted in the first season, it was still set to continue, with the possibility of expanding the world — or <em>worlds</em> — of author Blake Crouch’s source novel.</p><p>The second season of “Dark Matter” isn’t quite the freewheeling journey across the multiverse that I hoped for, but it makes sense that Crouch, who’s also the series’ creator and showrunner, would stick to the relatively somber, character-focused tone of the first season. There are still some thrilling dimension-hopping adventures in the second season of “Dark Matter,” which travels further across the multiverse than it did previously, but this isn’t <a href="https://www.tomsguide.com/entertainment/streaming/best-shows-like-dark-matter">“Sliders.”</a> </p><p>It’s a contemplative drama about personal bonds and the consequences of every little choice that people make in their lives, with occasional murder hornets.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="dark-matter-picks-up-right-where-the-first-season-left-off">‘Dark Matter’ picks up right where the first season left off</h2><p>Even people like me who watched every episode of the first season might want to consult a recap of the often convoluted story, because “Dark Matter” season 2 drops viewers right into the action with no chance to play catch-up. That’s especially disorienting in a show that features multiple different versions of nearly all of its central characters, especially brooding physicist Jason Dessen (Joel Edgerton).</p><p>In the first season, an alternate version of Jason used a multiverse-hopping device (which everyone just calls the Box) to travel to the prime Jason’s universe and essentially steal his life, posing as the original Jason alongside Jason’s wife Daniela (Jennifer Connelly) and son Charlie (Oakes Fegley). Meanwhile, the original Jason teamed up with Jason 2’s colleague and former girlfriend Amanda Lucas (Alice Braga) to try to find his way back to his own universe.</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/zhB6_1UbR7s" allowfullscreen=""></iframe></div></div><p>There were numerous detours along the way, and the second season is made up almost entirely of detours, starting with the reunited Dessens living a seemingly peaceful life in a new universe until one of the many (many, many) other Jasons shows up trying to reunite with what he believes is actually his own family. An act of violence against this latest Jason forces the Dessens to flee what they hoped would be their home, getting back into the Box to travel to a new universe where they can live in quiet comfort.</p><p>Of course, that can never happen. The efforts of other Jasons (including the now-repentant Jason 2, whose actions are responsible for the whole situation in the first place) continue to disrupt the multiverse, while Jason’s fellow travelers Amanda, Ryan Holder (Jimmi Simpson), Leighton Vance (Dayo Okeniyi) and Blair Caplan (Amanda Brugel) embark on their own multiversal missions that cause and/or solve new problems.</p><h2 id="dark-matter-gets-more-sprawling-and-ambitious-in-its-second-season">‘Dark Matter’ gets more sprawling and ambitious in its second season</h2><p>It is, to put it mildly, a lot to keep track of, and Crouch (who co-wrote all 10 episodes with Jacquelyn Ben-Zekry) doesn’t give the audience a chance to pause and take stock, with most episodes careening back and forth across multiple storylines with multiple Jasons. Unlike, say, Tatiana Maslany in “Orphan Black,” Edgerton and the other actors aren’t playing wildly distinctive versions of their characters. </p><p>For the most part, the variations among Jasons, Amandas, Ryans, etc., are minor, and while that raises intriguing questions about the nature of self, it also makes the show a bit unwieldy, especially in significant moments that require an emotional connection to a particular character’s arc.</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="7fcTFPa3SgpGAcG2fUnNcC" name="darkmatter-season2-edgerton" alt="Joel Edgerton in Dark Matter season 2" src="https://cdn.mos.cms.futurecdn.net/7fcTFPa3SgpGAcG2fUnNcC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>There are some solid new additions, especially Margo Martindale as a retired nurse whose home becomes a sort of way station for interdimensional travel, and whose spotlight episode is the highlight of the season. Chris Diamantopoulos plays two versions of a hard-nosed investigator determined to figure out the true nature of the Box, although his threats are not quite as urgent as they appear to be when he shows up in the first episode, interrogating a Jason who seems thoroughly demoralized.</p><p>In terms of the new worlds, most are just slightly differentiated from our current, actual world, which helps with budgetary concerns but can make the prospect of each new door opening in the Box a little less enticing. The murder hornets from one memorable world in the first season don’t come back, but there are multiple brief apocalypses and occasional exciting action sequences. </p><p>More intriguingly, the Dessens spend much of the season in a tech-deficient world that resembles the 1980s, and Crouch and Ben-Zekry come up with some clever extrapolations of how society would progress without microchips.</p><h2 id="verdict-dark-matter-remains-an-affecting-if-convoluted-sci-fi-drama">Verdict: ‘Dark Matter’ remains an affecting if convoluted sci-fi drama</h2><p>Even with all the universe-hopping, the show never loses sight of the core relationship among the main Dessens. There isn’t the clear through line of Jason trying to find his way home that drove the first season’s narrative, but there are other personal traumas that the Dessens have to deal with, including complex relationships for both Jason and Daniela with their parents (or versions thereof). </p><p>Edgerton and Connelly handle most of the heavy emotional lifting, while Okeniyi plays up Leighton’s world-changing ambitions via the creation of what amounts to a supervillain team made up only of himself. Brugel, promoted to series regular, brings the most levity as the hardened but pragmatic Blair, who survived way too much time with those murder hornets.</p><p>The second season of “Dark Matter” isn’t as fresh or as streamlined as the first, but it continues to expand the possibilities of Crouch’s storytelling, and a couple of largely standalone midseason episodes point to even more expansive opportunities. The travails of the Dessens remain compelling for now, but with an entire multiverse to explore, “Dark Matter” should be thinking bigger and weirder. Maybe it will get closer in season 3.</p><p><em><strong></strong></em><a href="https://tv.apple.com/us/show/dark-matter/umc.cmc.4luj45vtqpmjsvb6sc2675oeg" target="_blank" rel="nofollow"><em><strong>The second season of “Dark Matter” premieres Aug. 28 on Apple TV</strong></em></a></p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/dark-matter-season-2-review-the-multiverse-drama-gets-more-ambitious-in-its-second-season</link>
                                                                            <description>
                            <![CDATA[ Joel Edgerton is a sad dad traveling across dimensions in the Apple TV sci-fi show's sprawling second season. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HndZtREXQXNWraXgWeE4aJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TDaivQ3HNmwCsPKtVvDeai-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 28 Aug 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Josh Bell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/7YJDqbzv55AwNVnwqDfBK9-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/TDaivQ3HNmwCsPKtVvDeai-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Jennifer Connelly and Joel Edgerton in Dark Matter season 2]]></media:description>                                                            <media:text><![CDATA[Jennifer Connelly and Joel Edgerton in Dark Matter season 2]]></media:text>
                                <media:title type="plain"><![CDATA[Jennifer Connelly and Joel Edgerton in Dark Matter season 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TDaivQ3HNmwCsPKtVvDeai-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: “Dark Matter” season 2</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: 3/5 Stars</strong></li><li><strong>Verdict: </strong> The second season of “Dark Matter” expands on the multiverse adventures of the Dessen family and their associates, with some exciting and affecting developments. But the storytelling still feels a bit limited for a show in which literally anything is possible, and the convoluted plot, with multiple versions of multiple characters, can be overwhelming to follow.</li><li><strong>Premiere date/time:</strong> New episodes premiere Fridays starting Aug. 28</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/dark-matter/umc.cmc.4luj45vtqpmjsvb6sc2675oeg" target="_blank" rel="nofollow">Stream on Apple TV</a></li></ul></p></div></div><p>As much as I enjoyed the first season of <strong>“Dark Matter” on Apple TV</strong>, it seemed to me that the sci-fi series was just reaching the true potential of its premise at the end of the season. So I was excited to see that even though the show is based on a book that was completely adapted in the first season, it was still set to continue, with the possibility of expanding the world — or <em>worlds</em> — of author Blake Crouch’s source novel.</p><p>The second season of “Dark Matter” isn’t quite the freewheeling journey across the multiverse that I hoped for, but it makes sense that Crouch, who’s also the series’ creator and showrunner, would stick to the relatively somber, character-focused tone of the first season. There are still some thrilling dimension-hopping adventures in the second season of “Dark Matter,” which travels further across the multiverse than it did previously, but this isn’t <a href="https://www.tomsguide.com/entertainment/streaming/best-shows-like-dark-matter">“Sliders.”</a> </p><p>It’s a contemplative drama about personal bonds and the consequences of every little choice that people make in their lives, with occasional murder hornets.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="dark-matter-picks-up-right-where-the-first-season-left-off">‘Dark Matter’ picks up right where the first season left off</h2><p>Even people like me who watched every episode of the first season might want to consult a recap of the often convoluted story, because “Dark Matter” season 2 drops viewers right into the action with no chance to play catch-up. That’s especially disorienting in a show that features multiple different versions of nearly all of its central characters, especially brooding physicist Jason Dessen (Joel Edgerton).</p><p>In the first season, an alternate version of Jason used a multiverse-hopping device (which everyone just calls the Box) to travel to the prime Jason’s universe and essentially steal his life, posing as the original Jason alongside Jason’s wife Daniela (Jennifer Connelly) and son Charlie (Oakes Fegley). Meanwhile, the original Jason teamed up with Jason 2’s colleague and former girlfriend Amanda Lucas (Alice Braga) to try to find his way back to his own universe.</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/zhB6_1UbR7s" allowfullscreen=""></iframe></div></div><p>There were numerous detours along the way, and the second season is made up almost entirely of detours, starting with the reunited Dessens living a seemingly peaceful life in a new universe until one of the many (many, many) other Jasons shows up trying to reunite with what he believes is actually his own family. An act of violence against this latest Jason forces the Dessens to flee what they hoped would be their home, getting back into the Box to travel to a new universe where they can live in quiet comfort.</p><p>Of course, that can never happen. The efforts of other Jasons (including the now-repentant Jason 2, whose actions are responsible for the whole situation in the first place) continue to disrupt the multiverse, while Jason’s fellow travelers Amanda, Ryan Holder (Jimmi Simpson), Leighton Vance (Dayo Okeniyi) and Blair Caplan (Amanda Brugel) embark on their own multiversal missions that cause and/or solve new problems.</p><h2 id="dark-matter-gets-more-sprawling-and-ambitious-in-its-second-season">‘Dark Matter’ gets more sprawling and ambitious in its second season</h2><p>It is, to put it mildly, a lot to keep track of, and Crouch (who co-wrote all 10 episodes with Jacquelyn Ben-Zekry) doesn’t give the audience a chance to pause and take stock, with most episodes careening back and forth across multiple storylines with multiple Jasons. Unlike, say, Tatiana Maslany in “Orphan Black,” Edgerton and the other actors aren’t playing wildly distinctive versions of their characters. </p><p>For the most part, the variations among Jasons, Amandas, Ryans, etc., are minor, and while that raises intriguing questions about the nature of self, it also makes the show a bit unwieldy, especially in significant moments that require an emotional connection to a particular character’s arc.</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="7fcTFPa3SgpGAcG2fUnNcC" name="darkmatter-season2-edgerton" alt="Joel Edgerton in Dark Matter season 2" src="https://cdn.mos.cms.futurecdn.net/7fcTFPa3SgpGAcG2fUnNcC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>There are some solid new additions, especially Margo Martindale as a retired nurse whose home becomes a sort of way station for interdimensional travel, and whose spotlight episode is the highlight of the season. Chris Diamantopoulos plays two versions of a hard-nosed investigator determined to figure out the true nature of the Box, although his threats are not quite as urgent as they appear to be when he shows up in the first episode, interrogating a Jason who seems thoroughly demoralized.</p><p>In terms of the new worlds, most are just slightly differentiated from our current, actual world, which helps with budgetary concerns but can make the prospect of each new door opening in the Box a little less enticing. The murder hornets from one memorable world in the first season don’t come back, but there are multiple brief apocalypses and occasional exciting action sequences. </p><p>More intriguingly, the Dessens spend much of the season in a tech-deficient world that resembles the 1980s, and Crouch and Ben-Zekry come up with some clever extrapolations of how society would progress without microchips.</p><h2 id="verdict-dark-matter-remains-an-affecting-if-convoluted-sci-fi-drama">Verdict: ‘Dark Matter’ remains an affecting if convoluted sci-fi drama</h2><p>Even with all the universe-hopping, the show never loses sight of the core relationship among the main Dessens. There isn’t the clear through line of Jason trying to find his way home that drove the first season’s narrative, but there are other personal traumas that the Dessens have to deal with, including complex relationships for both Jason and Daniela with their parents (or versions thereof). </p><p>Edgerton and Connelly handle most of the heavy emotional lifting, while Okeniyi plays up Leighton’s world-changing ambitions via the creation of what amounts to a supervillain team made up only of himself. Brugel, promoted to series regular, brings the most levity as the hardened but pragmatic Blair, who survived way too much time with those murder hornets.</p><p>The second season of “Dark Matter” isn’t as fresh or as streamlined as the first, but it continues to expand the possibilities of Crouch’s storytelling, and a couple of largely standalone midseason episodes point to even more expansive opportunities. The travails of the Dessens remain compelling for now, but with an entire multiverse to explore, “Dark Matter” should be thinking bigger and weirder. Maybe it will get closer in season 3.</p><p><em><strong></strong></em><a href="https://tv.apple.com/us/show/dark-matter/umc.cmc.4luj45vtqpmjsvb6sc2675oeg" target="_blank" rel="nofollow"><em><strong>The second season of “Dark Matter” premieres Aug. 28 on Apple TV</strong></em></a></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Dark Matter' season 2 online — stream the Joel Edgerton thriller series from anywhere ]]></title>
                                                                                                <dc:content><![CDATA[ <p>"Dark Matter" is the thrilling small screen adaptation of the popular Blake Crouch novel starring Joel Edgerton and Jennifer Connelly. Now they're back for more with a second season.</p><p>Below, we’ll show you how to watch "Dark Matter" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Dark Matter' S2 release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Dark Matter" season 2 premieres globally on Apple TV on <strong>Friday, August 28, 2026</strong>. New episodes then arrive weekly every Friday until the finale on October 30, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>The second season of "Dark Matter" will actually expand beyond Blake Crouch's original story to focus on the aftermath of the unleashing of the Box technology in season one, and the impact this has on the Dessen family amid a multiversal conflict.</p><p>Jason, as we know, is a little bit obsessed with the Box, which really will start break apart his family. Meanwhile, Daniela grows increasingly paranoid , which is fair, given alternate versions of her husband could show up at any moment. It's all about survival this season, with ten fresh episodes to sink your teeth into.</p><p>Ready for more? Here's <strong>how to watch "Dark Matter" season 2</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-dark-matter-season-2-on-apple-tv"><span>How to watch 'Dark Matter' season 2 on Apple TV+</span></h2><div class="product"><a data-dimension112="2c983ec4-a153-11f1-a74d-2b8b078d26ee" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Dark Matter" premieres on <a href="https://tv.apple.com/gb/show/dark-matter/umc.cmc.4luj45vtqpmjsvb6sc2675oeg" target="_blank" rel="nofollow" data-dimension112="2c983ec4-a153-11f1-a74d-2b8b078d26ee" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Friday, August 28, 2026. </strong>New episodes will land on the streamer each Friday from there onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a couple of episodes before deciding whether to carry on with the series and the service.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $12.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong></p></div><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><h2 class="article-body__section" id="section-watch-dark-matter-season-2-from-anywhere"><span>Watch 'Dark Matter' season 2 from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="2c98400e-a153-11f1-82ea-f79ce08e605b" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="2c98400e-a153-11f1-82ea-f79ce08e605b" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/gb/show/dark-matter/umc.cmc.4luj45vtqpmjsvb6sc2675oeg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Dark Matter" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="2c98400e-a153-11f1-82ea-f79ce08e605b" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-dark-matter-season-2-trailer"><span>'Dark Matter' season 2 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/zhB6_1UbR7s" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-dark-matter-season-2-cast"><span>'Dark Matter' season 2 cast</span></h2><ul><li><strong>Joel Edgerton</strong> as Jason Dessen</li><li><strong>Jennifer Connelly</strong> as Daniela Dessen</li><li><strong>Alice Braga</strong> as Amanda Lucas</li><li><strong>Jimmi Simpson</strong> as Ryan Holder</li><li><strong>Dayo Okeniyi</strong> as Leighton Vance</li><li><strong>Oakes Fegley</strong> as Charlie Dessen</li><li><strong>Amanda Brugel</strong> as Blair</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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear">How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' 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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/how-to-watch-dark-matter-season-2</link>
                                                                            <description>
                            <![CDATA[ Joel Edgerton and Jennifer Connelly return in this gripping Blake Crouch adaptation — here's how to watch "Dark Matter" season 2 online and from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LjFbyBTfqeAiW9chcvvWw9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EW7CYUFFxWvfxuCBTUzmxD-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 27 Aug 2026 18:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EW7CYUFFxWvfxuCBTUzmxD-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Joel Edgerton and Jennifer Connelly in promotional image for &quot;Dark Matter&quot; season 2]]></media:description>                                                            <media:text><![CDATA[Joel Edgerton and Jennifer Connelly in promotional image for &quot;Dark Matter&quot; season 2]]></media:text>
                                <media:title type="plain"><![CDATA[Joel Edgerton and Jennifer Connelly in promotional image for &quot;Dark Matter&quot; season 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EW7CYUFFxWvfxuCBTUzmxD-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Dark Matter" is the thrilling small screen adaptation of the popular Blake Crouch novel starring Joel Edgerton and Jennifer Connelly. Now they're back for more with a second season.</p><p>Below, we’ll show you how to watch "Dark Matter" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Dark Matter' S2 release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Dark Matter" season 2 premieres globally on Apple TV on <strong>Friday, August 28, 2026</strong>. New episodes then arrive weekly every Friday until the finale on October 30, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>The second season of "Dark Matter" will actually expand beyond Blake Crouch's original story to focus on the aftermath of the unleashing of the Box technology in season one, and the impact this has on the Dessen family amid a multiversal conflict.</p><p>Jason, as we know, is a little bit obsessed with the Box, which really will start break apart his family. Meanwhile, Daniela grows increasingly paranoid , which is fair, given alternate versions of her husband could show up at any moment. It's all about survival this season, with ten fresh episodes to sink your teeth into.</p><p>Ready for more? Here's <strong>how to watch "Dark Matter" season 2</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-dark-matter-season-2-on-apple-tv"><span>How to watch 'Dark Matter' season 2 on Apple TV+</span></h2><div class="product"><a data-dimension112="2c983ec4-a153-11f1-a74d-2b8b078d26ee" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Dark Matter" premieres on <a href="https://tv.apple.com/gb/show/dark-matter/umc.cmc.4luj45vtqpmjsvb6sc2675oeg" target="_blank" rel="nofollow" data-dimension112="2c983ec4-a153-11f1-a74d-2b8b078d26ee" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Friday, August 28, 2026. </strong>New episodes will land on the streamer each Friday from there onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a couple of episodes before deciding whether to carry on with the series and the service.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $12.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong></p></div><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><h2 class="article-body__section" id="section-watch-dark-matter-season-2-from-anywhere"><span>Watch 'Dark Matter' season 2 from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="2c98400e-a153-11f1-82ea-f79ce08e605b" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="2c98400e-a153-11f1-82ea-f79ce08e605b" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/gb/show/dark-matter/umc.cmc.4luj45vtqpmjsvb6sc2675oeg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Dark Matter" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="2c98400e-a153-11f1-82ea-f79ce08e605b" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-dark-matter-season-2-trailer"><span>'Dark Matter' season 2 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/zhB6_1UbR7s" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-dark-matter-season-2-cast"><span>'Dark Matter' season 2 cast</span></h2><ul><li><strong>Joel Edgerton</strong> as Jason Dessen</li><li><strong>Jennifer Connelly</strong> as Daniela Dessen</li><li><strong>Alice Braga</strong> as Amanda Lucas</li><li><strong>Jimmi Simpson</strong> as Ryan Holder</li><li><strong>Dayo Okeniyi</strong> as Leighton Vance</li><li><strong>Oakes Fegley</strong> as Charlie Dessen</li><li><strong>Amanda Brugel</strong> as Blair</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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear">How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' 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[ Everything new on Apple TV in September 2026: 'Slow Horses' season 6 and much more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As unfathomable as it seems, fall is right around the corner, and with the new season comes a fresh crop of new titles to the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">top streaming services</a>. And that certainly includes <strong>Apple TV</strong>, which will be adding to its extensive library with a quartet of buzzy films and returning series. </p><p>Things kick off on September 4 with <strong>"Mayday,"</strong> an action-adventure comedy starring Ryan Reynolds and Kenneth Branagh set in 1980s Soviet Russia. Next up is "Last Seen," a new thriller series from Down Under starring Patrick Brammall as a police dispatcher who receives a distress call from a young girl he believes to be his missing daughter. </p><p>Gary Oldman and Jack Lowden will both be back for <strong>"Slow Horses" season 6</strong>, which comes galloping onto the streamer on September 16 with even more spy-related hijinks. And the month ends on just as star-studded a note with <strong>"Brothers,"</strong> a parody comedy starring Matthew McConaughey and Woody Harrelson as fictionalized versions of themselves. </p><p>It's a delightfully stacked slate, so without further ado, here's everything coming to Apple TV in September 2026.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="39-mayday-39">'Mayday'</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/om5Un9X720M" allowfullscreen=""></iframe></div></div><p>Ryan Reynolds and Kenneth Branagh team up for “Mayday,” a Cold War-set comedy that "flips the spy thriller on its head," promises the streamer. The Jonathan Goldstein-directed action flick stars Reynolds as Troy "Assassin" Kelly, a US Air Force Pilot who is forced to eject from his aircraft during a top-secret mission into enemy territory in 1987 Soviet Russia. There, in the frozen Russian wilderness, he encounters Branagh's Nikolai Ustinov, a gruff ex-KGB carpenter who will surprisingly be his key to survival. Maria Bakalova, Marcin Dorociński, David Morse and Lovell Adams-Gray round out the cast. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/mayday/umc.cmc.shin43vzfoz3h4ggx41z8rf" target="_blank" rel="nofollow"><em><strong>"Mayday" on Apple TV</strong></em></a><em><strong> starting September 4</strong></em></p><h2 id="39-last-seen-39">'Last Seen'</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/M8nHySkLb64" allowfullscreen=""></iframe></div></div><p>You last saw Aussie actor Patrick Brammall fall for Anne Hathaway in "<a href="https://www.tomsguide.com/entertainment/movies/the-devil-wears-prada-2-review-anne-hathaway-and-meryl-streep-reunite-20-years-later-for-another-smash-hit">The Devil Wears Prada 2</a>," but his latest project is a far more harrowing affair. In this six-part adaptation of Ryan David Jahn's 2011 novel "The Dispatcher," Brammall stars as former detective Ian Ridley, whose life was upended over a decade earlier with the disappearance of his young daughter Maggie. These days, Ian works as a police dispatcher, answering calls from those in distress, including from a teenage girl that he could swear is his long-lost child. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/last-seen/umc.cmc.4pbw9c936a4pigdvsg23u2bsa" target="_blank" rel="nofollow"><em><strong>"Last Seen" on Apple TV</strong></em></a><em><strong> starting September 9</strong></em></p><h2 id="39-slow-horses-39-season-6">'Slow Horses' season 6</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mZbJxpYHLuI" allowfullscreen=""></iframe></div></div><p>The darkly funny espionage drama returns for season six, which based on the sixth and seventh books of Mick Herron’s Slough House series, with six episodes dropping weekly on Apple TV until October 21. Our favorite misfit agents, including Gary Oldman’s Jackson Lamb, and Jack Lowden’s River Cartwright, are also back and this time embroiled in a “fatally high-stakes game of retaliation and revenge” courtesy ruthless intelligence chief Diana Taverner (Kristina Scott Thomas). Alongside  those cast regulars comes the surprise return of Olivia Cooke as Sid Baker, who was seemingly shot in the head and killed all the way back in season one. She faked it, folks!</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><em><strong>"Slow Horses" season 6 on Apple TV</strong></em></a><em><strong> starting September 16</strong></em></p><h2 id="39-brothers-39">'Brothers'</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/fIKFnzIcfcA" allowfullscreen=""></iframe></div></div><p>If you’ve been keeping up with actors Matthew McConaughey and Woody Harrelson over the years, you might’ve heard the long-simmering rumors that the longtime pals might actually be related IRL. While the two stars have never publicly confirmed or taken a DNA test to prove the theory, they are certainly playing up the familial buzz with this eight-episode comedy series, in which the pair plays fictionalized versions of themselves. Created alongside David West Read and Lee Eisenberg, the show will explore how a decade-spanning bond is messily upturned by a long-buried secret that the two friends might actually be brothers. Holland Taylor, Natalie Martinez, Brittany Ishibashi and Dax Shepherd also appear. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/brothers/umc.cmc.17g1y5mzqp92sc0ge1c0hdorg" target="_blank" rel="nofollow"><em><strong>"Brothers" on Apple TV</strong></em></a><em><strong> starting September 23</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/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-just-gave-4k-upgrades-to-nearly-50-tv-shows-heres-the-full-list">Apple TV just gave 4K upgrades to nearly 50 TV shows: here's the full list</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-september-2026-slow-horses-season-6-and-much-more</link>
                                                                            <description>
                            <![CDATA[ Our guide to the new movies and shows coming to Apple TV in September 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3CKyQb6xuNSiy2EY8VQrre</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ge5qBpqJuJmWqDqq2eknYc-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 27 Aug 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE-320-70.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/ge5qBpqJuJmWqDqq2eknYc-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV Plus]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Gary Oldman as Jackson Lamb on the phone in Slow Horses season 4]]></media:description>                                                            <media:text><![CDATA[Gary Oldman as Jackson Lamb on the phone in Slow Horses season 4]]></media:text>
                                <media:title type="plain"><![CDATA[Gary Oldman as Jackson Lamb on the phone in Slow Horses season 4]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ge5qBpqJuJmWqDqq2eknYc-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As unfathomable as it seems, fall is right around the corner, and with the new season comes a fresh crop of new titles to the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">top streaming services</a>. And that certainly includes <strong>Apple TV</strong>, which will be adding to its extensive library with a quartet of buzzy films and returning series. </p><p>Things kick off on September 4 with <strong>"Mayday,"</strong> an action-adventure comedy starring Ryan Reynolds and Kenneth Branagh set in 1980s Soviet Russia. Next up is "Last Seen," a new thriller series from Down Under starring Patrick Brammall as a police dispatcher who receives a distress call from a young girl he believes to be his missing daughter. </p><p>Gary Oldman and Jack Lowden will both be back for <strong>"Slow Horses" season 6</strong>, which comes galloping onto the streamer on September 16 with even more spy-related hijinks. And the month ends on just as star-studded a note with <strong>"Brothers,"</strong> a parody comedy starring Matthew McConaughey and Woody Harrelson as fictionalized versions of themselves. </p><p>It's a delightfully stacked slate, so without further ado, here's everything coming to Apple TV in September 2026.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="39-mayday-39">'Mayday'</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/om5Un9X720M" allowfullscreen=""></iframe></div></div><p>Ryan Reynolds and Kenneth Branagh team up for “Mayday,” a Cold War-set comedy that "flips the spy thriller on its head," promises the streamer. The Jonathan Goldstein-directed action flick stars Reynolds as Troy "Assassin" Kelly, a US Air Force Pilot who is forced to eject from his aircraft during a top-secret mission into enemy territory in 1987 Soviet Russia. There, in the frozen Russian wilderness, he encounters Branagh's Nikolai Ustinov, a gruff ex-KGB carpenter who will surprisingly be his key to survival. Maria Bakalova, Marcin Dorociński, David Morse and Lovell Adams-Gray round out the cast. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/mayday/umc.cmc.shin43vzfoz3h4ggx41z8rf" target="_blank" rel="nofollow"><em><strong>"Mayday" on Apple TV</strong></em></a><em><strong> starting September 4</strong></em></p><h2 id="39-last-seen-39">'Last Seen'</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/M8nHySkLb64" allowfullscreen=""></iframe></div></div><p>You last saw Aussie actor Patrick Brammall fall for Anne Hathaway in "<a href="https://www.tomsguide.com/entertainment/movies/the-devil-wears-prada-2-review-anne-hathaway-and-meryl-streep-reunite-20-years-later-for-another-smash-hit">The Devil Wears Prada 2</a>," but his latest project is a far more harrowing affair. In this six-part adaptation of Ryan David Jahn's 2011 novel "The Dispatcher," Brammall stars as former detective Ian Ridley, whose life was upended over a decade earlier with the disappearance of his young daughter Maggie. These days, Ian works as a police dispatcher, answering calls from those in distress, including from a teenage girl that he could swear is his long-lost child. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/last-seen/umc.cmc.4pbw9c936a4pigdvsg23u2bsa" target="_blank" rel="nofollow"><em><strong>"Last Seen" on Apple TV</strong></em></a><em><strong> starting September 9</strong></em></p><h2 id="39-slow-horses-39-season-6">'Slow Horses' season 6</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mZbJxpYHLuI" allowfullscreen=""></iframe></div></div><p>The darkly funny espionage drama returns for season six, which based on the sixth and seventh books of Mick Herron’s Slough House series, with six episodes dropping weekly on Apple TV until October 21. Our favorite misfit agents, including Gary Oldman’s Jackson Lamb, and Jack Lowden’s River Cartwright, are also back and this time embroiled in a “fatally high-stakes game of retaliation and revenge” courtesy ruthless intelligence chief Diana Taverner (Kristina Scott Thomas). Alongside  those cast regulars comes the surprise return of Olivia Cooke as Sid Baker, who was seemingly shot in the head and killed all the way back in season one. She faked it, folks!</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><em><strong>"Slow Horses" season 6 on Apple TV</strong></em></a><em><strong> starting September 16</strong></em></p><h2 id="39-brothers-39">'Brothers'</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/fIKFnzIcfcA" allowfullscreen=""></iframe></div></div><p>If you’ve been keeping up with actors Matthew McConaughey and Woody Harrelson over the years, you might’ve heard the long-simmering rumors that the longtime pals might actually be related IRL. While the two stars have never publicly confirmed or taken a DNA test to prove the theory, they are certainly playing up the familial buzz with this eight-episode comedy series, in which the pair plays fictionalized versions of themselves. Created alongside David West Read and Lee Eisenberg, the show will explore how a decade-spanning bond is messily upturned by a long-buried secret that the two friends might actually be brothers. Holland Taylor, Natalie Martinez, Brittany Ishibashi and Dax Shepherd also appear. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/brothers/umc.cmc.17g1y5mzqp92sc0ge1c0hdorg" target="_blank" rel="nofollow"><em><strong>"Brothers" on Apple TV</strong></em></a><em><strong> starting September 23</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/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-just-gave-4k-upgrades-to-nearly-50-tv-shows-heres-the-full-list">Apple TV just gave 4K upgrades to nearly 50 TV shows: here's the full list</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple iPhone 18 event — all the new products expected to launch at the 'Surprise and shine' event ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Apple iPhone 18 event latest news and rumors</div><div class="fancy_box_body"><p class="fancy-box__body-text"><em><strong>Updated September 1</strong></em></p><p class="fancy-box__body-text">• <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-18-pro-max-unboxed-ahead-of-apple-event-these-could-be-the-final-designs">Unboxing video</a> gives us our best look at iPhone 18 Pro Max and Ultra<br />• Pre-order date may be delayed to <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-iphone-18-pro-pre-order-date-just-tipped-heres-when-you-can-get-yours">Saturday, September 12</a><br />• <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">"Surprise and shine"</a> event officially set for Wednesday, September 9</p></div></div><p>Apple's annual iPhone event has been <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">officially confirmed to take place on September 9</a>, and it could easily be the biggest Apple event in years. We're expecting a slew of new devices to be unveiled as John Ternus takes the reins as Apple's new CEO. </p><p>And all of that is before we discuss the launch of the long-rumored, much-hyped foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a> — Apple's first attempt at a <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">foldable phone</a>. It's not clear when the device will actually launch, but at the very least, its reveal is almost certainly right around the corner. </p><p>In all, Apple is expected to launch up to eight different devices, from the expected new iPhones and upgraded Apple Watches to several new smart home-focused products. </p><p>Here's what we expect to see at <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more?hasComeFromProof=true">Apple's 'Surprise and shine' September event</a>, and when it's kicking off</p><h2 id="when-is-the-iphone-18-event">When is the iPhone 18 event?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2066px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="fnjPCS2zVb2TZ4GCnuqwK5" name="Apple suprise and shine" alt="Apple fall event 2026." src="https://cdn.mos.cms.futurecdn.net/fnjPCS2zVb2TZ4GCnuqwK5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2066" height="1162" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has <strong>officially confirmed its "Surprise and shine" event will be held on Wednesday, September 9 at Apple Park</strong>. Although Apple normally holds its events on a Tuesday, the Labor Day weekend means it's being moved forward to Wednesday.</p><p>This has happened in the past, and the reasoning is that Apple doesn't want to ask attendees to travel on a holiday weekend. For example, the <a href="https://www.tomsguide.com/reviews/iphone-14">iPhone 14</a> launched on Wednesday, September 7, following Labor Day on Monday 5, and that'll likely be the case this year too.</p><p>The <strong>event is set to take place at 10am PT / 1pm ET / 6pm BST</strong> and will livestreamed on various social media platforms as well as Apple's own site.</p><p>iPhones usually go up for pre-order the Friday following the Apple event, but this year that's September 11. Bloomberg's Mark Gurman has reported that pre-orders will be <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-iphone-18-pro-pre-order-date-just-tipped-heres-when-you-can-get-yours">pushed to Saturday, September 12</a>.</p><p>This year's edition will be hosted by incoming CEO John Ternus, and it looks like his tenure will start with a bang.</p><h2 class="article-body__section" id="section-new-iphones"><span>New iPhones</span></h2><h3 id="iphone-18-pro-and-pro-max">iPhone 18 Pro and Pro Max</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UHNuNim9UYH2mmGNTn3S4V" name="Apple-iPhone 18 Pro-A20-Pro_LIST" alt="Apple iPhone 18 Pro and the A20 Pro chip" src="https://cdn.mos.cms.futurecdn.net/UHNuNim9UYH2mmGNTn3S4V-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple)</span></figcaption></figure><p>This year, Apple is expected to launch only its <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> models. The entry-level iPhone 18 and iPhone 18 Plus reportedly <a href="https://www.tomsguide.com/phones/iphones/iphone-18-release-schedule-could-be-changing-but-this-rumor-makes-no-sense">won't debut until next spring</a> alongside the iPhone 18e model.</p><p>The iPhone 18 Pro and iPhone 18 Pro Max are both tipped to feature Apple's new 2nm A20 Pro chip, a smaller Dynamic Island and Apple's new C2 modem. And both phones should get larger batteries.</p><p>However, the iPhone 18 Pro Max might have some exclusive upgrades, including a variable aperture camera and longer zoom. For more see our <a href="https://www.tomsguide.com/phones/iphones/3-big-reasons-to-buy-iphone-18-pro-max-over-the-iphone-18-pro-this-year">iPhone 18 Pro vs Pro Max</a> comparison.</p><p>Unforutnately, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-see-absolutely-massive-price-hike-according-to-researchers">analysts have predicted</a> that the new iPhone 18 Pros could cost between $200 and $350 higher than the iPhone 17 Pro family. </p><h3 id="iphone-ultra">iPhone Ultra</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aUJZxCfMMXC3m2nKLVB2dV" name="iPhone Fold final design 1" alt="iPhone Fold design" src="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Majin Bu on X)</span></figcaption></figure><p>The biggest announcement of the Apple event is sure to be the debut of the foldable iPhone Ultra.</p><p>Leaks have suggested that it will have more of a wider shape, similar to the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, with a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-specs-potentially-revealed-heres-how-it-would-stack-up-against-samsung-galaxy-z-fold-8">7.8-inch foldable display and a 5.5-inch cover screen</a>. It could measure between 4.5 and 4.8mm when unfolded, making it one of the thinnest iPhones ever.</p><p>It's rumored to sport a 4,883 mAh battery, the A20 Pro chipset, Apple's in-house C2 modem, and a Touch ID fingerprint scanner in the power button. The rear is expected to come with a pair of 48MP cameras, horizontally positioned like the back of the iPhone Air, alongside two separate 24MP selfie cameras — one for each screen.</p><p>Apple reportedly delayed releasing a folding iPhone until it could eliminate the crease in the display, but whether it's accomplished this remains to be seen. Even Samsung and Oppo, despite their long lead time, have only <a href="https://www.tomsguide.com/phones/samsung-phones/comparing-galaxy-z-fold-8-vs-oppo-find-n6-crease">had moderate success</a>.</p><p>One downside is that the iPhone Ultra could be very expensive, costing anywhere from <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">$2,000 to 2,500</a>. And a recent leak suggests that<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-leakers-reveal-new-details-around-release-and-extremely-limited-availability"> iPhone Ultra may not be immediately available, </a>with only "extremely limited" availability.</p><p>Just keep in mind that the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-trade-offs-the-biggest-things-youre-not-getting-versus-iphone-18-pro">iPhone Ultra could have a number of trade-offs</a> versus the iPhone 18 Pro, including the lack of a telephoto zoom.</p><h2 class="article-body__section" id="section-airpods-ultra"><span>AirPods Ultra</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:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kXLZ6v6RAcuyoeV3PftvHP" name="AirPods Pro" alt="AirPods Pro" src="https://cdn.mos.cms.futurecdn.net/kXLZ6v6RAcuyoeV3PftvHP-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Regan Coule/Tom's Guide)</span></figcaption></figure><p>These ones are a little surprising as based on a <a href="https://www.tomsguide.com/audio/airpods/gurman-ai-airpods-with-cameras-just-tipped-for-2027-launch-in-flurry-of-new-releases">previous Gurman report</a>, we weren't expecting the AirPods Ultra until 2027 at the earliest. However,<a href="https://www.youtube.com/watch?v=wbBy1KXj5aM" target="_blank"> rumor aggregator AppleTrack</a> just reported this week that the Ultra version of AirPods will launch at the iPhone event. </p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2089522745184760112"><p lang="en" dir="ltr">Here is your first look at AirPods with Cameras in action using Visual Intelligence.This video file came from macOS 26.7 RC pic.twitter.com/yo7RI4MCeu<a href="https://twitter.com/cantworkitout/status/2089522745184760112">August 18, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>The big change with these headphones is they will allegedly<a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-with-cameras-are-nearly-ready-heres-4-features-you-need-to-know"> feature a camera</a> that will feed into Siri to allow it to "see" the world. </p><p>It would utilize a version of Visual Intelligence to let you ask Siri questions about your surroundings or get turn-by-turn directions from the more <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">powerful AI Siri </a>releasing this fall.</p><p>The <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-with-cameras-just-appeared-in-leaked-video-and-the-privacy-debate-has-already-started?hasComeFromProof=true">AirPods Ultra has also just appeared in a leaked video</a> buried within the macOS Tahoe 26.7 release candidate, and it shows how they'll help you identify objects in the real world. </p><h2 class="article-body__section" id="section-apple-watch-12-and-apple-watch-ultra-4"><span>Apple Watch 12 and Apple Watch Ultra 4</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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LPjRVZraPvxRyivUNsMQaG" name="Apple Watch Series 11" alt="Apple Watch Series 11" src="https://cdn.mos.cms.futurecdn.net/LPjRVZraPvxRyivUNsMQaG-1920-80.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>Unlike the iPhones, we know a bit less about the next Apple Watches. We are expecting two new models in the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch Series 12</a> and the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-these-are-the-upgrades-apple-needs-to-make-to-remain-the-smartwatch-king">Apple Watch Ultra 4</a>.</p><p>The leaks have been sparse, but Apple is reportedly not bringing many upgrades this year. The biggest change might be a <a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">new kind of band attachment</a>. This does mean that your old bands might not be compatible with the new watches.</p><p>Reportedly, Apple could <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">offer a ceramic case option</a> for the first time in years. It should also sport new health and fitness-related upgrades. We already know that <a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year#section-watchos-27-new-health-and-fitness-features">watchOS 27</a> will bring new AI features, an updated Workout Buddy and more useful data tracking. Plus, it should feature better integration with the upgraded Siri AI which we've already seen in 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 beta</a>.</p><h2 class="article-body__section" id="section-smart-home"><span>Smart Home</span></h2><p>Apple's smart home ambitions and the rumors surrounding them need to be taken with a massive grain of salt. Leaks have suggested Apple is planning on introducing a suite of smart home devices starting with a revamped HomePod and an AI-powered Apple TV 4K streaming device. </p><p>Those rumors have existed for more than two years and largely feed into the company's promises around the AI-powered Siri.</p><p>However, this year with iOS 27, Apple may finally have the chatbot that was promised. If it actually releases and works as pitched, this year could actually be the start of Apple Home. </p><h3 id="homepod-home-hub-2">HomePod Home hub</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Maj5caC4eG4rJYyquwrf3L" name="HomePod with screen edit" alt="HomePod with display concept render" src="https://cdn.mos.cms.futurecdn.net/Maj5caC4eG4rJYyquwrf3L-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Yanko Design)</span></figcaption></figure><p>Bloomberg's Mark Gurman, long a reporter of the rumored HomePod updates, <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">believes </a>that a new <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod mini</a> could launch this September alongside the rumored HomePod Home hub.</p><p>Several different iterations of this device have been rumored, including one with a <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">$1,000 robot arm</a>. The most common version involves a <a href="https://www.tomsguide.com/home/smart-home/apple-tipped-to-launch-ai-wall-tablet-to-control-your-home-in-march-2025-everything-we-know-so-far">wall-mounted touchpad</a> or a HomePod speaker with a touch display about the size of an iPad mini. </p><p>This device would have a FaceTime camera for video calls and presence sensors to initiate smart home routines. </p><h3 id="homepod-mini-2-3">HomePod mini 2</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qzn6VBsNWsuQVgzKVVPvhA" name="Apple HomePod mini midnight.jpg" alt="Apple HomePod mini in midnight color" src="https://cdn.mos.cms.futurecdn.net/qzn6VBsNWsuQVgzKVVPvhA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>A  <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">new HomePod mini</a> might also debut, but it might not be as big of an upgrade as the Hub. Most rumors suggest that it will feature a new chip and audio improvements.</p><p>To be clear, this one feels even more far-fetched than the Hub; the HomePod mini 2 has been on our <a href="https://www.tomsguide.com/news/hoping-for-a-homepod-mini-2-to-go-with-the-new-homepod-dont-hold-your-breath">rumor radar since at least 2023</a>. The current version debuted in 2020, and like the next device, is long overdue for an update.</p><h3 id="apple-tv-4k-2026-2">Apple TV 4K 2026</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="ueDcVd52GdTw3wgnvCuAkU" name="Google TV Streamer vs Apple TV 4K-3" alt="Google TV Streamer vs Apple TV 4K" src="https://cdn.mos.cms.futurecdn.net/ueDcVd52GdTw3wgnvCuAkU-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2156" 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>Like the HomePod series, Apple hasn't released a new version of the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a> since 2022. We're long overdue for an upgrade — even if it's only a more powerful chip for stronger performance. </p><p>Previously, it was suggested that a new Apple TV could feature <a href="https://www.tomsguide.com/entertainment/streaming-devices/new-apple-tv-4k-biggest-upgrades-just-leaked-ahead-of-launch">the A17 Pro chip</a>, but it's more likely it'll get the new A20 or, to save some money, last year's A19. The device should also get the <a href="https://www.tomsguide.com/phones/iphones/new-iphone-18-pro-chips-camera-upgrades-and-more-leaked-by-analyst-heres-what-we-know">rumored N2 chip </a>for better Wi-Fi and Bluetooth connectivity. </p><p>Outside of chips, the big upgrade would be Siri AI, which could let you connect the Apple TV as a hub for smart devices. One rumor suggested that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps:/www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera,</a> which would allow for FaceTime calls and gesture-based controls.</p><p>Will you be tuning in to Apple's event next month? Let me know which device you're most hyped for in the comments.</p><h2 class="article-body__section" id="section-what-we-don-t-expect-to-see"><span>What we don't expect to see</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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aRTWJedXhSdn4zKRv2Rn9e" name="Apple iPhone 17 review" alt="Apple iPhone 17 review." src="https://cdn.mos.cms.futurecdn.net/aRTWJedXhSdn4zKRv2Rn9e-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Even with a huge event like this, there are still going to be devices that <a href="https://www.tomsguide.com/phones/iphones/apples-iphone-18-pro-launch-event-is-coming-but-dont-expect-these-5-products-to-appear">won't make an appearance</a>. Due to staggered release schedules and supply-chain timing, Apple is spreading its hardware roadmap across multiple release windows over the next year. As a result, the following devices are unlikely to make any sort of appearance at the event.</p><ul><li><strong>iPhone 18:</strong> Apple is reportedly holding back the base model until early 2027 to drive early demand toward the Pro models.</li><li><strong>AirPods Ultra:</strong> Rumored AirPods with cameras for Siri AI context are reportedly delayed until 2027 due to software and supply-chain bottlenecks.</li><li><strong>New Macs:</strong> Upgraded M6 MacBooks and touchscreen models are typically saved for dedicated computing announcements in October or later.</li><li><strong>OLED iPad mini:</strong> The next refresh of the compact tablet is slated for an October arrival rather than competing for stage time with the new iPhones.</li><li><strong>Apple Watch SE (4th gen):</strong> The entry-level wearable update will sit out this event, with Apple likely to focus on the Series 12 and Ultra 4 instead.</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/phones/iphones/iphone-ultra-leakers-reveal-new-details-around-release-and-extremely-limited-availability">iPhone Ultra leakers reveal new details around release and 'extremely limited' availability</a></li><li><a href="https://www.tomsguide.com/phones/the-5-accessories-that-transformed-my-iphone-17-pro-max-for-under-usd50">The 5 accessories that transformed my iPhone 17 Pro Max for under $50</a></li><li><a href="https://www.tomsguide.com/news/ultimate-back-to-school-guide">Ultimate back to school guide 2026: Laptops, Chromebooks, headphones and more</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/apple-iphone-18-event-all-the-new-products-expected-to-launch-in-september</link>
                                                                            <description>
                            <![CDATA[ Apple could have at least eight new products to announce on September 9, from iPhone and watches to new smart home devices. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MjZS5SyhQTwebwf4QfXhvK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XK7W9gHWEgHPdh5kir8n9-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 18 Aug 2026 09:03:20 +0000</pubDate>                                                                                                                                <updated>Tue, 08 Sep 2026 09:15:33 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Smart Home]]></category>
                                                    <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Airpods]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Headphones]]></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-320-70.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;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Tom Pritchard ]]></dc:contributor>
                                                                    <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/XK7W9gHWEgHPdh5kir8n9-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[John Ternus and Tim Cook]]></media:description>                                                            <media:text><![CDATA[John Ternus and Tim Cook]]></media:text>
                                <media:title type="plain"><![CDATA[John Ternus and Tim Cook]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XK7W9gHWEgHPdh5kir8n9-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Apple iPhone 18 event latest news and rumors</div><div class="fancy_box_body"><p class="fancy-box__body-text"><em><strong>Updated September 1</strong></em></p><p class="fancy-box__body-text">• <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-18-pro-max-unboxed-ahead-of-apple-event-these-could-be-the-final-designs">Unboxing video</a> gives us our best look at iPhone 18 Pro Max and Ultra<br />• Pre-order date may be delayed to <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-iphone-18-pro-pre-order-date-just-tipped-heres-when-you-can-get-yours">Saturday, September 12</a><br />• <a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">"Surprise and shine"</a> event officially set for Wednesday, September 9</p></div></div><p>Apple's annual iPhone event has been <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">officially confirmed to take place on September 9</a>, and it could easily be the biggest Apple event in years. We're expecting a slew of new devices to be unveiled as John Ternus takes the reins as Apple's new CEO. </p><p>And all of that is before we discuss the launch of the long-rumored, much-hyped foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a> — Apple's first attempt at a <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">foldable phone</a>. It's not clear when the device will actually launch, but at the very least, its reveal is almost certainly right around the corner. </p><p>In all, Apple is expected to launch up to eight different devices, from the expected new iPhones and upgraded Apple Watches to several new smart home-focused products. </p><p>Here's what we expect to see at <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more?hasComeFromProof=true">Apple's 'Surprise and shine' September event</a>, and when it's kicking off</p><h2 id="when-is-the-iphone-18-event">When is the iPhone 18 event?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2066px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="fnjPCS2zVb2TZ4GCnuqwK5" name="Apple suprise and shine" alt="Apple fall event 2026." src="https://cdn.mos.cms.futurecdn.net/fnjPCS2zVb2TZ4GCnuqwK5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2066" height="1162" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has <strong>officially confirmed its "Surprise and shine" event will be held on Wednesday, September 9 at Apple Park</strong>. Although Apple normally holds its events on a Tuesday, the Labor Day weekend means it's being moved forward to Wednesday.</p><p>This has happened in the past, and the reasoning is that Apple doesn't want to ask attendees to travel on a holiday weekend. For example, the <a href="https://www.tomsguide.com/reviews/iphone-14">iPhone 14</a> launched on Wednesday, September 7, following Labor Day on Monday 5, and that'll likely be the case this year too.</p><p>The <strong>event is set to take place at 10am PT / 1pm ET / 6pm BST</strong> and will livestreamed on various social media platforms as well as Apple's own site.</p><p>iPhones usually go up for pre-order the Friday following the Apple event, but this year that's September 11. Bloomberg's Mark Gurman has reported that pre-orders will be <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-and-iphone-18-pro-pre-order-date-just-tipped-heres-when-you-can-get-yours">pushed to Saturday, September 12</a>.</p><p>This year's edition will be hosted by incoming CEO John Ternus, and it looks like his tenure will start with a bang.</p><h2 class="article-body__section" id="section-new-iphones"><span>New iPhones</span></h2><h3 id="iphone-18-pro-and-pro-max">iPhone 18 Pro and Pro Max</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UHNuNim9UYH2mmGNTn3S4V" name="Apple-iPhone 18 Pro-A20-Pro_LIST" alt="Apple iPhone 18 Pro and the A20 Pro chip" src="https://cdn.mos.cms.futurecdn.net/UHNuNim9UYH2mmGNTn3S4V-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple)</span></figcaption></figure><p>This year, Apple is expected to launch only its <a href="https://www.tomsguide.com/phones/iphones/iphone-18-rumors-everything-we-know-so-far">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> models. The entry-level iPhone 18 and iPhone 18 Plus reportedly <a href="https://www.tomsguide.com/phones/iphones/iphone-18-release-schedule-could-be-changing-but-this-rumor-makes-no-sense">won't debut until next spring</a> alongside the iPhone 18e model.</p><p>The iPhone 18 Pro and iPhone 18 Pro Max are both tipped to feature Apple's new 2nm A20 Pro chip, a smaller Dynamic Island and Apple's new C2 modem. And both phones should get larger batteries.</p><p>However, the iPhone 18 Pro Max might have some exclusive upgrades, including a variable aperture camera and longer zoom. For more see our <a href="https://www.tomsguide.com/phones/iphones/3-big-reasons-to-buy-iphone-18-pro-max-over-the-iphone-18-pro-this-year">iPhone 18 Pro vs Pro Max</a> comparison.</p><p>Unforutnately, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-could-see-absolutely-massive-price-hike-according-to-researchers">analysts have predicted</a> that the new iPhone 18 Pros could cost between $200 and $350 higher than the iPhone 17 Pro family. </p><h3 id="iphone-ultra">iPhone Ultra</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aUJZxCfMMXC3m2nKLVB2dV" name="iPhone Fold final design 1" alt="iPhone Fold design" src="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Majin Bu on X)</span></figcaption></figure><p>The biggest announcement of the Apple event is sure to be the debut of the foldable iPhone Ultra.</p><p>Leaks have suggested that it will have more of a wider shape, similar to the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, with a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-specs-potentially-revealed-heres-how-it-would-stack-up-against-samsung-galaxy-z-fold-8">7.8-inch foldable display and a 5.5-inch cover screen</a>. It could measure between 4.5 and 4.8mm when unfolded, making it one of the thinnest iPhones ever.</p><p>It's rumored to sport a 4,883 mAh battery, the A20 Pro chipset, Apple's in-house C2 modem, and a Touch ID fingerprint scanner in the power button. The rear is expected to come with a pair of 48MP cameras, horizontally positioned like the back of the iPhone Air, alongside two separate 24MP selfie cameras — one for each screen.</p><p>Apple reportedly delayed releasing a folding iPhone until it could eliminate the crease in the display, but whether it's accomplished this remains to be seen. Even Samsung and Oppo, despite their long lead time, have only <a href="https://www.tomsguide.com/phones/samsung-phones/comparing-galaxy-z-fold-8-vs-oppo-find-n6-crease">had moderate success</a>.</p><p>One downside is that the iPhone Ultra could be very expensive, costing anywhere from <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">$2,000 to 2,500</a>. And a recent leak suggests that<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-leakers-reveal-new-details-around-release-and-extremely-limited-availability"> iPhone Ultra may not be immediately available, </a>with only "extremely limited" availability.</p><p>Just keep in mind that the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-trade-offs-the-biggest-things-youre-not-getting-versus-iphone-18-pro">iPhone Ultra could have a number of trade-offs</a> versus the iPhone 18 Pro, including the lack of a telephoto zoom.</p><h2 class="article-body__section" id="section-airpods-ultra"><span>AirPods Ultra</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:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kXLZ6v6RAcuyoeV3PftvHP" name="AirPods Pro" alt="AirPods Pro" src="https://cdn.mos.cms.futurecdn.net/kXLZ6v6RAcuyoeV3PftvHP-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Regan Coule/Tom's Guide)</span></figcaption></figure><p>These ones are a little surprising as based on a <a href="https://www.tomsguide.com/audio/airpods/gurman-ai-airpods-with-cameras-just-tipped-for-2027-launch-in-flurry-of-new-releases">previous Gurman report</a>, we weren't expecting the AirPods Ultra until 2027 at the earliest. However,<a href="https://www.youtube.com/watch?v=wbBy1KXj5aM" target="_blank"> rumor aggregator AppleTrack</a> just reported this week that the Ultra version of AirPods will launch at the iPhone event. </p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2089522745184760112"><p lang="en" dir="ltr">Here is your first look at AirPods with Cameras in action using Visual Intelligence.This video file came from macOS 26.7 RC pic.twitter.com/yo7RI4MCeu<a href="https://twitter.com/cantworkitout/status/2089522745184760112">August 18, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>The big change with these headphones is they will allegedly<a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-with-cameras-are-nearly-ready-heres-4-features-you-need-to-know"> feature a camera</a> that will feed into Siri to allow it to "see" the world. </p><p>It would utilize a version of Visual Intelligence to let you ask Siri questions about your surroundings or get turn-by-turn directions from the more <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">powerful AI Siri </a>releasing this fall.</p><p>The <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-with-cameras-just-appeared-in-leaked-video-and-the-privacy-debate-has-already-started?hasComeFromProof=true">AirPods Ultra has also just appeared in a leaked video</a> buried within the macOS Tahoe 26.7 release candidate, and it shows how they'll help you identify objects in the real world. </p><h2 class="article-body__section" id="section-apple-watch-12-and-apple-watch-ultra-4"><span>Apple Watch 12 and Apple Watch Ultra 4</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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LPjRVZraPvxRyivUNsMQaG" name="Apple Watch Series 11" alt="Apple Watch Series 11" src="https://cdn.mos.cms.futurecdn.net/LPjRVZraPvxRyivUNsMQaG-1920-80.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>Unlike the iPhones, we know a bit less about the next Apple Watches. We are expecting two new models in the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch Series 12</a> and the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-these-are-the-upgrades-apple-needs-to-make-to-remain-the-smartwatch-king">Apple Watch Ultra 4</a>.</p><p>The leaks have been sparse, but Apple is reportedly not bringing many upgrades this year. The biggest change might be a <a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">new kind of band attachment</a>. This does mean that your old bands might not be compatible with the new watches.</p><p>Reportedly, Apple could <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">offer a ceramic case option</a> for the first time in years. It should also sport new health and fitness-related upgrades. We already know that <a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year#section-watchos-27-new-health-and-fitness-features">watchOS 27</a> will bring new AI features, an updated Workout Buddy and more useful data tracking. Plus, it should feature better integration with the upgraded Siri AI which we've already seen in 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 beta</a>.</p><h2 class="article-body__section" id="section-smart-home"><span>Smart Home</span></h2><p>Apple's smart home ambitions and the rumors surrounding them need to be taken with a massive grain of salt. Leaks have suggested Apple is planning on introducing a suite of smart home devices starting with a revamped HomePod and an AI-powered Apple TV 4K streaming device. </p><p>Those rumors have existed for more than two years and largely feed into the company's promises around the AI-powered Siri.</p><p>However, this year with iOS 27, Apple may finally have the chatbot that was promised. If it actually releases and works as pitched, this year could actually be the start of Apple Home. </p><h3 id="homepod-home-hub-2">HomePod Home hub</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Maj5caC4eG4rJYyquwrf3L" name="HomePod with screen edit" alt="HomePod with display concept render" src="https://cdn.mos.cms.futurecdn.net/Maj5caC4eG4rJYyquwrf3L-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Yanko Design)</span></figcaption></figure><p>Bloomberg's Mark Gurman, long a reporter of the rumored HomePod updates, <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">believes </a>that a new <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod mini</a> could launch this September alongside the rumored HomePod Home hub.</p><p>Several different iterations of this device have been rumored, including one with a <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">$1,000 robot arm</a>. The most common version involves a <a href="https://www.tomsguide.com/home/smart-home/apple-tipped-to-launch-ai-wall-tablet-to-control-your-home-in-march-2025-everything-we-know-so-far">wall-mounted touchpad</a> or a HomePod speaker with a touch display about the size of an iPad mini. </p><p>This device would have a FaceTime camera for video calls and presence sensors to initiate smart home routines. </p><h3 id="homepod-mini-2-3">HomePod mini 2</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qzn6VBsNWsuQVgzKVVPvhA" name="Apple HomePod mini midnight.jpg" alt="Apple HomePod mini in midnight color" src="https://cdn.mos.cms.futurecdn.net/qzn6VBsNWsuQVgzKVVPvhA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>A  <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">new HomePod mini</a> might also debut, but it might not be as big of an upgrade as the Hub. Most rumors suggest that it will feature a new chip and audio improvements.</p><p>To be clear, this one feels even more far-fetched than the Hub; the HomePod mini 2 has been on our <a href="https://www.tomsguide.com/news/hoping-for-a-homepod-mini-2-to-go-with-the-new-homepod-dont-hold-your-breath">rumor radar since at least 2023</a>. The current version debuted in 2020, and like the next device, is long overdue for an update.</p><h3 id="apple-tv-4k-2026-2">Apple TV 4K 2026</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="ueDcVd52GdTw3wgnvCuAkU" name="Google TV Streamer vs Apple TV 4K-3" alt="Google TV Streamer vs Apple TV 4K" src="https://cdn.mos.cms.futurecdn.net/ueDcVd52GdTw3wgnvCuAkU-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2156" 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>Like the HomePod series, Apple hasn't released a new version of the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a> since 2022. We're long overdue for an upgrade — even if it's only a more powerful chip for stronger performance. </p><p>Previously, it was suggested that a new Apple TV could feature <a href="https://www.tomsguide.com/entertainment/streaming-devices/new-apple-tv-4k-biggest-upgrades-just-leaked-ahead-of-launch">the A17 Pro chip</a>, but it's more likely it'll get the new A20 or, to save some money, last year's A19. The device should also get the <a href="https://www.tomsguide.com/phones/iphones/new-iphone-18-pro-chips-camera-upgrades-and-more-leaked-by-analyst-heres-what-we-know">rumored N2 chip </a>for better Wi-Fi and Bluetooth connectivity. </p><p>Outside of chips, the big upgrade would be Siri AI, which could let you connect the Apple TV as a hub for smart devices. One rumor suggested that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps:/www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera,</a> which would allow for FaceTime calls and gesture-based controls.</p><p>Will you be tuning in to Apple's event next month? Let me know which device you're most hyped for in the comments.</p><h2 class="article-body__section" id="section-what-we-don-t-expect-to-see"><span>What we don't expect to see</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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aRTWJedXhSdn4zKRv2Rn9e" name="Apple iPhone 17 review" alt="Apple iPhone 17 review." src="https://cdn.mos.cms.futurecdn.net/aRTWJedXhSdn4zKRv2Rn9e-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Even with a huge event like this, there are still going to be devices that <a href="https://www.tomsguide.com/phones/iphones/apples-iphone-18-pro-launch-event-is-coming-but-dont-expect-these-5-products-to-appear">won't make an appearance</a>. Due to staggered release schedules and supply-chain timing, Apple is spreading its hardware roadmap across multiple release windows over the next year. As a result, the following devices are unlikely to make any sort of appearance at the event.</p><ul><li><strong>iPhone 18:</strong> Apple is reportedly holding back the base model until early 2027 to drive early demand toward the Pro models.</li><li><strong>AirPods Ultra:</strong> Rumored AirPods with cameras for Siri AI context are reportedly delayed until 2027 due to software and supply-chain bottlenecks.</li><li><strong>New Macs:</strong> Upgraded M6 MacBooks and touchscreen models are typically saved for dedicated computing announcements in October or later.</li><li><strong>OLED iPad mini:</strong> The next refresh of the compact tablet is slated for an October arrival rather than competing for stage time with the new iPhones.</li><li><strong>Apple Watch SE (4th gen):</strong> The entry-level wearable update will sit out this event, with Apple likely to focus on the Series 12 and Ultra 4 instead.</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/phones/iphones/iphone-ultra-leakers-reveal-new-details-around-release-and-extremely-limited-availability">iPhone Ultra leakers reveal new details around release and 'extremely limited' availability</a></li><li><a href="https://www.tomsguide.com/phones/the-5-accessories-that-transformed-my-iphone-17-pro-max-for-under-usd50">The 5 accessories that transformed my iPhone 17 Pro Max for under $50</a></li><li><a href="https://www.tomsguide.com/news/ultimate-back-to-school-guide">Ultimate back to school guide 2026: Laptops, Chromebooks, headphones and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ If you loved 'Once,' don't miss the director's forgotten masterpiece hiding on Apple TV ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We love a big razzle-dazzle <a href="https://www.tomsguide.com/entertainment/streaming/7-best-movie-musicals-of-all-time-ranked">movie musical</a> — your "Chicago," your "Wicked," your "Greatest Showman" and whatnot. But sometimes we're in the mood for a quieter, more intimate number, the kind of nontraditional big-screen musical where characters write, play and sing songs that are organically woven into the drama of the film, rather than spontaneously burst out in polished vocals and choreographed dances. </p><p><strong>Director John Carney</strong> is a master of that kind of musical-dramedy. The Irish filmmaker is behind such genre favorites as 2007's <strong>"Once"</strong> (the Oscar-winning two-hander between Markéta Irglová and the late Glen Hansard) and 2013's "<a href="https://www.tomsguide.com/entertainment/movies/i-just-found-the-one-heartwarming-movie-ill-be-watching-every-new-years-eve">Begin Again</a>" (a New York-set musical romance between Keira Knightley and Mark Ruffalo).</p><p>Carney's 2023 follow-up <strong>"Flora and Son,"</strong> which he wrote, directed, produced and composed, is far less well-known than those two titles but equally engrossing, with a winning lead performance by Irish actress Eve Hewson (who basically has music in her blood; she's Bono's daughter, after all). An Apple Original, the musical film is streaming now on <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>; here's why you should add it to your watchlist. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="what-is-flora-and-son-about">What is 'Flora and Son' about?</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/beNTTHnMIy8" allowfullscreen=""></iframe></div></div><p>The 2023 indie centers on the titular Flora (Eve Hewson), a single, working-class mother living in Dublin with her 14-year-old son Max (Orén Kinlan), who has developed a frustrating penchant for acting up. </p><p>Desperate for a way to connect with the teen and keep him out of trouble, Flora rescues a beat-up acoustic guitar from the trash and offers it up to her son as a creative outlet. (The premise was reportedly plucked directly from John Carney's own upbringing.)</p><p>Max is less than inspired by the idea, but Flora decides to learn how to play the instrument herself and bring some much-needed harmony to her own life with the help of a washed-up Los Angeles musician named Jeff, played by Joseph Gordon-Levitt. Jack Reynor, Orén Kinlan, Don Wycherley and Kelly Thornton round out the small ensemble.</p><h2 id="why-i-recommend-you-stream-flora-and-son">Why I recommend you stream 'Flora and Son'</h2><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="As2RQBDdjTwZiUbAe8onxh" name="Eve Hewson and Joseph Gordon-Levitt in Flora and Son" alt="Eve Hewson and Joseph Gordon-Levitt in Flora and Son" src="https://cdn.mos.cms.futurecdn.net/As2RQBDdjTwZiUbAe8onxh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Given that "Flora and Son" only saw a limited theatrical release in the U.S. back in 2023, you might have missed the heartwarming little flick when it first premiered, but that's the beauty of a <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> like Apple TV. Like discovering an old song you've never heard before, you can unearth hidden-gem movies long after they've departed theaters. </p><p>And this music-fueled crowd-pleaser is certainly a hidden gem, with its relatable take on the messiness of motherhood; the realistic, lived-in chemistry between its characters; and the rousing way it presents music as a transformative tool for both personal growth and emotional connection. And beyond all that, the songs — including original works co-written and co-composed by John Carney and Gary Clark — are as fun to bop along to as they are crucial to the story. </p><p>"Known for 'Sing Street,' 'Once,' and 'Begin Again,' Carney is a master of telling the stories of artists in all their angst and failure and resilience," writes Jillian Manning for <a href="https://www.northernexpress.com/news/feature/film-review-flora-and-son/#:~:text=(In%20fact%2C%20Flora%20and%20Son,angst%20and%20failure%20and%20resilience." target="_blank">The Northern Express</a>, adding: "Carney’s dramas also have quite stunning soundtracks, and watching Flora, Jeff, and Max inch closer together through their various musical passions is the true highlight of Flora and Son."</p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/movie/flora-and-son/umc.cmc.1ol2idv8q2iftiyjfkuyfki5l" target="_blank" rel="nofollow"><em><strong>"Flora and Son" on Apple TV</strong></em></a><em><strong> now</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/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-august-2026-ted-lasso-season-4-and-much-more">Everything new on Apple TV in August 2026: 'Ted Lasso' season 4 and much more</a></li><li><a href="https://www.tomsguide.com/entertainment/hulu/my-heart-broke-when-this-musical-comedy-show-was-canceled-but-at-least-its-streaming-on-hulu">My heart broke when this musical comedy show was canceled — but at least it’s streaming on Hulu</a></li></ul><div data-model-name="Apple TV,Hulu,Netflix,Peacock TV,Paramount Plus,Disney Plus" data-widget-type="multimodelreview" data-widget-title="Today's best streaming deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/if-you-loved-once-dont-miss-the-directors-forgotten-masterpiece-hiding-on-apple-tv</link>
                                                                            <description>
                            <![CDATA[ If you liked "Once" and "Begin Again," you'll love "Flora and Son," a song-filled Irish charmer streaming now on Apple TV ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">trVv3WEi6Bg9aEEBiYexiQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nMot9iSSrUJwFbCLrBXSxT-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 09 Aug 2026 09:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE-320-70.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/nMot9iSSrUJwFbCLrBXSxT-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Eve Hewson and Oren Kinlan in Flora and Son]]></media:description>                                                            <media:text><![CDATA[Eve Hewson and Oren Kinlan in Flora and Son]]></media:text>
                                <media:title type="plain"><![CDATA[Eve Hewson and Oren Kinlan in Flora and Son]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nMot9iSSrUJwFbCLrBXSxT-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We love a big razzle-dazzle <a href="https://www.tomsguide.com/entertainment/streaming/7-best-movie-musicals-of-all-time-ranked">movie musical</a> — your "Chicago," your "Wicked," your "Greatest Showman" and whatnot. But sometimes we're in the mood for a quieter, more intimate number, the kind of nontraditional big-screen musical where characters write, play and sing songs that are organically woven into the drama of the film, rather than spontaneously burst out in polished vocals and choreographed dances. </p><p><strong>Director John Carney</strong> is a master of that kind of musical-dramedy. The Irish filmmaker is behind such genre favorites as 2007's <strong>"Once"</strong> (the Oscar-winning two-hander between Markéta Irglová and the late Glen Hansard) and 2013's "<a href="https://www.tomsguide.com/entertainment/movies/i-just-found-the-one-heartwarming-movie-ill-be-watching-every-new-years-eve">Begin Again</a>" (a New York-set musical romance between Keira Knightley and Mark Ruffalo).</p><p>Carney's 2023 follow-up <strong>"Flora and Son,"</strong> which he wrote, directed, produced and composed, is far less well-known than those two titles but equally engrossing, with a winning lead performance by Irish actress Eve Hewson (who basically has music in her blood; she's Bono's daughter, after all). An Apple Original, the musical film is streaming now on <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>; here's why you should add it to your watchlist. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="what-is-flora-and-son-about">What is 'Flora and Son' about?</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/beNTTHnMIy8" allowfullscreen=""></iframe></div></div><p>The 2023 indie centers on the titular Flora (Eve Hewson), a single, working-class mother living in Dublin with her 14-year-old son Max (Orén Kinlan), who has developed a frustrating penchant for acting up. </p><p>Desperate for a way to connect with the teen and keep him out of trouble, Flora rescues a beat-up acoustic guitar from the trash and offers it up to her son as a creative outlet. (The premise was reportedly plucked directly from John Carney's own upbringing.)</p><p>Max is less than inspired by the idea, but Flora decides to learn how to play the instrument herself and bring some much-needed harmony to her own life with the help of a washed-up Los Angeles musician named Jeff, played by Joseph Gordon-Levitt. Jack Reynor, Orén Kinlan, Don Wycherley and Kelly Thornton round out the small ensemble.</p><h2 id="why-i-recommend-you-stream-flora-and-son">Why I recommend you stream 'Flora and Son'</h2><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="As2RQBDdjTwZiUbAe8onxh" name="Eve Hewson and Joseph Gordon-Levitt in Flora and Son" alt="Eve Hewson and Joseph Gordon-Levitt in Flora and Son" src="https://cdn.mos.cms.futurecdn.net/As2RQBDdjTwZiUbAe8onxh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Given that "Flora and Son" only saw a limited theatrical release in the U.S. back in 2023, you might have missed the heartwarming little flick when it first premiered, but that's the beauty of a <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> like Apple TV. Like discovering an old song you've never heard before, you can unearth hidden-gem movies long after they've departed theaters. </p><p>And this music-fueled crowd-pleaser is certainly a hidden gem, with its relatable take on the messiness of motherhood; the realistic, lived-in chemistry between its characters; and the rousing way it presents music as a transformative tool for both personal growth and emotional connection. And beyond all that, the songs — including original works co-written and co-composed by John Carney and Gary Clark — are as fun to bop along to as they are crucial to the story. </p><p>"Known for 'Sing Street,' 'Once,' and 'Begin Again,' Carney is a master of telling the stories of artists in all their angst and failure and resilience," writes Jillian Manning for <a href="https://www.northernexpress.com/news/feature/film-review-flora-and-son/#:~:text=(In%20fact%2C%20Flora%20and%20Son,angst%20and%20failure%20and%20resilience." target="_blank">The Northern Express</a>, adding: "Carney’s dramas also have quite stunning soundtracks, and watching Flora, Jeff, and Max inch closer together through their various musical passions is the true highlight of Flora and Son."</p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/movie/flora-and-son/umc.cmc.1ol2idv8q2iftiyjfkuyfki5l" target="_blank" rel="nofollow"><em><strong>"Flora and Son" on Apple TV</strong></em></a><em><strong> now</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/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-august-2026-ted-lasso-season-4-and-much-more">Everything new on Apple TV in August 2026: 'Ted Lasso' season 4 and much more</a></li><li><a href="https://www.tomsguide.com/entertainment/hulu/my-heart-broke-when-this-musical-comedy-show-was-canceled-but-at-least-its-streaming-on-hulu">My heart broke when this musical comedy show was canceled — but at least it’s streaming on Hulu</a></li></ul><div data-model-name="Apple TV,Hulu,Netflix,Peacock TV,Paramount Plus,Disney Plus" data-widget-type="multimodelreview" data-widget-title="Today's best streaming deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘Ted Lasso’ season 4 review: I went in deeply skeptical. I came out a believer ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Ted Lasso' season 4</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: ★★★★☆</strong></p><p class="fancy-box__body-text"><strong>Verdict:</strong> “Ted Lasso” season 4 doesn't quite have the show's early magic, but the new women's team gives the show a fresh spark and plenty of new stories to tell. It didn't necessarily need to come back, but after the uneven third season, this warm, funny return to Richmond is very welcome.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episode 1 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/ted-lasso/umc.cmc.vtoh0mn0xn7t3c643xqonfzy" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>Three years ago, <strong>Ted Lasso</strong> packed up his mustache and dad jokes and flew home to Kansas, and the <strong>Apple TV show</strong> all but hung up a "series finale: closed for business" banner. It didn't seem like “Ted Lasso” had much left to say. The world's nicest coach had guided AFC Richmond to many victories, fixed a whole lot of broken relationships and delivered enough inspirational speeches to fill several motivational calendars. And while season 3 had its moments, it also felt like the show had started running on fumes.</p><p>Then season 4 puts Ted (Jason Sudeikis) in charge of a women's soccer team, and suddenly I'm interested again.</p><p>I've seen the first five episodes, and while I wouldn't go so far as to say “Ted Lasso” <em>needed</em> to come back, this is the most fun I've had with this show since season 1. The new team gives the show fresh characters and storylines, while the return of Ted, Rebecca, Keeley, Roy, Beard and Higgins brings back the cozy, familiar feeling that made me and so many others fall in love with the show.</p><p><em><strong>Very light spoilers ahead for "Ted Lasso" season 4 episodes 1-5.</strong></em></p><h2 id="a-new-team-and-new-problems-give-ted-lasso-something-new-to-play-with">A new team and new problems give 'Ted Lasso' something new to play with</h2><p>Season 4 starts with Ted (Jason Sudeikis) in Kansas City, working as an assistant manager at a supermarket. On paper, everything is fine: He's with his son, Henry, and his co-parenting relationship with his ex-wife is friendly. But Ted is bored. Very bored. It doesn't take long to realize that he's missing the thing that has defined his life for the past few years: coaching.</p><p>So, naturally, he ends up back at AFC Richmond when Rebecca (Hannah Waddingham), Keeley (Juno Temple) and Higgins (Jeremy Swift) fly in to offer him a job. Except this time, it's coaching the club's new women's team.</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/GACU1N9hg5o" allowfullscreen=""></iframe></div></div><p>It's a breath of fresh air that the show desperately needed. The women aren't simply a replacement for Jamie, Roy and the rest of the old Richmond crew. They have their own personalities, cliques and tensions, and Ted has to learn that coaching this team isn't going to work exactly the way it did with the men. For starters, he can't just wander into the locker room whenever he wants. A small thing, but one that immediately makes the new team feel like its own world.</p><p>More importantly, the women's team gives “Ted Lasso” some genuinely new things to talk about. The show tackles the massive disparities between men's and women's sports through storylines about funding, facilities and fan interest. Rebecca has to figure out whether and how much to invest in the women's team — and what it says about her self-image as a feminist. </p><p>It also sometimes brings her into conflict with Keeley (Juno Temple). Their friendship and working partnership remains one of the show's best relationships, and adding nuance to that is a smart move.</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="bzySLpqyKkuzxsUxwaHi99" name="tedlasso-season4-rebeccakeeley" alt="Hannah Waddingham and Juno Temple in Ted Lasso season 4" src="https://cdn.mos.cms.futurecdn.net/bzySLpqyKkuzxsUxwaHi99-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Among the new cast members, the standout is Tanya Reynolds as Alice Chilton, the assistant coach. Alice is determined to prove herself, and her solution seems to be becoming the least fun person in England. Her prickliness contrasts well against Ted's sunny optimism and Beard's (Brendan Hunt) dry moodiness.</p><p>Roy (Brett Goldstein) isn't around quite as much with the men's team pushed into the background, but he gets a pretty funny dating storyline. And, yes, his will-they-won't-they with Keeley is still very much a thing (and delightful).</p><h2 id="verdict-ted-lasso-season-4-is-a-welcome-return-to-form">Verdict: ‘Ted Lasso’ season 4 is a welcome return to form</h2><p>If I'm being honest, this season didn't need to exist. "Ted Lasso" wrapped up on its own terms, and a comeback like this could've easily turned into a nostalgia lap that coasts on goodwill. Fortunately, it doesn't.</p><p>“Ted Lasso” is a sports comedy, but it's also a hangout comedy (as most co-creator Bill Lawrence's shows are). Much of its appeal has nothing to do with whether Richmond wins or loses. It's watching Ted and Beard banter, Rebecca and Keeley girlboss together, Roy growl at everyone within earshot and Higgins be Higgins. "Ted Lasso" has always been comfort food, and season 4 is an extra-saucy helping of barbecue.</p><div><blockquote><p>'Ted Lasso' has always been comfort food, and season 4 is an extra-saucy helping of barbecue.</p></blockquote></div><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="ykfhUQn8tvvAk82HFVXdSe" name="tedlasso-season4-beardtedalice" alt="Brendan Hunt, Jason Sudeikis and Tanya Reynolds in Ted Lasso season 4" src="https://cdn.mos.cms.futurecdn.net/ykfhUQn8tvvAk82HFVXdSe-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>It isn't perfect. Some of the show's more cringe-inducing material is still here, particularly Beard's on-again-off-again relationship Jane, which continues to be a thing (and not delightful). There's greater emphasis on romance all around — delving into Rebecca's relationship with her Dutch boyfriend, Keeley and Roy, and possibly even a new love interest for Ted. That's not necessarily a bad thing, as long as those storylines don't completely take over the show.</p><p>Five episodes in, season 4 has similar vibes as the first season — almost like a reboot. Then again, I've seen reboots/revivals that not only lack the spirit of the original, but they also cast shade on it. At least "Ted Lasso" season 4 doesn't do that.</p><p>So, no, the show doesn't match its peak. And no, it didn't need to come back. But I'm glad it did. It's a harsh world out there and I'm happy to hang out with a group of warm, funny pals doing their best to help each other succeed. In the words of another great TV coach: Clear eyes, full hearts, can't lose.</p><p><em><strong>"Ted Lasso" season 4 streams weekly on </strong></em><a href="https://tv.apple.com/us/show/ted-lasso/umc.cmc.vtoh0mn0xn7t3c643xqonfzy" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/ted-lasso-season-4-review-i-went-in-deeply-skeptical-i-came-out-a-believer</link>
                                                                            <description>
                            <![CDATA[ “Ted Lasso” season 4 is a welcome return to form, with the new women’s team giving the Apple TV Plus comedy a fresh spark. Here’s my review of the new season, including why it works better than season 3. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jmSS9ifC3RtCRVUoyP6icB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ogmC7wNGzNVXKXyyjRC9ei-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 05 Aug 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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-320-70.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/ogmC7wNGzNVXKXyyjRC9ei-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tanya Reynolds and Jason Sudeikis in Ted Lasso season 4]]></media:description>                                                            <media:text><![CDATA[Tanya Reynolds and Jason Sudeikis in Ted Lasso season 4]]></media:text>
                                <media:title type="plain"><![CDATA[Tanya Reynolds and Jason Sudeikis in Ted Lasso season 4]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ogmC7wNGzNVXKXyyjRC9ei-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Ted Lasso' season 4</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: ★★★★☆</strong></p><p class="fancy-box__body-text"><strong>Verdict:</strong> “Ted Lasso” season 4 doesn't quite have the show's early magic, but the new women's team gives the show a fresh spark and plenty of new stories to tell. It didn't necessarily need to come back, but after the uneven third season, this warm, funny return to Richmond is very welcome.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episode 1 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/ted-lasso/umc.cmc.vtoh0mn0xn7t3c643xqonfzy" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>Three years ago, <strong>Ted Lasso</strong> packed up his mustache and dad jokes and flew home to Kansas, and the <strong>Apple TV show</strong> all but hung up a "series finale: closed for business" banner. It didn't seem like “Ted Lasso” had much left to say. The world's nicest coach had guided AFC Richmond to many victories, fixed a whole lot of broken relationships and delivered enough inspirational speeches to fill several motivational calendars. And while season 3 had its moments, it also felt like the show had started running on fumes.</p><p>Then season 4 puts Ted (Jason Sudeikis) in charge of a women's soccer team, and suddenly I'm interested again.</p><p>I've seen the first five episodes, and while I wouldn't go so far as to say “Ted Lasso” <em>needed</em> to come back, this is the most fun I've had with this show since season 1. The new team gives the show fresh characters and storylines, while the return of Ted, Rebecca, Keeley, Roy, Beard and Higgins brings back the cozy, familiar feeling that made me and so many others fall in love with the show.</p><p><em><strong>Very light spoilers ahead for "Ted Lasso" season 4 episodes 1-5.</strong></em></p><h2 id="a-new-team-and-new-problems-give-ted-lasso-something-new-to-play-with">A new team and new problems give 'Ted Lasso' something new to play with</h2><p>Season 4 starts with Ted (Jason Sudeikis) in Kansas City, working as an assistant manager at a supermarket. On paper, everything is fine: He's with his son, Henry, and his co-parenting relationship with his ex-wife is friendly. But Ted is bored. Very bored. It doesn't take long to realize that he's missing the thing that has defined his life for the past few years: coaching.</p><p>So, naturally, he ends up back at AFC Richmond when Rebecca (Hannah Waddingham), Keeley (Juno Temple) and Higgins (Jeremy Swift) fly in to offer him a job. Except this time, it's coaching the club's new women's team.</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/GACU1N9hg5o" allowfullscreen=""></iframe></div></div><p>It's a breath of fresh air that the show desperately needed. The women aren't simply a replacement for Jamie, Roy and the rest of the old Richmond crew. They have their own personalities, cliques and tensions, and Ted has to learn that coaching this team isn't going to work exactly the way it did with the men. For starters, he can't just wander into the locker room whenever he wants. A small thing, but one that immediately makes the new team feel like its own world.</p><p>More importantly, the women's team gives “Ted Lasso” some genuinely new things to talk about. The show tackles the massive disparities between men's and women's sports through storylines about funding, facilities and fan interest. Rebecca has to figure out whether and how much to invest in the women's team — and what it says about her self-image as a feminist. </p><p>It also sometimes brings her into conflict with Keeley (Juno Temple). Their friendship and working partnership remains one of the show's best relationships, and adding nuance to that is a smart move.</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="bzySLpqyKkuzxsUxwaHi99" name="tedlasso-season4-rebeccakeeley" alt="Hannah Waddingham and Juno Temple in Ted Lasso season 4" src="https://cdn.mos.cms.futurecdn.net/bzySLpqyKkuzxsUxwaHi99-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Among the new cast members, the standout is Tanya Reynolds as Alice Chilton, the assistant coach. Alice is determined to prove herself, and her solution seems to be becoming the least fun person in England. Her prickliness contrasts well against Ted's sunny optimism and Beard's (Brendan Hunt) dry moodiness.</p><p>Roy (Brett Goldstein) isn't around quite as much with the men's team pushed into the background, but he gets a pretty funny dating storyline. And, yes, his will-they-won't-they with Keeley is still very much a thing (and delightful).</p><h2 id="verdict-ted-lasso-season-4-is-a-welcome-return-to-form">Verdict: ‘Ted Lasso’ season 4 is a welcome return to form</h2><p>If I'm being honest, this season didn't need to exist. "Ted Lasso" wrapped up on its own terms, and a comeback like this could've easily turned into a nostalgia lap that coasts on goodwill. Fortunately, it doesn't.</p><p>“Ted Lasso” is a sports comedy, but it's also a hangout comedy (as most co-creator Bill Lawrence's shows are). Much of its appeal has nothing to do with whether Richmond wins or loses. It's watching Ted and Beard banter, Rebecca and Keeley girlboss together, Roy growl at everyone within earshot and Higgins be Higgins. "Ted Lasso" has always been comfort food, and season 4 is an extra-saucy helping of barbecue.</p><div><blockquote><p>'Ted Lasso' has always been comfort food, and season 4 is an extra-saucy helping of barbecue.</p></blockquote></div><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="ykfhUQn8tvvAk82HFVXdSe" name="tedlasso-season4-beardtedalice" alt="Brendan Hunt, Jason Sudeikis and Tanya Reynolds in Ted Lasso season 4" src="https://cdn.mos.cms.futurecdn.net/ykfhUQn8tvvAk82HFVXdSe-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>It isn't perfect. Some of the show's more cringe-inducing material is still here, particularly Beard's on-again-off-again relationship Jane, which continues to be a thing (and not delightful). There's greater emphasis on romance all around — delving into Rebecca's relationship with her Dutch boyfriend, Keeley and Roy, and possibly even a new love interest for Ted. That's not necessarily a bad thing, as long as those storylines don't completely take over the show.</p><p>Five episodes in, season 4 has similar vibes as the first season — almost like a reboot. Then again, I've seen reboots/revivals that not only lack the spirit of the original, but they also cast shade on it. At least "Ted Lasso" season 4 doesn't do that.</p><p>So, no, the show doesn't match its peak. And no, it didn't need to come back. But I'm glad it did. It's a harsh world out there and I'm happy to hang out with a group of warm, funny pals doing their best to help each other succeed. In the words of another great TV coach: Clear eyes, full hearts, can't lose.</p><p><em><strong>"Ted Lasso" season 4 streams weekly on </strong></em><a href="https://tv.apple.com/us/show/ted-lasso/umc.cmc.vtoh0mn0xn7t3c643xqonfzy" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Ted Lasso' season 4 online — stream much-loved soccer comedy from anywhere ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Ted Lasso and the gang may be back, but AFC Richmond has a distinctly different feel around the place for season 4, with women taking center stage on the pitch as well as the boardroom. Below is all the information you need to watch “Ted Lasso" season 4 online <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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">'Ted Lasso' S4 streaming details, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Ted Lasso" season 4 streams premiere <strong>on Wednesdays from August 5</strong>. Schedule below.<br /><strong>• Global streams </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Apple TV (7-day free trial)</a><br /><strong>• Watch anywhere — try </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk-free</strong></a></p></div></div><p>You can't keep Ted (Jason Sudeikis) and his irrepressible Kansas City spirit down for too long. And, although he crossed back over the pond to spend more time with his son at the end of "Ted Lasso" season 3, the new run features his Richmond return to helm a new project — the soccer club's women's team known as the 'Lady Greyhounds'.</p><p>With Coach Beard (Brendan Hunt) by his side and the full backing of Rebecca (Hannah Waddingham) upstairs, Ted is charged with taking the ailing Lady Greyhounds to glory, just like he did with the men's team. To do so, he'll first have to win around existing coach Alice (Tanya Reynolds), before getting the struggling players not just to play well, but to "Believe".</p><p>As ever, there'll be as much to enjoy off the pitch as on it, with Keeley (Juno Temple) and Roy's (Brett Goldstein) will-they-won't they romance and Ted's continuing battles with mental health weaving through the season. Read on to discover how to watch "Ted Lasso" season 4 online and from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-ted-lasso-s4-online-for-free"><span>How to watch 'Ted Lasso' S4 online for free</span></h2><p>“Ted Lasso" is an Apple TV original series. If you're new to the platform, you can take advantage of the platform's <a href="https://tv.apple.com/" target="_blank" rel="nofollow">FREE 7-day trial</a>. Time it right and that will let you <strong>watch all season 4 episodes absolutely free</strong>.</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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (save 75%)</strong></a>.</p><h2 class="article-body__section" id="section-how-to-watch-ted-lasso-season-4-around-the-world"><span>How to watch 'Ted Lasso' season 4 around the world</span></h2><div class="product"><a data-dimension112="8360043e-8f11-11f1-abd4-f1b0264262c0" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Ted Lasso" season 4 premieres globally on <a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="8360043e-8f11-11f1-abd4-f1b0264262c0" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> on <strong>Wednesday, August 5</strong>. The remaining nine instalments will then drop weekly each Wednesday.</p><p>There's an <a href="https://tv.apple.com" target="_blank" rel="nofollow"><strong>Apple TV 7-day free trial</strong></a> for new customers in most territories, and new Apple purchases often come with 1-3 months of Apple TV for free.</p><p>After that, prices for the streaming platform is as follows:</p><p>🇺🇸 In the U.S. prices start at $12.99/month.<br />🇨🇦 In Canada prices start at CA$14.99/month.<br />🇬🇧 In the U.K. prices start at £9.99/month.<br />🇦🇺 In Australia prices start at AU$15.99/month.</p><p>If Apple TV is blocked where you are, <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help you to access your streams as if you were back home.<a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="8360043e-8f11-11f1-abd4-f1b0264262c0" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-ted-lasso-season-4-from-anywhere-in-the-world"><span>Watch 'Ted Lasso' season 4 from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "Ted Lasso" S4 on your Apple TV 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&amp;aff_id=3013&amp;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="83600574-8f11-11f1-b495-297ebe990222" 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&amp;aff_id=3013&amp;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-1920-80.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&amp;utm_medium=affiliate&amp;utm_term=&amp;utm_content=TG&amp;utm_campaign=off564&amp;utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="83600574-8f11-11f1-b495-297ebe990222" 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>✅ 30-day money-back guarantee</strong><br /><strong>✅ Get 3 months extra free</strong><br /><strong>✅ 75% off the usual price</strong></p><p>Use NordVPN to unblock your usual streaming service and watch "Ted Lasso" S4 with this <em>exclusive </em>deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="83600574-8f11-11f1-b495-297ebe990222" 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><h3 class="article-body__section" id="section-ted-lasso-season-4-episodes-schedule"><span>'Ted Lasso' season 4 episodes &amp; schedule</span></h3><p>Season 4 of "Ted Lasso" will run for ten episodes, with the confirmed premiere dates and titles below:<em> </em></p><ul><li><strong>Episode 1: "Home"</strong> — Wednesday, August 5</li><li><strong>Episode 2: "Curiouser and Curiouser!"</strong> — Wednesday, August 12</li><li><strong>Episode 3: "Richmond's Got Talent"</strong> — Wednesday, August 19</li><li><strong>Episode 4: "Greyhound's Day Off"</strong> — Wednesday, August 26</li><li><strong>Episode 5</strong> — <strong> </strong>Wednesday, September 2</li><li><strong>Episode 6</strong> — Wednesday, September 9</li><li><strong>Episode 7</strong> — Wednesday, September 16</li><li><strong>Episode 8</strong> — Wednesday, September 23</li><li><strong>Episode 9</strong> — Wednesday, September 30</li><li><strong>Episode 10</strong> — Wednesday, October 7</li></ul><h3 class="article-body__section" id="section-ted-lasso-season-4-trailer"><span>'Ted Lasso' season 4 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/GACU1N9hg5o" allowfullscreen=""></iframe></div></div><h3 class="article-body__section" id="section-ted-lasso-season-4-cast"><span>'Ted Lasso' season 4 cast</span></h3><ul><li><strong>Jason Sudeikis</strong> as Ted Lasso</li><li><strong>Hannah Waddingham</strong> as Rebecca Welton</li><li><strong>Brett Goldstein</strong> as Roy Kent</li><li><strong>Brendan Hunt</strong> as Coach Willis Beard</li><li><strong>Juno Temple</strong> as Keeley Jones</li><li><strong>Jeremy Swift</strong> as Leslie Higgins</li><li><strong>Tanya Reynolds</strong> as Alice Chilton</li><li><strong>Abbie Hern</strong> as Gemma</li><li><strong>Faye Marsay</strong> as Lizzie</li><li><strong>Jude Mack</strong> as Boots</li><li><strong>Rex Hayes</strong> as Siobhan</li><li><strong>Aisling Sharkey</strong> as Niamh</li><li><strong>Mercedes Assad</strong> as Margy</li><li><strong>Shannon Hayes</strong> as Shannon</li><li><strong>Annelise Heywood</strong> as Mady</li></ul><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-august-2026-ted-lasso-season-4-and-much-more" target="_blank">Everything new on Apple TV in August 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn" target="_blank">The best streaming VPNs</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/rooster-review-another-winning-heartfelt-dramedy-from-the-creator-of-ted-lasso-and-shrinking" target="_blank">'Rooster' review: Another winning, heartfelt dramedy from the creator of 'Ted Lasso' and 'Shrinking'</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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/watch-ted-lasso-season-4-online-from-anywhere</link>
                                                                            <description>
                            <![CDATA[ Here's how to watch 'Ted Lasso' season 4 episodes online no matter where you are, with Ted, Coach Beard, Roy Kent, Keeley & Co. returning to The Dogtrack. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5232q3CFfs6eaXTghkRTPR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nSPYQ6gN6sMgmxSoHZXyu3-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 04 Aug 2026 17:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Adam Marshall ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ &lt;p&gt;Adam was the Content Director of Subscriptions and Services at Future, meaning that he oversaw many of the articles the publisher produces about antivirus software, VPN, TV streaming, broadband and mobile phone contracts - from buying guides and deals news, to industry interest pieces and reviews.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having graduated with a degree in Law, Adam started his life as a communicator with five years as a lawyer before retraining as a writer. He completed his NCTJ Diploma at the London School of Journalism in 2012 and hasn&#039;t looked back since.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Adam quickly established his authority around the safeguarding and championing of his readers&#039; interests, after starting his career at consumer watchdog Which?. There he developed an expertise in cybersecurity and promoting safe use of the internet, before heading to Future in 2016 and applying his editorial nous to the dizzying world of virtual private networks. From there, he helped establish TechRadar as a leading voice in consumer and business VPNs, helping to demystify their uses and help his audience make the best &amp;nbsp;buying decisions they can.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Adam can still be dusting his keyboard off to write articles for the likes of TechRadar, T3 and 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/nSPYQ6gN6sMgmxSoHZXyu3-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[L-R: Jason Sudeikis and Tanya Reynolds in front of the AFC Richmond stands in a first-look still for &quot;Ted Lasso&quot; season 4]]></media:description>                                                            <media:text><![CDATA[L-R: Jason Sudeikis and Tanya Reynolds in front of the AFC Richmond stands in a first-look still for &quot;Ted Lasso&quot; season 4]]></media:text>
                                <media:title type="plain"><![CDATA[L-R: Jason Sudeikis and Tanya Reynolds in front of the AFC Richmond stands in a first-look still for &quot;Ted Lasso&quot; season 4]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nSPYQ6gN6sMgmxSoHZXyu3-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Ted Lasso and the gang may be back, but AFC Richmond has a distinctly different feel around the place for season 4, with women taking center stage on the pitch as well as the boardroom. Below is all the information you need to watch “Ted Lasso" season 4 online <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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">'Ted Lasso' S4 streaming details, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Ted Lasso" season 4 streams premiere <strong>on Wednesdays from August 5</strong>. Schedule below.<br /><strong>• Global streams </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Apple TV (7-day free trial)</a><br /><strong>• Watch anywhere — try </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk-free</strong></a></p></div></div><p>You can't keep Ted (Jason Sudeikis) and his irrepressible Kansas City spirit down for too long. And, although he crossed back over the pond to spend more time with his son at the end of "Ted Lasso" season 3, the new run features his Richmond return to helm a new project — the soccer club's women's team known as the 'Lady Greyhounds'.</p><p>With Coach Beard (Brendan Hunt) by his side and the full backing of Rebecca (Hannah Waddingham) upstairs, Ted is charged with taking the ailing Lady Greyhounds to glory, just like he did with the men's team. To do so, he'll first have to win around existing coach Alice (Tanya Reynolds), before getting the struggling players not just to play well, but to "Believe".</p><p>As ever, there'll be as much to enjoy off the pitch as on it, with Keeley (Juno Temple) and Roy's (Brett Goldstein) will-they-won't they romance and Ted's continuing battles with mental health weaving through the season. Read on to discover how to watch "Ted Lasso" season 4 online and from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-ted-lasso-s4-online-for-free"><span>How to watch 'Ted Lasso' S4 online for free</span></h2><p>“Ted Lasso" is an Apple TV original series. If you're new to the platform, you can take advantage of the platform's <a href="https://tv.apple.com/" target="_blank" rel="nofollow">FREE 7-day trial</a>. Time it right and that will let you <strong>watch all season 4 episodes absolutely free</strong>.</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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (save 75%)</strong></a>.</p><h2 class="article-body__section" id="section-how-to-watch-ted-lasso-season-4-around-the-world"><span>How to watch 'Ted Lasso' season 4 around the world</span></h2><div class="product"><a data-dimension112="8360043e-8f11-11f1-abd4-f1b0264262c0" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Ted Lasso" season 4 premieres globally on <a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="8360043e-8f11-11f1-abd4-f1b0264262c0" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> on <strong>Wednesday, August 5</strong>. The remaining nine instalments will then drop weekly each Wednesday.</p><p>There's an <a href="https://tv.apple.com" target="_blank" rel="nofollow"><strong>Apple TV 7-day free trial</strong></a> for new customers in most territories, and new Apple purchases often come with 1-3 months of Apple TV for free.</p><p>After that, prices for the streaming platform is as follows:</p><p>🇺🇸 In the U.S. prices start at $12.99/month.<br />🇨🇦 In Canada prices start at CA$14.99/month.<br />🇬🇧 In the U.K. prices start at £9.99/month.<br />🇦🇺 In Australia prices start at AU$15.99/month.</p><p>If Apple TV is blocked where you are, <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help you to access your streams as if you were back home.<a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="8360043e-8f11-11f1-abd4-f1b0264262c0" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-ted-lasso-season-4-from-anywhere-in-the-world"><span>Watch 'Ted Lasso' season 4 from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "Ted Lasso" S4 on your Apple TV 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&amp;aff_id=3013&amp;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="83600574-8f11-11f1-b495-297ebe990222" 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&amp;aff_id=3013&amp;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-1920-80.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&amp;utm_medium=affiliate&amp;utm_term=&amp;utm_content=TG&amp;utm_campaign=off564&amp;utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="83600574-8f11-11f1-b495-297ebe990222" 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>✅ 30-day money-back guarantee</strong><br /><strong>✅ Get 3 months extra free</strong><br /><strong>✅ 75% off the usual price</strong></p><p>Use NordVPN to unblock your usual streaming service and watch "Ted Lasso" S4 with this <em>exclusive </em>deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="83600574-8f11-11f1-b495-297ebe990222" 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><h3 class="article-body__section" id="section-ted-lasso-season-4-episodes-schedule"><span>'Ted Lasso' season 4 episodes &amp; schedule</span></h3><p>Season 4 of "Ted Lasso" will run for ten episodes, with the confirmed premiere dates and titles below:<em> </em></p><ul><li><strong>Episode 1: "Home"</strong> — Wednesday, August 5</li><li><strong>Episode 2: "Curiouser and Curiouser!"</strong> — Wednesday, August 12</li><li><strong>Episode 3: "Richmond's Got Talent"</strong> — Wednesday, August 19</li><li><strong>Episode 4: "Greyhound's Day Off"</strong> — Wednesday, August 26</li><li><strong>Episode 5</strong> — <strong> </strong>Wednesday, September 2</li><li><strong>Episode 6</strong> — Wednesday, September 9</li><li><strong>Episode 7</strong> — Wednesday, September 16</li><li><strong>Episode 8</strong> — Wednesday, September 23</li><li><strong>Episode 9</strong> — Wednesday, September 30</li><li><strong>Episode 10</strong> — Wednesday, October 7</li></ul><h3 class="article-body__section" id="section-ted-lasso-season-4-trailer"><span>'Ted Lasso' season 4 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/GACU1N9hg5o" allowfullscreen=""></iframe></div></div><h3 class="article-body__section" id="section-ted-lasso-season-4-cast"><span>'Ted Lasso' season 4 cast</span></h3><ul><li><strong>Jason Sudeikis</strong> as Ted Lasso</li><li><strong>Hannah Waddingham</strong> as Rebecca Welton</li><li><strong>Brett Goldstein</strong> as Roy Kent</li><li><strong>Brendan Hunt</strong> as Coach Willis Beard</li><li><strong>Juno Temple</strong> as Keeley Jones</li><li><strong>Jeremy Swift</strong> as Leslie Higgins</li><li><strong>Tanya Reynolds</strong> as Alice Chilton</li><li><strong>Abbie Hern</strong> as Gemma</li><li><strong>Faye Marsay</strong> as Lizzie</li><li><strong>Jude Mack</strong> as Boots</li><li><strong>Rex Hayes</strong> as Siobhan</li><li><strong>Aisling Sharkey</strong> as Niamh</li><li><strong>Mercedes Assad</strong> as Margy</li><li><strong>Shannon Hayes</strong> as Shannon</li><li><strong>Annelise Heywood</strong> as Mady</li></ul><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-august-2026-ted-lasso-season-4-and-much-more" target="_blank">Everything new on Apple TV in August 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn" target="_blank">The best streaming VPNs</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/rooster-review-another-winning-heartfelt-dramedy-from-the-creator-of-ted-lasso-and-shrinking" target="_blank">'Rooster' review: Another winning, heartfelt dramedy from the creator of 'Ted Lasso' and 'Shrinking'</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[ Everything new on Apple TV in August 2026: 'Ted Lasso' season 4 and much more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Summer’s in its final stretch, but Apple TV is giving you plenty of reasons to stay parked on the couch all through August. Leading the charge on Aug. 5 is season 4 of "Ted Lasso," which pulls Ted right back to Richmond to coach a second-division women’s team.</p><p>Mid-month shifts gears with the return of "Women in Blue" on Aug. 12, featuring María’s promotion to lieutenant as the Azules chase a sprawling 1970s Mexico City case tied to the 1968 student massacre. Double-feature energy arrives Aug. 21 with "The Dynasty: UConn Huskies, a three-part documentary on Geno Auriemma’s legendary program, alongside five delightfully cozy new episodes of "Stillwater."</p><p>Closing out the month on Aug. 28 is season 2 of "Dark Matter," reopening Blake Crouch’s mind-bending multiverse with Joel Edgerton and Jennifer Connelly back to explore the road not taken. With a slate this stacked, beating the late-summer heat from the comfort of your living room isn't just tempting — it’s practically mandatory. Here's everything coming to Apple TV in August 2026.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="ted-lasso-season-4">'Ted Lasso' season 4</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/GACU1N9hg5o" allowfullscreen=""></iframe></div></div><p>Season 3 sent Ted home to Kansas for good... or so it seemed. Season 4 pulls him back across the Atlantic to Richmond and hands him a challenge he's arguably even less equipped for than managing a Premier League side: coaching a second-division women's football team. The men's players are out of the picture now, so Ted is starting close to zero, learning a new roster and, in his own bumbling way, the sport itself all over again. Rebecca (Hannah Waddingham), Keeley (Juno Temple), Roy Kent (Brett Goldstein), Coach Beard (Brendan Hunt) and Higgins (Jeremy Swift) all return, with Tanya Reynolds and Faye Marsay among some of the newcomers filling out the squad.</p><p><a href="https://www.apple.com/tv-pr/originals/ted-lasso/" target="_blank" rel="nofollow"><em><strong>Watch "Ted Lasso" season 4 on Apple TV starting August 5</strong></em></a></p><h2 id="women-in-blue-las-azules-season-2">'Women in Blue (Las Azules)' season 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/KqHDHnGq2O0" allowfullscreen=""></iframe></div></div><p>Season 1 followed the first women admitted to the Mexico City police force in the 1970s as they hunted a serial killer nobody else would take seriously. Season 2 gives María (Bárbara Mori) a promotion to lieutenant and a case that runs straight into the country's recent history. When the body of a student activist turns up, the Azules are pulled into an investigation that leads back to the 1968 student massacre, the day government forces killed protesters in the capital. Then a second body surfaces, this one belonging to someone connected to that same chapter, and it becomes clear that a killer is hunting down people tied to the massacre and leaving them at the police's door.</p><p><a href="https://www.apple.com/tv-pr/originals/women-in-blue-las-azules/" target="_blank" rel="nofollow"><em><strong>Watch "'Women in Blue (Las Azules)" season 2 on Apple TV starting August 12</strong></em></a></p><h2 id="the-dynasty-uconn-huskies">'The Dynasty: UConn Huskies' </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/qygK7CQUe_o" allowfullscreen=""></iframe></div></div><p>Geno Auriemma took over a UConn program with a single winning season to its name and turned it into the closest thing American college sports has to a permanent dynasty: 12 national championships across four decades. This three-part documentary tells that story. Players from across generations keep circling the same admission: that Auriemma was brutally demanding and that a championship, once you have one, mostly leaves you wanting the next. The 2025 title team anchors the present-day thread through Paige Bueckers, Azzi Fudd and Sarah Strong, while Sue Bird, Diana Taurasi, Maya Moore, Breanna Stewart and Rebecca Lobo trace the program back to the start. </p><p><a href="https://www.apple.com/tv-pr/originals/the-dynasty-uconn-huskies/" target="_blank" rel="nofollow"><em><strong>Watch "The Dynasty: UConn Huskies" on Apple TV starting August 21</strong></em></a></p><h2 id="stillwater-season-5">'Stillwater' season 5</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/zz1GkcvkT1g" allowfullscreen=""></iframe></div></div><p>The animated series, based on Jon J Muth's "Zen" picture book series, follows three young siblings, Karl, Addy and Michael, and the wise panda who happens to live next door. When the everyday problems that come along with being a kid start to feel like too much, Stillwater (voiced by James Sie) tells them a story or walks them through a few breaths, and the kids learn a gentle lesson. It's a show that's made for young kids, but adults could also learn a thing or two. People aren't perfect, after all. </p><p><a href="https://www.apple.com/tv-pr/originals/the-dynasty-uconn-huskies/" target="_blank" rel="nofollow"><em><strong>Watch "Stillwater" on Apple TV starting August 21</strong></em></a></p><h2 id="dark-matter-season-2">'Dark Matter' season 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/zhB6_1UbR7s" allowfullscreen=""></iframe></div></div><p>"Dark Matter" centers on a device called the Box, a device that opens a door onto every other version of the life you could have lived. Season 1 followed physicist Jason Dessen (Joel Edgerton) as he clawed his way back to his own wife and son through a maze of parallel worlds, only to end the season fleeing into yet another unfamiliar universe with Daniela (Jennifer Connelly) and Charlie (Oakes Fegley) in tow. Season 2 finds the three of them trying to build a new life in that new world, right up until something drives them to run again. Jason can't leave the Box alone, and Daniela's paranoia starts ruining any stability they've managed to build. Blake Crouch, who wrote the novel and never followed it with a sequel, runs the show himself, so this season is genuinely uncharted territory, so who knows where it'll end up?</p><p><a href="https://www.apple.com/tv-pr/originals/dark-matter/" target="_blank" rel="nofollow"><em><strong>Watch "Dark Matter" on Apple TV starting August 28</strong></em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-august-2026-ted-lasso-season-4-and-much-more</link>
                                                                            <description>
                            <![CDATA[ Our guide to the new movies and shows coming to Apple TV in August 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">N8Eq7Jc6WuXS4F9ChupPvd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/w6PgefqSJRbxhHgjgwtd8b-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 29 Jul 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Brittany Vincent ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JDgb6vqXHys3nrFJpkRCub-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/w6PgefqSJRbxhHgjgwtd8b-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Ted Lasso season 4 poster]]></media:description>                                                            <media:text><![CDATA[Ted Lasso season 4 poster]]></media:text>
                                <media:title type="plain"><![CDATA[Ted Lasso season 4 poster]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/w6PgefqSJRbxhHgjgwtd8b-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer’s in its final stretch, but Apple TV is giving you plenty of reasons to stay parked on the couch all through August. Leading the charge on Aug. 5 is season 4 of "Ted Lasso," which pulls Ted right back to Richmond to coach a second-division women’s team.</p><p>Mid-month shifts gears with the return of "Women in Blue" on Aug. 12, featuring María’s promotion to lieutenant as the Azules chase a sprawling 1970s Mexico City case tied to the 1968 student massacre. Double-feature energy arrives Aug. 21 with "The Dynasty: UConn Huskies, a three-part documentary on Geno Auriemma’s legendary program, alongside five delightfully cozy new episodes of "Stillwater."</p><p>Closing out the month on Aug. 28 is season 2 of "Dark Matter," reopening Blake Crouch’s mind-bending multiverse with Joel Edgerton and Jennifer Connelly back to explore the road not taken. With a slate this stacked, beating the late-summer heat from the comfort of your living room isn't just tempting — it’s practically mandatory. Here's everything coming to Apple TV in August 2026.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="ted-lasso-season-4">'Ted Lasso' season 4</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/GACU1N9hg5o" allowfullscreen=""></iframe></div></div><p>Season 3 sent Ted home to Kansas for good... or so it seemed. Season 4 pulls him back across the Atlantic to Richmond and hands him a challenge he's arguably even less equipped for than managing a Premier League side: coaching a second-division women's football team. The men's players are out of the picture now, so Ted is starting close to zero, learning a new roster and, in his own bumbling way, the sport itself all over again. Rebecca (Hannah Waddingham), Keeley (Juno Temple), Roy Kent (Brett Goldstein), Coach Beard (Brendan Hunt) and Higgins (Jeremy Swift) all return, with Tanya Reynolds and Faye Marsay among some of the newcomers filling out the squad.</p><p><a href="https://www.apple.com/tv-pr/originals/ted-lasso/" target="_blank" rel="nofollow"><em><strong>Watch "Ted Lasso" season 4 on Apple TV starting August 5</strong></em></a></p><h2 id="women-in-blue-las-azules-season-2">'Women in Blue (Las Azules)' season 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/KqHDHnGq2O0" allowfullscreen=""></iframe></div></div><p>Season 1 followed the first women admitted to the Mexico City police force in the 1970s as they hunted a serial killer nobody else would take seriously. Season 2 gives María (Bárbara Mori) a promotion to lieutenant and a case that runs straight into the country's recent history. When the body of a student activist turns up, the Azules are pulled into an investigation that leads back to the 1968 student massacre, the day government forces killed protesters in the capital. Then a second body surfaces, this one belonging to someone connected to that same chapter, and it becomes clear that a killer is hunting down people tied to the massacre and leaving them at the police's door.</p><p><a href="https://www.apple.com/tv-pr/originals/women-in-blue-las-azules/" target="_blank" rel="nofollow"><em><strong>Watch "'Women in Blue (Las Azules)" season 2 on Apple TV starting August 12</strong></em></a></p><h2 id="the-dynasty-uconn-huskies">'The Dynasty: UConn Huskies' </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/qygK7CQUe_o" allowfullscreen=""></iframe></div></div><p>Geno Auriemma took over a UConn program with a single winning season to its name and turned it into the closest thing American college sports has to a permanent dynasty: 12 national championships across four decades. This three-part documentary tells that story. Players from across generations keep circling the same admission: that Auriemma was brutally demanding and that a championship, once you have one, mostly leaves you wanting the next. The 2025 title team anchors the present-day thread through Paige Bueckers, Azzi Fudd and Sarah Strong, while Sue Bird, Diana Taurasi, Maya Moore, Breanna Stewart and Rebecca Lobo trace the program back to the start. </p><p><a href="https://www.apple.com/tv-pr/originals/the-dynasty-uconn-huskies/" target="_blank" rel="nofollow"><em><strong>Watch "The Dynasty: UConn Huskies" on Apple TV starting August 21</strong></em></a></p><h2 id="stillwater-season-5">'Stillwater' season 5</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/zz1GkcvkT1g" allowfullscreen=""></iframe></div></div><p>The animated series, based on Jon J Muth's "Zen" picture book series, follows three young siblings, Karl, Addy and Michael, and the wise panda who happens to live next door. When the everyday problems that come along with being a kid start to feel like too much, Stillwater (voiced by James Sie) tells them a story or walks them through a few breaths, and the kids learn a gentle lesson. It's a show that's made for young kids, but adults could also learn a thing or two. People aren't perfect, after all. </p><p><a href="https://www.apple.com/tv-pr/originals/the-dynasty-uconn-huskies/" target="_blank" rel="nofollow"><em><strong>Watch "Stillwater" on Apple TV starting August 21</strong></em></a></p><h2 id="dark-matter-season-2">'Dark Matter' season 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/zhB6_1UbR7s" allowfullscreen=""></iframe></div></div><p>"Dark Matter" centers on a device called the Box, a device that opens a door onto every other version of the life you could have lived. Season 1 followed physicist Jason Dessen (Joel Edgerton) as he clawed his way back to his own wife and son through a maze of parallel worlds, only to end the season fleeing into yet another unfamiliar universe with Daniela (Jennifer Connelly) and Charlie (Oakes Fegley) in tow. Season 2 finds the three of them trying to build a new life in that new world, right up until something drives them to run again. Jason can't leave the Box alone, and Daniela's paranoia starts ruining any stability they've managed to build. Blake Crouch, who wrote the novel and never followed it with a sequel, runs the show himself, so this season is genuinely uncharted territory, so who knows where it'll end up?</p><p><a href="https://www.apple.com/tv-pr/originals/dark-matter/" target="_blank" rel="nofollow"><em><strong>Watch "Dark Matter" on Apple TV starting August 28</strong></em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 best new movies to watch this weekend on Netflix, Apple TV, Prime Video and more (July 25-26) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Another weekend is here, which means the question of what to watch is fresh on our minds. It's slim pickings this week among the new releases across <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a>, especially on Netflix, where a godawful Kevin Hart comedy is the main headliner this weekend. </p><p>Instead, I'd urge you to check out the much funnier sports comedy on Apple TV, "The Dink." It's got pickleball and "New Girl" star Jake Johnson's thirsting after an older woman; what's not to love? Over on paid video-on-demand platforms, you can catch "Star Wars: The Mandalorian and Grogu" for more of the Pedro Pascal and baby Yoda dynamic duo fans fell in love with from the show. Paramount+ has a new Avatar movie, "Avatar Aang: The Last Airbender," that I'm not convinced needed to exist, but if it means more Toph kicking ass in my life, then yes, please. </p><p>Over on Prime Video, you can catch the darling animated adventure "The Wild Robot" from the same creator of "Lilo &amp; Stitch" and "How to Train Your Dragon" series. Finally, Netflix just got the second part of "Wicked" if you're looking to get our sing-along on this weekend. So without further ado, let's dive into the best new movies to watch this weekend. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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>One of the few original movies debuting on streaming this week is "The Dink," a new Apple TV sports comedy from director Josh Greenbaum ("Strays" and "Barb and Star Go to Vista Del Mar"). My boy Jake Johnson stars as a washed-up tennis pro named Dusty Boyd who finds a shot at redemption in the unlikeliest of places: on the pickleball court. </p><p>Through a bizarre twist of fate, Dusty ends up joining a pickleball quartet made up of older women, where he quickly develops a crush on their charismatic leader (Mary Steenburgen). But his newfound passion for the sport comes with high stakes, as he’s forced to face off against his longtime nemesis with the future of his father's country club hanging in the balance. The film also features Chloe Fineman, Patton Oswalt, Fortune Feimster, Chris Parnell, Ben Stiller, and a scene-stealing Aaron Chen as Dusty’s trusty sidekick.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow"><em><strong>"The Dink" on Apple TV</strong></em></a><em><strong> now</strong></em></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 lowest-grossing Star Wars movie in history made its way to paid-video-on-demand platforms this week. You're better off waiting for it to arrive on Disney+ in a few months, but if you need your Baby Yoda fix now, have at it. "Star Wars: The Mandalorian and Grogu" never quite justifies its full-length movie treatment, feeling instead like a mini "Mandalorian" marathon retrofitted to the big screen, which might explain the poor theatrical performance.  </p><p>The galaxy's dreamiest bounty hunter and his pint-sized companion return for a new adventure. Din Djarin (Pedro Pascal) and Grogu take on a mission for the New Republic to rescue Rotta the Hutt (voiced by "The Bear's" Jeremy Allen White), Jabba's heir, from a rival crime syndicate to get some juicy intel on an Imperial warlord. Their assignment spirals into a galaxy-spanning adventure filled with all the blaster fights and Force magic you'd expect of a Star Wars outing. </p><p><em><strong>Buy or rent "Star Wars: The Mandalorian and Grogu" on </strong></em><a href="https://tv.apple.com/us/movie/star-wars-the-mandalorian-and-grogu/umc.cmc.31m58rsmdk9f165zgt7vawkxk" target="_blank" rel="nofollow"><em><strong>Apple</strong></em></a><em><strong> or </strong></em><a href="https://tv.apple.com/us/movie/star-wars-the-mandalorian-and-grogu/umc.cmc.31m58rsmdk9f165zgt7vawkxk" target="_blank" rel="nofollow"><em><strong>Amazon</strong></em></a><em><strong> now</strong></em></p><h2 id="avatar-aang-the-last-airbender-paramount">'Avatar Aang: The Last Airbender' (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/RrYIrktLthc" allowfullscreen=""></iframe></div></div><p>Did we really need more of Team Avatar? Eh. Debatable. Will I be sat down to watch this weekend? Absolutely. If only to see Toph (voiced by Dionee Quan) get the epic fight scenes we all hoped for in "The Legend of Korra." Directed by Lauren Montgomery, the film takes place after the events of the original animated series and follows an older Avatar Aang (voiced by Eric Nam), now grown up and setting out with his friends on a mission to rebuild the long-lost Air Nation. </p><p>To do that, he'll need an ancient power that could save his culture from extinction, but if it falls into the wrong hands first, it spells doom for the Air Nation's future. Expanding the world of “Avatar” with a new chapter in Aang’s journey, this has all the makings of an essential watch for longtime fans.</p><p><em><strong>Watch </strong></em><a href="https://www.paramountplus.com/movies/video/ALVE01KRF3YJMCEJB92T78193MJ4HP/" target="_blank" rel="nofollow"><em><strong>"Avatar Aang: The Last Airbender" on Paramount+</strong></em></a><em><strong> now</strong></em></p><h2 id="wicked-for-good-netflix">'Wicked: For Good' (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/vt98AlBDI9Y" allowfullscreen=""></iframe></div></div><p>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> just landed on Netflix — though if you ask me, there are <a href="https://www.tomsguide.com/entertainment/netflix/wicked-for-good-just-landed-on-netflix-but-these-3-musicals-are-even-better">much better musicals on Netflix</a> that are more worth your time. Let's be real, all the best "Wicked" songs are in the first act, so "For Good" was never going to stack up, but it was still a satisfying conclusion for the story of Elphaba (Cynthia Erivo) and Glinda (Ariana Grande) with plenty of earworms and big-budget set pieces to dazzle you into a stupor. </p><p>"For Good" picks up right after "Wicked's" dramatic conclusion, with Elphaba now in her Wicked Witch of the West era on the run from the Wizard (Jeff Goldblum). Many of her old pals from Shiz now lead the mob calling for her head, though others lead the search only to find her before they do. Glinda and Elphaba clash over the Wizard's true intentions and what's best for Oz, but when a mysterious storm sends a young girl from Kansas (and her little dog too) crashing into their world, it puts their already strained relationship to the ultimate test. </p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/83077841" target="_blank" rel="nofollow"><em><strong>"Wicked: For Good" on Netflix</strong></em></a><em><strong> now</strong></em></p><h2 id="the-wild-robot-prime-video">'The Wild Robot' (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/67vbA5ZJdKQ" allowfullscreen=""></iframe></div></div><p>"The Wild Robot" is one of several animated movies I refuse to shut up about, so when I saw it landed on Prime Video this week, I knew I had to give it a shout-out. With Chris Sanders, the same creative tour de force behind "Lilo &amp; Stitch" and "How to Train Your Dragon," at the wheel, you know you're in for a treat. This DreamWorks treasure had me full-on ugly crying in the theater when it came out, thanks in large part to Lupita Nyong’o’s deeply moving performance as Roz, a lost robot turned reluctant parent to an orphaned gosling (Kit Conner). </p><p>Also along for the ride is everyone's favorite zaddy, Pedro Pascal, as a fox that could give Nick Wilde a run for money. Oh, and Matt Berry makes a cameo as a beaver — I'm letting y'all know so you don't get jump scared like I was. It's your standard fish out of water tale, beautifully told with gorgeous animation that easily rivals the "Spider-Verse" films in both style and ambition. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0DBZCXSVS" target="_blank" rel="nofollow"><em><strong>"The Wild Robot" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X7A1vW"></div>                            </div>                            <script src="https://kwizly.com/embed/X7A1vW.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/prime-video/3-best-new-to-prime-video-movies-you-should-stream-this-weekend-july-24-26">3 best new to Prime Video movies you should stream this weekend (July 24-26)</a></li><li><a href="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">8 new movies and shows to watch this weekend on Netflix, Prime Video and more (July 24-26)</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-new-to-netflix-movies-you-should-stream-this-weekend-july-24-26">3 best new to Netflix movies you should stream this weekend (July 24-26)</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/5-best-new-movies-to-watch-this-weekend-on-netflix-apple-tv-prime-video-and-more-july-25-26</link>
                                                                            <description>
                            <![CDATA[ Not sure what to watch this weekend? 'The Dink,' a new grown-up 'Avatar: The Last Airbender,' 'The Mandalorian and Grogu,' and more must-watch movies just landed on streaming ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Dv5AKotaReD37BBDNPYhbh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oihLGY39YxCiPDArVwFnbi-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 25 Jul 2026 04:01:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc-320-70.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/oihLGY39YxCiPDArVwFnbi-1920-80.jpg">
                                                            <media:credit><![CDATA[Avatar Studios/Paramount+; Apple TV; FlixPix (Alamy)]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(From L to R) Aang (voiced by Eric Nam) in Avatar Aang: The Last Airbender on Paramount+; Jake Johnson as Dusty Boyd in The Dink on Apple TV; Pedro Pascal as Din Djarin in The Mandalroain and Grogu. ]]></media:description>                                                            <media:text><![CDATA[(From L to R) Aang (voiced by Eric Nam) in Avatar Aang: The Last Airbender on Paramount+; Jake Johnson as Dusty Boyd in The Dink on Apple TV; Pedro Pascal as Din Djarin in The Mandalroain and Grogu. ]]></media:text>
                                <media:title type="plain"><![CDATA[(From L to R) Aang (voiced by Eric Nam) in Avatar Aang: The Last Airbender on Paramount+; Jake Johnson as Dusty Boyd in The Dink on Apple TV; Pedro Pascal as Din Djarin in The Mandalroain and Grogu. ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oihLGY39YxCiPDArVwFnbi-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Another weekend is here, which means the question of what to watch is fresh on our minds. It's slim pickings this week among the new releases across <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a>, especially on Netflix, where a godawful Kevin Hart comedy is the main headliner this weekend. </p><p>Instead, I'd urge you to check out the much funnier sports comedy on Apple TV, "The Dink." It's got pickleball and "New Girl" star Jake Johnson's thirsting after an older woman; what's not to love? Over on paid video-on-demand platforms, you can catch "Star Wars: The Mandalorian and Grogu" for more of the Pedro Pascal and baby Yoda dynamic duo fans fell in love with from the show. Paramount+ has a new Avatar movie, "Avatar Aang: The Last Airbender," that I'm not convinced needed to exist, but if it means more Toph kicking ass in my life, then yes, please. </p><p>Over on Prime Video, you can catch the darling animated adventure "The Wild Robot" from the same creator of "Lilo &amp; Stitch" and "How to Train Your Dragon" series. Finally, Netflix just got the second part of "Wicked" if you're looking to get our sing-along on this weekend. So without further ado, let's dive into the best new movies to watch this weekend. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><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>One of the few original movies debuting on streaming this week is "The Dink," a new Apple TV sports comedy from director Josh Greenbaum ("Strays" and "Barb and Star Go to Vista Del Mar"). My boy Jake Johnson stars as a washed-up tennis pro named Dusty Boyd who finds a shot at redemption in the unlikeliest of places: on the pickleball court. </p><p>Through a bizarre twist of fate, Dusty ends up joining a pickleball quartet made up of older women, where he quickly develops a crush on their charismatic leader (Mary Steenburgen). But his newfound passion for the sport comes with high stakes, as he’s forced to face off against his longtime nemesis with the future of his father's country club hanging in the balance. The film also features Chloe Fineman, Patton Oswalt, Fortune Feimster, Chris Parnell, Ben Stiller, and a scene-stealing Aaron Chen as Dusty’s trusty sidekick.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow"><em><strong>"The Dink" on Apple TV</strong></em></a><em><strong> now</strong></em></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 lowest-grossing Star Wars movie in history made its way to paid-video-on-demand platforms this week. You're better off waiting for it to arrive on Disney+ in a few months, but if you need your Baby Yoda fix now, have at it. "Star Wars: The Mandalorian and Grogu" never quite justifies its full-length movie treatment, feeling instead like a mini "Mandalorian" marathon retrofitted to the big screen, which might explain the poor theatrical performance.  </p><p>The galaxy's dreamiest bounty hunter and his pint-sized companion return for a new adventure. Din Djarin (Pedro Pascal) and Grogu take on a mission for the New Republic to rescue Rotta the Hutt (voiced by "The Bear's" Jeremy Allen White), Jabba's heir, from a rival crime syndicate to get some juicy intel on an Imperial warlord. Their assignment spirals into a galaxy-spanning adventure filled with all the blaster fights and Force magic you'd expect of a Star Wars outing. </p><p><em><strong>Buy or rent "Star Wars: The Mandalorian and Grogu" on </strong></em><a href="https://tv.apple.com/us/movie/star-wars-the-mandalorian-and-grogu/umc.cmc.31m58rsmdk9f165zgt7vawkxk" target="_blank" rel="nofollow"><em><strong>Apple</strong></em></a><em><strong> or </strong></em><a href="https://tv.apple.com/us/movie/star-wars-the-mandalorian-and-grogu/umc.cmc.31m58rsmdk9f165zgt7vawkxk" target="_blank" rel="nofollow"><em><strong>Amazon</strong></em></a><em><strong> now</strong></em></p><h2 id="avatar-aang-the-last-airbender-paramount">'Avatar Aang: The Last Airbender' (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/RrYIrktLthc" allowfullscreen=""></iframe></div></div><p>Did we really need more of Team Avatar? Eh. Debatable. Will I be sat down to watch this weekend? Absolutely. If only to see Toph (voiced by Dionee Quan) get the epic fight scenes we all hoped for in "The Legend of Korra." Directed by Lauren Montgomery, the film takes place after the events of the original animated series and follows an older Avatar Aang (voiced by Eric Nam), now grown up and setting out with his friends on a mission to rebuild the long-lost Air Nation. </p><p>To do that, he'll need an ancient power that could save his culture from extinction, but if it falls into the wrong hands first, it spells doom for the Air Nation's future. Expanding the world of “Avatar” with a new chapter in Aang’s journey, this has all the makings of an essential watch for longtime fans.</p><p><em><strong>Watch </strong></em><a href="https://www.paramountplus.com/movies/video/ALVE01KRF3YJMCEJB92T78193MJ4HP/" target="_blank" rel="nofollow"><em><strong>"Avatar Aang: The Last Airbender" on Paramount+</strong></em></a><em><strong> now</strong></em></p><h2 id="wicked-for-good-netflix">'Wicked: For Good' (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/vt98AlBDI9Y" allowfullscreen=""></iframe></div></div><p>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> just landed on Netflix — though if you ask me, there are <a href="https://www.tomsguide.com/entertainment/netflix/wicked-for-good-just-landed-on-netflix-but-these-3-musicals-are-even-better">much better musicals on Netflix</a> that are more worth your time. Let's be real, all the best "Wicked" songs are in the first act, so "For Good" was never going to stack up, but it was still a satisfying conclusion for the story of Elphaba (Cynthia Erivo) and Glinda (Ariana Grande) with plenty of earworms and big-budget set pieces to dazzle you into a stupor. </p><p>"For Good" picks up right after "Wicked's" dramatic conclusion, with Elphaba now in her Wicked Witch of the West era on the run from the Wizard (Jeff Goldblum). Many of her old pals from Shiz now lead the mob calling for her head, though others lead the search only to find her before they do. Glinda and Elphaba clash over the Wizard's true intentions and what's best for Oz, but when a mysterious storm sends a young girl from Kansas (and her little dog too) crashing into their world, it puts their already strained relationship to the ultimate test. </p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/83077841" target="_blank" rel="nofollow"><em><strong>"Wicked: For Good" on Netflix</strong></em></a><em><strong> now</strong></em></p><h2 id="the-wild-robot-prime-video">'The Wild Robot' (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/67vbA5ZJdKQ" allowfullscreen=""></iframe></div></div><p>"The Wild Robot" is one of several animated movies I refuse to shut up about, so when I saw it landed on Prime Video this week, I knew I had to give it a shout-out. With Chris Sanders, the same creative tour de force behind "Lilo &amp; Stitch" and "How to Train Your Dragon," at the wheel, you know you're in for a treat. This DreamWorks treasure had me full-on ugly crying in the theater when it came out, thanks in large part to Lupita Nyong’o’s deeply moving performance as Roz, a lost robot turned reluctant parent to an orphaned gosling (Kit Conner). </p><p>Also along for the ride is everyone's favorite zaddy, Pedro Pascal, as a fox that could give Nick Wilde a run for money. Oh, and Matt Berry makes a cameo as a beaver — I'm letting y'all know so you don't get jump scared like I was. It's your standard fish out of water tale, beautifully told with gorgeous animation that easily rivals the "Spider-Verse" films in both style and ambition. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0DBZCXSVS" target="_blank" rel="nofollow"><em><strong>"The Wild Robot" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X7A1vW"></div>                            </div>                            <script src="https://kwizly.com/embed/X7A1vW.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/prime-video/3-best-new-to-prime-video-movies-you-should-stream-this-weekend-july-24-26">3 best new to Prime Video movies you should stream this weekend (July 24-26)</a></li><li><a href="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">8 new movies and shows to watch this weekend on Netflix, Prime Video and more (July 24-26)</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-new-to-netflix-movies-you-should-stream-this-weekend-july-24-26">3 best new to Netflix movies you should stream this weekend (July 24-26)</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>
                                                                                                <dc:content><![CDATA[ <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-2">‘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-2">‘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"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/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> ]]></dc:content>
                                                                                                                                            <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-1920-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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/2BBxi4XKw9kzPB8ePSZPYZ-1920-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-1920-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-2">‘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-2">‘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"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/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[ Apple TV's new crime thriller show features two of my favorite actors but not much else ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: "Lucky" episodes 1-2</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: 2/5 Stars</strong></li><li><strong>Verdict: </strong>"Lucky" promises a crime thriller centered on Anya Taylor-Joy's titular character. But its two-episode premiere is often a trope-laden copy of better crime thrillers. Worst of all, it fails to engage the viewer, though the climax of episode 2 offers some promise.</li><li><strong>Premiere date/time:</strong> Episodes 1-2 streaming now</li><li><strong>Streaming service/channel:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Streaming on Apple TV</a></li></ul></p></div></div><p>"<strong>Lucky</strong>" felt like an easy win for <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>. It's a crime thriller miniseries starring Anya Taylor-Joy, Annette Bening, and Timothy Olyphant. As evidenced by the <a href="https://www.tomsguide.com/entertainment/streaming/i-watch-dozens-of-new-shows-every-year-and-these-are-the-5-emmy-nominees-you-need-to-stream-right-now">2026 Emmy nominations</a>, Apple has done more with less. I was eager to see how this tense thriller would play out.</p><p>Unfortunately, a little under two hours later, I turned off the TV, underwhelmed and uninterested in watching more. While it has a promising premise, this series feels like one crime thriller trope after another. Aunjanue Ellis-Taylor's Agent Billie Rand is almost criminally uninspired. It brings nothing new to the archetype of a "hardass" cop that has a score to settle.</p><p>In this case, the score to settle is with Priscilla Matheson (Annette Bening). Though upon further prodding from Rand's boss, it seems the FBI agent really wants to take down Wayne Whittaker (William Fitchner). </p><p>Through the nearly 100 minutes we watch between the two episodes in this series premiere, Whittaker is perhaps the only intriguing character we're introduced to. We only get a brief scene with him, but he seems to have an evil within him that the others in this show don't possess. Which is saying something, given that even our protagonist, the titular Lucky (Taylor-Joy), is a con woman who stole millions of dollars and kills a man with a screwdriver in the first episode. There are no good guys here, and only a few good characters.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><p><em><strong>Spoilers ahead for "Lucky" series premiere (episodes 1-2)</strong></em></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:14.80%;"><img id="4qkPkyt7YheYgpg43NfzSY" name="TG_Spoiler_Warning_2.jpg" alt="An image indicating spoilers are ahead." src="https://cdn.mos.cms.futurecdn.net/4qkPkyt7YheYgpg43NfzSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="296" 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><h2 id="lucky-feels-like-a-book-adaptation">'Lucky' feels like a book adaptation</h2><p>Something really popular in Hollywood right now is to adapt popular novels. I probably don't even need to tell you this. Whether it's "Big Little Lies," "Little Fires Everywhere" or "Tiny Beautiful Things," adapting novels into movies and shows is more prolific than ever. </p><p>And I picked those three examples because they're all produced by Reese Witherspoon's Hello Sunshine company, which also produced "Lucky."</p><p>Now, I'm not here to say that this show is bad because it's produced by Hello Sunshine. Witherspoon's company also produced "Gone Girl," a certified critical and commercial hit. But this show feels like it's a book adaptation, and I don't mean that as a compliment.</p><p>The premise for "Lucky" is relatively simple. Lucky Armstrong and her partner/husband, Cary (Drew Starkey), have robbed someone of a suitcase full of cash. They have to leave the country the next morning or risk being caught. The next morning, Lucky wakes up late to discover Cary has left with the cash, leaving her to the wolves. </p><p>The wolves aren't just the police (or, more accurately, the FBI). There's Priscilla (Bening), who is not just the person Lucky and Cary robbed, but also Cary's mother. She has a past with two men: Wayne Whittaker, whose money was really stolen, and John Armstrong, Lucky's dad, who is also a conman and currently in prison.</p><p>Those are the bones of a compelling crime thriller. But for most of the two episodes released so far, we're mostly just following Lucky as she runs from the FBI and Priscilla. There are some scenes with other POV characters, but not many. Especially in the first episode, which is almost just one extended chase.</p><p>This felt like a case of the script following the book too closely. I wish the show had spent far more time with the other players in this game of cat and mouse, instead of an extended scene of Lucky playing pretend big sister for some girls out in the desert. It got to the point where I wrote in my notes, "Is this a book adaptation?" Sure enough, it is.</p><h2 id="verdict-this-crime-thriller-s-luck-has-run-out">Verdict: This crime thriller's luck has run out</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/GAbT5qCTXR8" allowfullscreen=""></iframe></div></div><p>Maybe you'll have had a better time with "Lucky" than I did. Maybe I'm too harsh on it for bringing nothing new to the table. But ultimately, I not only don't want to watch another episode, but I'd much rather just watch something else. </p><p>Which is a shame, because there are a few scenes that show some promise. The final climactic scene of episode 2 is probably the most engaging of the entire series to date. So there is part of me that wonders if I shouldn't stick with it to see if things get better.</p><p>But a larger part of me senses that this crime thriller is afraid to break away from its source material. It's unwilling to be too different, even if it ultimately produces more engaging TV. </p><p>So, for the first time, I'm recommending you don't watch something that has Timothy Olyphant in it. And for those who know me, that's about as damning an indictment of a show that I can possibly give.</p><p><strong></strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Stream "Lucky" on Apple TV</strong></em></a></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/streaming/i-watch-dozens-of-new-shows-every-year-and-these-are-the-5-emmy-nominees-you-need-to-stream-right-now">I watch dozens of new shows every year and these are the 5 Emmy nominees you need to stream right now</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/gail-daughtry-and-the-celebrity-sex-pass-review">‘Gail Daughtry and the Celebrity Sex Pass’ review: Not even a ‘Mad Men’ reunion can save this movie</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/silo-season-3-everything-we-know-so-far">'Silo' season 3: release date confirmed, first trailer, cast, plot speculation and more</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-new-crime-thriller-show-features-two-of-my-favorite-actors-but-not-much-else</link>
                                                                            <description>
                            <![CDATA[ Starring Anya Taylor-Joy, Annette Bening and Timothy Olyphant, "Lucky" features an incredible cast. Unfortunately, the Apple TV crime thriller series offers little else in its two-episode premiere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TzvuonUo6DwbCZpiad6i2J</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Gogm98dvmmskTSRVUtKW6T-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Jul 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/Gogm98dvmmskTSRVUtKW6T-1920-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Anya Taylor-Joy as Lucky in &quot;Lucky&quot; episode 2 on Apple TV]]></media:description>                                                            <media:text><![CDATA[Anya Taylor-Joy as Lucky in &quot;Lucky&quot; episode 2 on Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Anya Taylor-Joy as Lucky in &quot;Lucky&quot; episode 2 on Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Gogm98dvmmskTSRVUtKW6T-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: "Lucky" episodes 1-2</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: 2/5 Stars</strong></li><li><strong>Verdict: </strong>"Lucky" promises a crime thriller centered on Anya Taylor-Joy's titular character. But its two-episode premiere is often a trope-laden copy of better crime thrillers. Worst of all, it fails to engage the viewer, though the climax of episode 2 offers some promise.</li><li><strong>Premiere date/time:</strong> Episodes 1-2 streaming now</li><li><strong>Streaming service/channel:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Streaming on Apple TV</a></li></ul></p></div></div><p>"<strong>Lucky</strong>" felt like an easy win for <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>. It's a crime thriller miniseries starring Anya Taylor-Joy, Annette Bening, and Timothy Olyphant. As evidenced by the <a href="https://www.tomsguide.com/entertainment/streaming/i-watch-dozens-of-new-shows-every-year-and-these-are-the-5-emmy-nominees-you-need-to-stream-right-now">2026 Emmy nominations</a>, Apple has done more with less. I was eager to see how this tense thriller would play out.</p><p>Unfortunately, a little under two hours later, I turned off the TV, underwhelmed and uninterested in watching more. While it has a promising premise, this series feels like one crime thriller trope after another. Aunjanue Ellis-Taylor's Agent Billie Rand is almost criminally uninspired. It brings nothing new to the archetype of a "hardass" cop that has a score to settle.</p><p>In this case, the score to settle is with Priscilla Matheson (Annette Bening). Though upon further prodding from Rand's boss, it seems the FBI agent really wants to take down Wayne Whittaker (William Fitchner). </p><p>Through the nearly 100 minutes we watch between the two episodes in this series premiere, Whittaker is perhaps the only intriguing character we're introduced to. We only get a brief scene with him, but he seems to have an evil within him that the others in this show don't possess. Which is saying something, given that even our protagonist, the titular Lucky (Taylor-Joy), is a con woman who stole millions of dollars and kills a man with a screwdriver in the first episode. There are no good guys here, and only a few good characters.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><p><em><strong>Spoilers ahead for "Lucky" series premiere (episodes 1-2)</strong></em></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:14.80%;"><img id="4qkPkyt7YheYgpg43NfzSY" name="TG_Spoiler_Warning_2.jpg" alt="An image indicating spoilers are ahead." src="https://cdn.mos.cms.futurecdn.net/4qkPkyt7YheYgpg43NfzSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="296" 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><h2 id="lucky-feels-like-a-book-adaptation">'Lucky' feels like a book adaptation</h2><p>Something really popular in Hollywood right now is to adapt popular novels. I probably don't even need to tell you this. Whether it's "Big Little Lies," "Little Fires Everywhere" or "Tiny Beautiful Things," adapting novels into movies and shows is more prolific than ever. </p><p>And I picked those three examples because they're all produced by Reese Witherspoon's Hello Sunshine company, which also produced "Lucky."</p><p>Now, I'm not here to say that this show is bad because it's produced by Hello Sunshine. Witherspoon's company also produced "Gone Girl," a certified critical and commercial hit. But this show feels like it's a book adaptation, and I don't mean that as a compliment.</p><p>The premise for "Lucky" is relatively simple. Lucky Armstrong and her partner/husband, Cary (Drew Starkey), have robbed someone of a suitcase full of cash. They have to leave the country the next morning or risk being caught. The next morning, Lucky wakes up late to discover Cary has left with the cash, leaving her to the wolves. </p><p>The wolves aren't just the police (or, more accurately, the FBI). There's Priscilla (Bening), who is not just the person Lucky and Cary robbed, but also Cary's mother. She has a past with two men: Wayne Whittaker, whose money was really stolen, and John Armstrong, Lucky's dad, who is also a conman and currently in prison.</p><p>Those are the bones of a compelling crime thriller. But for most of the two episodes released so far, we're mostly just following Lucky as she runs from the FBI and Priscilla. There are some scenes with other POV characters, but not many. Especially in the first episode, which is almost just one extended chase.</p><p>This felt like a case of the script following the book too closely. I wish the show had spent far more time with the other players in this game of cat and mouse, instead of an extended scene of Lucky playing pretend big sister for some girls out in the desert. It got to the point where I wrote in my notes, "Is this a book adaptation?" Sure enough, it is.</p><h2 id="verdict-this-crime-thriller-s-luck-has-run-out">Verdict: This crime thriller's luck has run out</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/GAbT5qCTXR8" allowfullscreen=""></iframe></div></div><p>Maybe you'll have had a better time with "Lucky" than I did. Maybe I'm too harsh on it for bringing nothing new to the table. But ultimately, I not only don't want to watch another episode, but I'd much rather just watch something else. </p><p>Which is a shame, because there are a few scenes that show some promise. The final climactic scene of episode 2 is probably the most engaging of the entire series to date. So there is part of me that wonders if I shouldn't stick with it to see if things get better.</p><p>But a larger part of me senses that this crime thriller is afraid to break away from its source material. It's unwilling to be too different, even if it ultimately produces more engaging TV. </p><p>So, for the first time, I'm recommending you don't watch something that has Timothy Olyphant in it. And for those who know me, that's about as damning an indictment of a show that I can possibly give.</p><p><strong></strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Stream "Lucky" on Apple TV</strong></em></a></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/streaming/i-watch-dozens-of-new-shows-every-year-and-these-are-the-5-emmy-nominees-you-need-to-stream-right-now">I watch dozens of new shows every year and these are the 5 Emmy nominees you need to stream right now</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/gail-daughtry-and-the-celebrity-sex-pass-review">‘Gail Daughtry and the Celebrity Sex Pass’ review: Not even a ‘Mad Men’ reunion can save this movie</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/silo-season-3-everything-we-know-so-far">'Silo' season 3: release date confirmed, first trailer, cast, plot speculation and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple TV just gave 4K upgrades to nearly 50 TV shows: here's the full list ]]></title>
                                                                                                <dc:content><![CDATA[ <p>TV shows on Apple TV are finally catching up with the movies as Apple is reportedly rolling out free 4K upgrades for purchases. At least 49 shows have been upgraded to 4K SDR in the Apple TV app.</p><p>The news comes from Apple TV enthusiast <a href="https://x.com/sigjudge/status/2073017542738579919?s=12" target="_blank">Sigmund Judge on X,</a> who first spotted the update. The current list includes 49 TV shows, including popular shows like "Mad Men," "Star Trek: Strange New Worlds" and "RuPaul's Drag Race UK." </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVo9JO"></div>                            </div>                            <script src="https://kwizly.com/embed/WVo9JO.js" async=""></script><p>The upgraded shows have been upgraded in the US, UK and maybe other regions, you'll need to check your library. </p><p>Apple has been offering 4K upgrades for movies purchased in Apple TV since at least 2017 when the first Apple TV 4K streaming box launched. The upgrades pushed movies to 4K and HDR for free. Later the company added Dolby Atmos, HDR10+ and 3D 4K. </p><p>Here's the current list:</p><ul><li>Aerial Australia</li><li>Aftertaste S1</li><li>American Magik S1</li><li>Auto Exotica S2</li><li>The Basement Talks S1</li><li>Black, Brilliant, and Bold S1</li><li>Blossoms Shanghai S1</li><li>Bong Zombies S1</li><li>Building Nations S1</li><li>Car &amp; Country Quest S1</li><li>Changing of the Gods S1</li><li>Chasing the Tide S1</li><li>Claire-ity S1</li><li>Clash of Dynasties: St. Edward vs Walsh Jesuit</li><li>The Coroner's Assistant S1</li><li>Drink: A Look Inside the Glass S1</li><li>The Envoy, Pilot</li><li>The Eternal White S1</li><li>Extreme Airport Africa S2</li><li>Founder S1</li><li>Gatherings S1</li><li>Gentle and Lowly Video Study S1</li><li>Guerrera S1</li><li>Gus Plus Us S1</li><li>Heated Rivalry S1</li><li>Honor Guard S1</li><li>Hunting to Save the Rhinos S1</li><li>The Hunting Wives S1</li><li>Ice Airport Alaska S5</li><li>Killer Whales S2</li><li>Legacy Makers S1</li><li>Mad Men S1-7</li><li>Missionary: Obeying the Great Commission S1</li><li>My Name is Anxiety S1</li><li>Office Joe S1</li><li>Perfect Sweat S1</li><li>Q: Into the Storm</li><li>The Religion Business and the Nonprofit Goliath S1</li><li>Rich Africans S1</li><li>RuPaul's Drag Race UK S5</li><li>The RVers S3, 4</li><li>Selling Superman S1</li><li>Sexpectations S1</li><li>Star Trek: Strange New Worlds S1</li><li>That’s Wine S1</li><li>Third Shift</li><li>Tractor Ted S3</li><li>The Twilight Zone (Reboot) S1</li><li>The Wingfeather Saga S2</li></ul><p>As a reminder, these are for purchased shows in the Apple TV app/iTunes Store. </p><p>Have you noticed any other shows upgraded to 4K in your Apple Account? Let us know in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-might-beat-iphone-ultra-at-its-own-game-heres-how">Samsung Galaxy Z Fold 8 might beat iPhone Ultra at its own game — here's how</a></li><li><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">Kuo: iPhone Ultra will ship after iPhone 18 Pro and still 'sell out immediately' with $2,300 - $2,500 price</a></li><li><a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-almost-certainly-hinted-at-in-ios-27-code-and-they-could-be-a-huge-audio-and-camera-upgrade">AirPods Ultra 'almost certainly' hinted at in iOS 27 code — and they could be a huge audio (and camera) upgrade</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/apple-just-gave-4k-upgrades-to-nearly-50-tv-shows-heres-the-full-list</link>
                                                                            <description>
                            <![CDATA[ Nearly 50 shows on Apple TV are getting 4K upgrades for free including Mad Men. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">35UPg3wfKFMxx5zi3dAmKV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 06 Jul 2026 18:05:34 +0000</pubDate>                                                                                                                                <updated>Mon, 06 Jul 2026 18:14:48 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></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-320-70.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/hrTBe4yDuQUeE7F6eLMCvS-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV on a sunset background]]></media:description>                                                            <media:text><![CDATA[Apple TV on a sunset background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV on a sunset background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>TV shows on Apple TV are finally catching up with the movies as Apple is reportedly rolling out free 4K upgrades for purchases. At least 49 shows have been upgraded to 4K SDR in the Apple TV app.</p><p>The news comes from Apple TV enthusiast <a href="https://x.com/sigjudge/status/2073017542738579919?s=12" target="_blank">Sigmund Judge on X,</a> who first spotted the update. The current list includes 49 TV shows, including popular shows like "Mad Men," "Star Trek: Strange New Worlds" and "RuPaul's Drag Race UK." </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVo9JO"></div>                            </div>                            <script src="https://kwizly.com/embed/WVo9JO.js" async=""></script><p>The upgraded shows have been upgraded in the US, UK and maybe other regions, you'll need to check your library. </p><p>Apple has been offering 4K upgrades for movies purchased in Apple TV since at least 2017 when the first Apple TV 4K streaming box launched. The upgrades pushed movies to 4K and HDR for free. Later the company added Dolby Atmos, HDR10+ and 3D 4K. </p><p>Here's the current list:</p><ul><li>Aerial Australia</li><li>Aftertaste S1</li><li>American Magik S1</li><li>Auto Exotica S2</li><li>The Basement Talks S1</li><li>Black, Brilliant, and Bold S1</li><li>Blossoms Shanghai S1</li><li>Bong Zombies S1</li><li>Building Nations S1</li><li>Car &amp; Country Quest S1</li><li>Changing of the Gods S1</li><li>Chasing the Tide S1</li><li>Claire-ity S1</li><li>Clash of Dynasties: St. Edward vs Walsh Jesuit</li><li>The Coroner's Assistant S1</li><li>Drink: A Look Inside the Glass S1</li><li>The Envoy, Pilot</li><li>The Eternal White S1</li><li>Extreme Airport Africa S2</li><li>Founder S1</li><li>Gatherings S1</li><li>Gentle and Lowly Video Study S1</li><li>Guerrera S1</li><li>Gus Plus Us S1</li><li>Heated Rivalry S1</li><li>Honor Guard S1</li><li>Hunting to Save the Rhinos S1</li><li>The Hunting Wives S1</li><li>Ice Airport Alaska S5</li><li>Killer Whales S2</li><li>Legacy Makers S1</li><li>Mad Men S1-7</li><li>Missionary: Obeying the Great Commission S1</li><li>My Name is Anxiety S1</li><li>Office Joe S1</li><li>Perfect Sweat S1</li><li>Q: Into the Storm</li><li>The Religion Business and the Nonprofit Goliath S1</li><li>Rich Africans S1</li><li>RuPaul's Drag Race UK S5</li><li>The RVers S3, 4</li><li>Selling Superman S1</li><li>Sexpectations S1</li><li>Star Trek: Strange New Worlds S1</li><li>That’s Wine S1</li><li>Third Shift</li><li>Tractor Ted S3</li><li>The Twilight Zone (Reboot) S1</li><li>The Wingfeather Saga S2</li></ul><p>As a reminder, these are for purchased shows in the Apple TV app/iTunes Store. </p><p>Have you noticed any other shows upgraded to 4K in your Apple Account? Let us know in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-might-beat-iphone-ultra-at-its-own-game-heres-how">Samsung Galaxy Z Fold 8 might beat iPhone Ultra at its own game — here's how</a></li><li><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">Kuo: iPhone Ultra will ship after iPhone 18 Pro and still 'sell out immediately' with $2,300 - $2,500 price</a></li><li><a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-almost-certainly-hinted-at-in-ios-27-code-and-they-could-be-a-huge-audio-and-camera-upgrade">AirPods Ultra 'almost certainly' hinted at in iOS 27 code — and they could be a huge audio (and camera) upgrade</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘Silo’ season 3 premiere review: I dreaded this sci-fi cliché but somehow it absolutely works ]]></title>
                                                                                                <dc:content><![CDATA[ <p>After a year and a half away, "Silo" returns with a challenge that every prestige streaming drama eventually faces: How do you pick up the pieces after a finale that left viewers with 100 unanswered questions? If you're anything like me, you'll probably want to watch a recap before diving back in. Season 2 ended in a flurry of revelations and plot movements, and the details might feel a bit fuzzy.</p><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Silo' season 3</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: </strong>4.5/5 stars</p><p class="fancy-box__body-text"><strong>Verdict:</strong> "Silo" returns with a smart, intriguing premiere that confidently resets the board and ups the momentum with flashbacks to the past. If the rest of the season delivers on the mysteries set up here, the road to the series finale is looking very promising.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episode 1 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/silo/umc.cmc.3yksgc857px0k0rqe5zd4jice" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>Fortunately, season 3 doesn't expect you to remember everything. Instead, it takes an unexpectedly clever approach by dropping us into Silo 18 in a way that makes it feel just as unfamiliar to us as it does to Juliette Nichols (Rebecca Ferguson).</p><p>After watching the premiere episode, I'm already convinced the Apple TV sci-fi drama hasn't lost its touch. If anything, it feels like a show that's finally shifting from asking questions to answer them — and setting the pieces in place for the endgame. <br /><em><strong>Very light spoilers for "Silo" season 3 episode 1 ahead.</strong></em></p><h2 id="juliette-digs-into-a-new-mystery-and-so-do-we">Juliette digs into a new mystery — and so do we</h2><p>Picking up three months after last season's explosive finale, Silo 18 has reorganized itself in ways that are new to us. Juliette doesn’t recognize it either, because she has amnesia after surviving the fire. She’s now the mayor, apparently, and the rebellion seems to be over.</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/BLBvbMtjyAQ" allowfullscreen=""></iframe></div></div><p>Amnesia is hardly the freshest storytelling device. I’ve seen enough “who am I?” storylines to last several lifetimes underground. But it actually works here because it isn’t just a gimmick meant to tread water; Juliette’s confusion becomes our own and we’re invited to play detective alongside her. </p><p>Every interaction hints that something is off. Camille (Alexandria Riley) is the new head of IT and a much more powerful player, with direct access to the Algorithm and the savviness to manipulate Juliette. Then there’s Camille’s husband and new Judge, Sims (Common), who is still as menacing as ever. Even Juliette’s friends, like Shirley (Remmie Milner) and Knox (Shane McRae), behave strangely around her. She may be back home, but Juliette once again must figure out who has key information and who can actually be trusted.</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="dBdcAdYubsvmpBvCUv7gB6" name="silo-s3" alt="Ashley Zukerman and Jessica Henwick in Silo season 3" src="https://cdn.mos.cms.futurecdn.net/dBdcAdYubsvmpBvCUv7gB6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>And then there’s the Before Times storyline, which I didn’t expect to be this intrigued by so quickly. For two seasons, the biggest question hanging over the series hasn't just been what's outside the silo, but why humanity ended up underground in the first place.</p><p>Finally beginning to explore that history adds fresh energy, especially in key figures like Congressman Daniel (Ashley Zukerman) and journalist Helen (Jessica Henwick), who stumble upon an unfolding conspiracy. Their storyline, alongside glimpses of political and military actions, hints at how decisions made in the Before Times ripple forward into the silos, making the past feel just as relevant as the present.</p><h2 id="verdict-silo-season-3-hits-the-accelerator">Verdict: ‘Silo’ season 3 hits the accelerator</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2816px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kTSuBRqe3XxDFXmLrgygZL" name="SIlo_Photo_030105" alt="Rebecca Ferguson in "Silo," premiering July 3, 2026 on Apple TV." src="https://cdn.mos.cms.futurecdn.net/kTSuBRqe3XxDFXmLrgygZL-1920-80.png" mos="" align="middle" fullscreen="" width="2816" height="1584" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>I’ve never read Hugh Howey’s books, so I have no expectations of fidelity to the page. But as a viewer, I can feel the show shifting from “what’s happening in the silo?” to “why has all of this happened?” and that’s a much more compelling direction than just stacking new mysteries on old ones. There's real momentum here.</p><p>Rebecca Ferguson remains the show's not-so-secret weapon. Even with Juliette stripped of her memories, Ferguson grounds every scene with the same stubborn determination she’s had from the beginning. Watching Juliette slowly realize that something about her new reality doesn't add up is every bit as gripping as seeing her go outside to “clean.”</p><p>Of course, one episode isn't enough to judge an entire season, but as premieres go, this is an excellent one. It smartly avoids the temptation to tell, not show, and lets us into the mysteries as if this is an RPG. If the rest of season 3 can build on the intrigue established here, I’m excited to keep watching. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/silo-season-3-premiere-review-i-dreaded-this-sci-fi-cliche-but-somehow-it-absolutely-works</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in June 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MfuuqoQAAtfxMSFjffMsRb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/C3pJhEQLRrRGfumVBJomDM-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Jul 2026 05:31:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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-320-70.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/C3pJhEQLRrRGfumVBJomDM-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Rebecca Ferguson and Common Silo season 3]]></media:description>                                                            <media:text><![CDATA[Rebecca Ferguson and Common Silo season 3]]></media:text>
                                <media:title type="plain"><![CDATA[Rebecca Ferguson and Common Silo season 3]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/C3pJhEQLRrRGfumVBJomDM-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>After a year and a half away, "Silo" returns with a challenge that every prestige streaming drama eventually faces: How do you pick up the pieces after a finale that left viewers with 100 unanswered questions? If you're anything like me, you'll probably want to watch a recap before diving back in. Season 2 ended in a flurry of revelations and plot movements, and the details might feel a bit fuzzy.</p><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Silo' season 3</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: </strong>4.5/5 stars</p><p class="fancy-box__body-text"><strong>Verdict:</strong> "Silo" returns with a smart, intriguing premiere that confidently resets the board and ups the momentum with flashbacks to the past. If the rest of the season delivers on the mysteries set up here, the road to the series finale is looking very promising.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episode 1 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/silo/umc.cmc.3yksgc857px0k0rqe5zd4jice" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>Fortunately, season 3 doesn't expect you to remember everything. Instead, it takes an unexpectedly clever approach by dropping us into Silo 18 in a way that makes it feel just as unfamiliar to us as it does to Juliette Nichols (Rebecca Ferguson).</p><p>After watching the premiere episode, I'm already convinced the Apple TV sci-fi drama hasn't lost its touch. If anything, it feels like a show that's finally shifting from asking questions to answer them — and setting the pieces in place for the endgame. <br /><em><strong>Very light spoilers for "Silo" season 3 episode 1 ahead.</strong></em></p><h2 id="juliette-digs-into-a-new-mystery-and-so-do-we">Juliette digs into a new mystery — and so do we</h2><p>Picking up three months after last season's explosive finale, Silo 18 has reorganized itself in ways that are new to us. Juliette doesn’t recognize it either, because she has amnesia after surviving the fire. She’s now the mayor, apparently, and the rebellion seems to be over.</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/BLBvbMtjyAQ" allowfullscreen=""></iframe></div></div><p>Amnesia is hardly the freshest storytelling device. I’ve seen enough “who am I?” storylines to last several lifetimes underground. But it actually works here because it isn’t just a gimmick meant to tread water; Juliette’s confusion becomes our own and we’re invited to play detective alongside her. </p><p>Every interaction hints that something is off. Camille (Alexandria Riley) is the new head of IT and a much more powerful player, with direct access to the Algorithm and the savviness to manipulate Juliette. Then there’s Camille’s husband and new Judge, Sims (Common), who is still as menacing as ever. Even Juliette’s friends, like Shirley (Remmie Milner) and Knox (Shane McRae), behave strangely around her. She may be back home, but Juliette once again must figure out who has key information and who can actually be trusted.</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="dBdcAdYubsvmpBvCUv7gB6" name="silo-s3" alt="Ashley Zukerman and Jessica Henwick in Silo season 3" src="https://cdn.mos.cms.futurecdn.net/dBdcAdYubsvmpBvCUv7gB6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>And then there’s the Before Times storyline, which I didn’t expect to be this intrigued by so quickly. For two seasons, the biggest question hanging over the series hasn't just been what's outside the silo, but why humanity ended up underground in the first place.</p><p>Finally beginning to explore that history adds fresh energy, especially in key figures like Congressman Daniel (Ashley Zukerman) and journalist Helen (Jessica Henwick), who stumble upon an unfolding conspiracy. Their storyline, alongside glimpses of political and military actions, hints at how decisions made in the Before Times ripple forward into the silos, making the past feel just as relevant as the present.</p><h2 id="verdict-silo-season-3-hits-the-accelerator">Verdict: ‘Silo’ season 3 hits the accelerator</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2816px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kTSuBRqe3XxDFXmLrgygZL" name="SIlo_Photo_030105" alt="Rebecca Ferguson in "Silo," premiering July 3, 2026 on Apple TV." src="https://cdn.mos.cms.futurecdn.net/kTSuBRqe3XxDFXmLrgygZL-1920-80.png" mos="" align="middle" fullscreen="" width="2816" height="1584" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>I’ve never read Hugh Howey’s books, so I have no expectations of fidelity to the page. But as a viewer, I can feel the show shifting from “what’s happening in the silo?” to “why has all of this happened?” and that’s a much more compelling direction than just stacking new mysteries on old ones. There's real momentum here.</p><p>Rebecca Ferguson remains the show's not-so-secret weapon. Even with Juliette stripped of her memories, Ferguson grounds every scene with the same stubborn determination she’s had from the beginning. Watching Juliette slowly realize that something about her new reality doesn't add up is every bit as gripping as seeing her go outside to “clean.”</p><p>Of course, one episode isn't enough to judge an entire season, but as premieres go, this is an excellent one. It smartly avoids the temptation to tell, not show, and lets us into the mysteries as if this is an RPG. If the rest of season 3 can build on the intrigue established here, I’m excited to keep watching. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm finding ways around Apple's devastating price hikes — grab MacBooks, iPads and more at pre-RAMageddon costs ]]></title>
                                                                                                <dc:content><![CDATA[ <p>RAMageddon just claimed another victim, as <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple raised the prices of Macs, iPads, Apple TVs and HomePods by up to $1,300/£1,300</a>. iPhones have not been hit, but it seems pretty damning that we can expect the iPhone 18 family to get a hike.</p><p>CEO Tim Cook <a href="https://www.tomsguide.com/phones/iphones/apple-ceo-tim-cook-confirmed-price-hikes-are-unavoidable-so-get-ready-to-pay-more">did warn us</a> that soaring memory costs had made increases “unavoidable,” and it’s finally happened. That makes this Prime Day the most important of the past decade, because while the prices are higher on Apple’s own website, all the discounts on these products are still available on Amazon and elsewhere.</p><p>So I cannot overstate it enough — this is the last chance to buy Apple tech at normal prices before things go out of control. If you’ve been on the fence about it, now’s the time to buy.</p><h2 class="article-body__section" id="section-ipad-savings"><span>iPad savings</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="P2onUe3S65XPF97vszhBNX" name="iPad Air M4 held in portrait mode" alt="iPad Air M4 held in portrait mode" src="https://cdn.mos.cms.futurecdn.net/P2onUe3S65XPF97vszhBNX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Stock is drying up fast on iPads, as everybody is rushing to buy one at these lower prices before they sell out.</p><h2 id="u-s-prices">U.S. prices 🇺🇸</h2><ul><li><strong>iPad (A16): </strong><a href="https://www.bestbuy.com/product/apple-11-inch-ipad-a16-chip-with-wi-fi-128gb-silver/JJGCQG39VG" target="_blank" rel="nofollow"><strong>was $449 now $349 @ Best Buy</strong></a><strong></strong></li><li><strong>iPad Air M4 (11-inch): </strong><a href="https://www.walmart.com/ip/11-inch-iPad-Air-Wi-Fi-128GB-Blue/19616916251" target="_blank" rel="nofollow"><strong>was $749 now $559 @ Walmart</strong></a><strong></strong></li><li><strong>iPad Pro M5 (11-inch): </strong><a href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><strong>was $1,199 now $899 @ Amazon</strong></a><strong></strong></li><li><strong>iPad Pro M5 (13-inch): </strong><a href="https://www.amazon.com/dp/B0FWD1MT5D" target="_blank" rel="nofollow"><strong>was $1,499 now $1,199 @ Amazon</strong></a><strong></strong></li></ul><h2 id="u-k-prices">U.K. prices 🇬🇧</h2><ul><li><strong>iPad (A16): </strong><a href="https://www.amazon.co.uk/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ76CW2K" target="_blank" rel="nofollow"><strong>was £429 now £314 @ Amazon</strong></a><strong></strong></li><li><strong>iPad mini (A17 Pro): </strong><a href="https://www.amazon.co.uk/dp/B0DK3Z3S7T" target="_blank" rel="nofollow"><strong>was £599 now £475 @ Amazon</strong></a><strong></strong></li><li><strong>iPad Air M4 (11-inch): </strong><a href="https://www.currys.co.uk/products/apple-11-ipad-air-2026-128-gb-space-grey-10292850.html" target="_blank" rel="nofollow"><strong>was £749 now £599 @ Currys</strong></a><strong></strong></li><li><strong>iPad Air M4 (13-inch): </strong><a href="https://www.currys.co.uk/products/apple-13-ipad-air-2026-128-gb-space-grey-10292866.html" target="_blank" rel="nofollow"><strong>was £949 now £799 @ Currys</strong></a><strong></strong></li><li><strong>iPad Pro M5 (11-inch): </strong><a href="https://www.johnlewis.com/2025-apple-ipad-pro-11-inch-m5-processor-ipados-wi-fi-256gb/silver/p114464896" target="_blank" rel="nofollow"><strong>was £1,199 now £999 @ John Lewis</strong></a><strong></strong></li><li><strong>iPad Pro M5 (13-inch): </strong><a href="https://www.johnlewis.com/2025-apple-ipad-pro-13-inch-m5-processor-ipados-wi-fi-256gb/space-black/p114464913" target="_blank" rel="nofollow"><strong>was £1,499 now £1,299 @ John Lewis</strong></a><strong></strong></li></ul><h2 class="article-body__section" id="section-macbook-savings"><span>MacBook savings</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: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-1920-80.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>It looks like everything is still in stock at either original prices or slightly discounted from the new prices at the moment. Don’t expect that to last much longer.</p><h2 id="u-s-prices-2">U.S. prices 🇺🇸</h2><ul><li><strong>MacBook Neo (256GB SSD): </strong><a href="https://www.amazon.com/Apple-2026-MacBook-13-inch-Laptop/dp/B0GR6BVYS5" target="_blank" rel="nofollow"><strong>was $699 now $589 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (13-inch): </strong><a href="https://www.bestbuy.com/product/apple-macbook-air-13-inch-laptop-m5-chip-with-10-core-cpu-and-8-core-gpu-16gb-memory-512gb-ssd-midnight/JJGCQLKXL7" target="_blank" rel="nofollow"><strong>was $1,299 now $1,099 @ Best Buy</strong></a><strong></strong></li><li><strong>MacBook Air M5 (15-inch): </strong><a href="https://www.bestbuy.com/product/apple-macbook-air-15-inch-laptop-m5-chip-with-10-core-cpu-and-10-core-gpu-16gb-memory-512gb-ssd-midnight/JJGCQLKQL9" target="_blank" rel="nofollow"><strong>was $1,499 now $1,299 @ Best Buy</strong></a><strong></strong></li><li><strong>MacBook Pro M5 (14-inch): </strong><a href="https://www.amazon.com/dp/B0FWD623D1" target="_blank" rel="nofollow"><strong>was $1,999 now $1,549 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Pro (14-inch): </strong><a href="https://www.amazon.com/dp/B0GR1JK9W3" target="_blank" rel="nofollow"><strong>was $2,499 now $2,049 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Max (14-inch): </strong><a href="https://www.amazon.com/dp/B0GR1C4TVV" target="_blank" rel="nofollow"><strong>was $4,099 now $3,299 @ Amazon</strong></a><strong></strong></li></ul><h2 id="u-k-prices-2">U.K. prices 🇬🇧</h2><ul><li><strong>MacBook Neo (256GB SSD): </strong><a href="https://www.amazon.co.uk/Apple-MacBook-13-inch-Laptop-chip/dp/B0GR6N7H39" target="_blank" rel="nofollow"><strong>was £699 now £649 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (13-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1B3ZRR" target="_blank" rel="nofollow"><strong>was £1,299 now £988 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (15-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1JFN8Y" target="_blank" rel="nofollow"><strong>was £1,499 now £1,299 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 (14-inch): </strong><a href="https://www.johnlewis.com/2025-apple-macbook-pro-14-m5-processor-16gb-ram-512gb-ssd/space-black/p114464817" target="_blank" rel="nofollow"><strong>was £1,999 now £1,279 @ John Lewis</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Pro (14-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1RWT8S" target="_blank" rel="nofollow"><strong>was £2,499 now £2,013 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Max (14-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1JVT2J" target="_blank" rel="nofollow"><strong>was £4,099 now £3,278 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-mac-desktop-savings"><span>Mac desktop savings</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:2940px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ZxYXBjdFjKnfViyQJc56ib" name="iMac-2023_M3-7.jpg" alt="Apple iMac M4" src="https://cdn.mos.cms.futurecdn.net/ZxYXBjdFjKnfViyQJc56ib-1920-80.jpg" mos="" align="middle" fullscreen="" width="2940" height="1654" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is where things get tricky. After the big OpenClaw haul, Mac mini is just out of stock pretty much everywhere. Not only that, but the Mac Studios are now virtually impossible to come across at the lower rates. Fortunately, the iMac is still going strong.</p><h2 id="u-s-prices-3">U.S. prices 🇺🇸</h2><ul><li><strong>iMac M4: </strong><a href="https://www.bestbuy.com/product/apple-imac-24-inch-all-in-one-m4-chip-built-for-apple-intelligence-8-core-cpu-8-core-gpu-16gb-memory-256gb-ssd-silver/JJGCQ3F4SG" target="_blank" rel="nofollow"><strong>was $1,499 now $1,149 @ Best Buy</strong></a><strong></strong></li></ul><h2 id="u-k-prices-3">U.K. prices 🇬🇧</h2><ul><li><strong>iMac M4: </strong><a href="https://www.amazon.co.uk/dp/B0DL6JM9X1?th=1" target="_blank" rel="nofollow"><strong>was £1,499 now £1,199 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-apple-tv-and-homepod-savings"><span>Apple TV and HomePod savings</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DW7Cb7YncewfSAxQJZPQfi" name="TG_Apple-TV-4K_2021-10.jpg" alt="Apple TV 4K (2021) review" src="https://cdn.mos.cms.futurecdn.net/DW7Cb7YncewfSAxQJZPQfi-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>How much RAM does a HomePod need!? Anyway, my gripes aside, luckily, Apple TVs and HomePods are still available at the original prices elsewhere — except for HomePod mini.</p><h2 id="u-s-prices-4">U.S. prices 🇺🇸</h2><ul><li><strong>Apple TV 4K: </strong><a href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow"><strong>was $199 now $129 @ Walmart</strong></a><strong></strong></li><li><strong>Apple HomePod: </strong><a href="https://www.walmart.com/ip/Apple-Homepod-Midnight-2025-MDEW4LL-A/17036967854" target="_blank" rel="nofollow"><strong>was $349 now $299 @ Walmart</strong></a><strong></strong></li></ul><h2 id="u-k-prices-4">U.K. prices 🇬🇧</h2><ul><li><strong>Apple TV 4K: </strong><a href="https://www.amazon.co.uk/Apple-2022-Apple-Wi%E2%80%91Fi-64GB-storage-generation/dp/B0BJMNZTCK" target="_blank" rel="nofollow"><strong>was £199 now £139 @ Amazon</strong></a><strong></strong></li><li><strong>Apple HomePod: </strong><a href="https://www.argos.co.uk/product/7698044" target="_blank" rel="nofollow"><strong>was £349 now £299 @ Argos</strong></a><strong></strong></li><li><strong>Apple HomePod mini: </strong><a href="https://www.argos.co.uk/product/7698161" target="_blank" rel="nofollow"><strong>was £129 now £99 @ Argos</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&amp;min_discount_ratio=0.95&amp;offer_type=all&amp;view_mode=carousel&amp;widget_title=Top+Deals+Handpicked+by+Our+Editors&amp;widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&amp;bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .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-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    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';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("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;                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/im-finding-ways-around-apples-devastating-price-hikes-grab-macbooks-ipads-and-more-at-pre-ramageddon-costs</link>
                                                                            <description>
                            <![CDATA[ Apple just dramatically increased Mac and iPad prices globally due to RAMageddon. This Prime Day is your last chance to secure pre-hike discounts on Amazon. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">EDu2JNVqBov9TLuzw8UAJg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UXEEXQJLR9k5HVLT7yGztS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 10:04:34 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UXEEXQJLR9k5HVLT7yGztS-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple live blog]]></media:description>                                                            <media:text><![CDATA[Apple live blog]]></media:text>
                                <media:title type="plain"><![CDATA[Apple live blog]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UXEEXQJLR9k5HVLT7yGztS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>RAMageddon just claimed another victim, as <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple raised the prices of Macs, iPads, Apple TVs and HomePods by up to $1,300/£1,300</a>. iPhones have not been hit, but it seems pretty damning that we can expect the iPhone 18 family to get a hike.</p><p>CEO Tim Cook <a href="https://www.tomsguide.com/phones/iphones/apple-ceo-tim-cook-confirmed-price-hikes-are-unavoidable-so-get-ready-to-pay-more">did warn us</a> that soaring memory costs had made increases “unavoidable,” and it’s finally happened. That makes this Prime Day the most important of the past decade, because while the prices are higher on Apple’s own website, all the discounts on these products are still available on Amazon and elsewhere.</p><p>So I cannot overstate it enough — this is the last chance to buy Apple tech at normal prices before things go out of control. If you’ve been on the fence about it, now’s the time to buy.</p><h2 class="article-body__section" id="section-ipad-savings"><span>iPad savings</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="P2onUe3S65XPF97vszhBNX" name="iPad Air M4 held in portrait mode" alt="iPad Air M4 held in portrait mode" src="https://cdn.mos.cms.futurecdn.net/P2onUe3S65XPF97vszhBNX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Stock is drying up fast on iPads, as everybody is rushing to buy one at these lower prices before they sell out.</p><h2 id="u-s-prices">U.S. prices 🇺🇸</h2><ul><li><strong>iPad (A16): </strong><a href="https://www.bestbuy.com/product/apple-11-inch-ipad-a16-chip-with-wi-fi-128gb-silver/JJGCQG39VG" target="_blank" rel="nofollow"><strong>was $449 now $349 @ Best Buy</strong></a><strong></strong></li><li><strong>iPad Air M4 (11-inch): </strong><a href="https://www.walmart.com/ip/11-inch-iPad-Air-Wi-Fi-128GB-Blue/19616916251" target="_blank" rel="nofollow"><strong>was $749 now $559 @ Walmart</strong></a><strong></strong></li><li><strong>iPad Pro M5 (11-inch): </strong><a href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><strong>was $1,199 now $899 @ Amazon</strong></a><strong></strong></li><li><strong>iPad Pro M5 (13-inch): </strong><a href="https://www.amazon.com/dp/B0FWD1MT5D" target="_blank" rel="nofollow"><strong>was $1,499 now $1,199 @ Amazon</strong></a><strong></strong></li></ul><h2 id="u-k-prices">U.K. prices 🇬🇧</h2><ul><li><strong>iPad (A16): </strong><a href="https://www.amazon.co.uk/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ76CW2K" target="_blank" rel="nofollow"><strong>was £429 now £314 @ Amazon</strong></a><strong></strong></li><li><strong>iPad mini (A17 Pro): </strong><a href="https://www.amazon.co.uk/dp/B0DK3Z3S7T" target="_blank" rel="nofollow"><strong>was £599 now £475 @ Amazon</strong></a><strong></strong></li><li><strong>iPad Air M4 (11-inch): </strong><a href="https://www.currys.co.uk/products/apple-11-ipad-air-2026-128-gb-space-grey-10292850.html" target="_blank" rel="nofollow"><strong>was £749 now £599 @ Currys</strong></a><strong></strong></li><li><strong>iPad Air M4 (13-inch): </strong><a href="https://www.currys.co.uk/products/apple-13-ipad-air-2026-128-gb-space-grey-10292866.html" target="_blank" rel="nofollow"><strong>was £949 now £799 @ Currys</strong></a><strong></strong></li><li><strong>iPad Pro M5 (11-inch): </strong><a href="https://www.johnlewis.com/2025-apple-ipad-pro-11-inch-m5-processor-ipados-wi-fi-256gb/silver/p114464896" target="_blank" rel="nofollow"><strong>was £1,199 now £999 @ John Lewis</strong></a><strong></strong></li><li><strong>iPad Pro M5 (13-inch): </strong><a href="https://www.johnlewis.com/2025-apple-ipad-pro-13-inch-m5-processor-ipados-wi-fi-256gb/space-black/p114464913" target="_blank" rel="nofollow"><strong>was £1,499 now £1,299 @ John Lewis</strong></a><strong></strong></li></ul><h2 class="article-body__section" id="section-macbook-savings"><span>MacBook savings</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: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-1920-80.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>It looks like everything is still in stock at either original prices or slightly discounted from the new prices at the moment. Don’t expect that to last much longer.</p><h2 id="u-s-prices-2">U.S. prices 🇺🇸</h2><ul><li><strong>MacBook Neo (256GB SSD): </strong><a href="https://www.amazon.com/Apple-2026-MacBook-13-inch-Laptop/dp/B0GR6BVYS5" target="_blank" rel="nofollow"><strong>was $699 now $589 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (13-inch): </strong><a href="https://www.bestbuy.com/product/apple-macbook-air-13-inch-laptop-m5-chip-with-10-core-cpu-and-8-core-gpu-16gb-memory-512gb-ssd-midnight/JJGCQLKXL7" target="_blank" rel="nofollow"><strong>was $1,299 now $1,099 @ Best Buy</strong></a><strong></strong></li><li><strong>MacBook Air M5 (15-inch): </strong><a href="https://www.bestbuy.com/product/apple-macbook-air-15-inch-laptop-m5-chip-with-10-core-cpu-and-10-core-gpu-16gb-memory-512gb-ssd-midnight/JJGCQLKQL9" target="_blank" rel="nofollow"><strong>was $1,499 now $1,299 @ Best Buy</strong></a><strong></strong></li><li><strong>MacBook Pro M5 (14-inch): </strong><a href="https://www.amazon.com/dp/B0FWD623D1" target="_blank" rel="nofollow"><strong>was $1,999 now $1,549 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Pro (14-inch): </strong><a href="https://www.amazon.com/dp/B0GR1JK9W3" target="_blank" rel="nofollow"><strong>was $2,499 now $2,049 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Max (14-inch): </strong><a href="https://www.amazon.com/dp/B0GR1C4TVV" target="_blank" rel="nofollow"><strong>was $4,099 now $3,299 @ Amazon</strong></a><strong></strong></li></ul><h2 id="u-k-prices-2">U.K. prices 🇬🇧</h2><ul><li><strong>MacBook Neo (256GB SSD): </strong><a href="https://www.amazon.co.uk/Apple-MacBook-13-inch-Laptop-chip/dp/B0GR6N7H39" target="_blank" rel="nofollow"><strong>was £699 now £649 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (13-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1B3ZRR" target="_blank" rel="nofollow"><strong>was £1,299 now £988 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (15-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1JFN8Y" target="_blank" rel="nofollow"><strong>was £1,499 now £1,299 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 (14-inch): </strong><a href="https://www.johnlewis.com/2025-apple-macbook-pro-14-m5-processor-16gb-ram-512gb-ssd/space-black/p114464817" target="_blank" rel="nofollow"><strong>was £1,999 now £1,279 @ John Lewis</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Pro (14-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1RWT8S" target="_blank" rel="nofollow"><strong>was £2,499 now £2,013 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Max (14-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1JVT2J" target="_blank" rel="nofollow"><strong>was £4,099 now £3,278 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-mac-desktop-savings"><span>Mac desktop savings</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:2940px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ZxYXBjdFjKnfViyQJc56ib" name="iMac-2023_M3-7.jpg" alt="Apple iMac M4" src="https://cdn.mos.cms.futurecdn.net/ZxYXBjdFjKnfViyQJc56ib-1920-80.jpg" mos="" align="middle" fullscreen="" width="2940" height="1654" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is where things get tricky. After the big OpenClaw haul, Mac mini is just out of stock pretty much everywhere. Not only that, but the Mac Studios are now virtually impossible to come across at the lower rates. Fortunately, the iMac is still going strong.</p><h2 id="u-s-prices-3">U.S. prices 🇺🇸</h2><ul><li><strong>iMac M4: </strong><a href="https://www.bestbuy.com/product/apple-imac-24-inch-all-in-one-m4-chip-built-for-apple-intelligence-8-core-cpu-8-core-gpu-16gb-memory-256gb-ssd-silver/JJGCQ3F4SG" target="_blank" rel="nofollow"><strong>was $1,499 now $1,149 @ Best Buy</strong></a><strong></strong></li></ul><h2 id="u-k-prices-3">U.K. prices 🇬🇧</h2><ul><li><strong>iMac M4: </strong><a href="https://www.amazon.co.uk/dp/B0DL6JM9X1?th=1" target="_blank" rel="nofollow"><strong>was £1,499 now £1,199 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-apple-tv-and-homepod-savings"><span>Apple TV and HomePod savings</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DW7Cb7YncewfSAxQJZPQfi" name="TG_Apple-TV-4K_2021-10.jpg" alt="Apple TV 4K (2021) review" src="https://cdn.mos.cms.futurecdn.net/DW7Cb7YncewfSAxQJZPQfi-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>How much RAM does a HomePod need!? Anyway, my gripes aside, luckily, Apple TVs and HomePods are still available at the original prices elsewhere — except for HomePod mini.</p><h2 id="u-s-prices-4">U.S. prices 🇺🇸</h2><ul><li><strong>Apple TV 4K: </strong><a href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow"><strong>was $199 now $129 @ Walmart</strong></a><strong></strong></li><li><strong>Apple HomePod: </strong><a href="https://www.walmart.com/ip/Apple-Homepod-Midnight-2025-MDEW4LL-A/17036967854" target="_blank" rel="nofollow"><strong>was $349 now $299 @ Walmart</strong></a><strong></strong></li></ul><h2 id="u-k-prices-4">U.K. prices 🇬🇧</h2><ul><li><strong>Apple TV 4K: </strong><a href="https://www.amazon.co.uk/Apple-2022-Apple-Wi%E2%80%91Fi-64GB-storage-generation/dp/B0BJMNZTCK" target="_blank" rel="nofollow"><strong>was £199 now £139 @ Amazon</strong></a><strong></strong></li><li><strong>Apple HomePod: </strong><a href="https://www.argos.co.uk/product/7698044" target="_blank" rel="nofollow"><strong>was £349 now £299 @ Argos</strong></a><strong></strong></li><li><strong>Apple HomePod mini: </strong><a href="https://www.argos.co.uk/product/7698161" target="_blank" rel="nofollow"><strong>was £129 now £99 @ Argos</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&amp;min_discount_ratio=0.95&amp;offer_type=all&amp;view_mode=carousel&amp;widget_title=Top+Deals+Handpicked+by+Our+Editors&amp;widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&amp;bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .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-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    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';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("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;                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple's price hikes finally made me pick up the Apple TV 4K I've been eyeing for weeks — and you can still grab one at the old price ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I've always been a big fan of Roku streamers, but recently I've been mulling over the idea of swapping for an <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a>. Not only am I getting tired of Roku's advertising, but the <a href="https://www.tomsguide.com/reviews/roku-streambar">Roku Streambar</a> that's been <a href="https://www.tomsguide.com/opinion/i-switched-from-roku-to-a-fire-tv-stick-for-two-weeks-heres-what-happened">powering my TV for five and a half years</a> seems to be glitching a lot more than usual. Yesterday saw me finally take the plunge and make that purchase.</p><p>Discounts on Apple products are quite rare, and the Apple TV 4K was not fortunate enough to be discounted in Amazon's Prime Day sale — or at any rival retailers. But considering Apple has just announced a series of price hikes, including a $70 increase on the Apple TV 4K, I realized it was now or never.</p><p>It seems that a lot of other people had the same idea, and it's actually become quite hard to find an Apple TV 4K at the old $129 price tag. Apple has a plentiful supply <a href="https://www.apple.com/shop/buy-tv/apple-tv-4k" target="_blank" rel="nofollow">if you're willing to pay $199</a>, but there's something about being asked to pay so much money for a 4-year-old device that rubs me the wrong way. </p><p>So here are the retailers that still have stock at the old price.</p><div class="product"><a data-dimension112="09f9f981-be52-4e8a-8313-ca983f557b15" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129" href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:454px;"><p class="vanilla-image-block" style="padding-top:93.61%;"><img id="vSoq2aA9FjoCQRdmuv3tuM" name="Screen Shot 2021-06-18 at 11.17.49 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vSoq2aA9FjoCQRdmuv3tuM-1920-80.png" mos="" align="middle" fullscreen="" width="454" height="425" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong><a href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow" data-dimension112="09f9f981-be52-4e8a-8313-ca983f557b15" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129">TV 4K (64GB): was $199 now $129</a></strong><br />Walmart has sold a lot of Apple TV 4Ks over the past 25 hours, and it looks like stock is starting to run low. So grab this while you can, complete with free shipping or same-day pickup, and a bunch of extended trials for Apple Services, including streaming and music.<a class="view-deal button" href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow" data-dimension112="09f9f981-be52-4e8a-8313-ca983f557b15" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="5f334e6d-f5c0-4a50-b8c7-e9160489c248" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129" href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:454px;"><p class="vanilla-image-block" style="padding-top:93.61%;"><img id="vSoq2aA9FjoCQRdmuv3tuM" name="Screen Shot 2021-06-18 at 11.17.49 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vSoq2aA9FjoCQRdmuv3tuM-1920-80.png" mos="" align="middle" fullscreen="" width="454" height="425" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong><a href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow" data-dimension112="5f334e6d-f5c0-4a50-b8c7-e9160489c248" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129">TV 4K (64GB): was $199 now $129</a></strong><br />Target also has the Apple TV 4K in stock at the old price, but you will need to wait for it to arrive. Deliveries are estimated to arrive by Tuesday June 30. There are no extras with this purchase, but you're still getting the same Apple TV 4K for $70 less than what Apple is now asking for.<a class="view-deal button" href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow" data-dimension112="5f334e6d-f5c0-4a50-b8c7-e9160489c248" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129">View Deal</a></p></div><h2 id="why-choose-the-apple-tv-4k">Why choose the Apple TV 4K?</h2><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="ryFasSGzkXnmei2KeYT9ZU" name="TG_AppleTV-4k_2022.jpg" alt="The Apple TV 4K (2022), with the Siri remote propped on its right side." src="https://cdn.mos.cms.futurecdn.net/ryFasSGzkXnmei2KeYT9ZU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Henry T. Casey / Tom's Guide)</span></figcaption></figure><p>One of the main benefits of buying an Apple TV 4K is that it's got the cleanest interface of any streaming device around. Unlike some rivals it's not constantly pushing you towards Apple services, or showcasing ads that you may or may not be interested in. That also means that there are no random branded buttons on the remote, a feature that has always bugged me.</p><div><blockquote><p>There are no random branded buttons on the remote, a feature that has always bugged me.</p></blockquote></div><p>You also have support for Apple smart home devices, Dolby Atmos and HDR10+, an ethernet port on the more expensive 128GB option and the ability to play games from the App Store. </p><p>Performance was also excellent at the time of release, thanks to the A15 Bionic chipset. And while old, I'm not sure whether you need iPhone or MacBook-tier performance on a streaming box. As long as it loads quickly and plays the content I want without issue, it's good with me.</p><p>There's also access to Siri, but due to the Apple TV's age, the current model isn't able to run Siri AI — even with the tvOS 27 beta installed. If you're desperate for Apple's AI on your TV, you might want to wait for the upgraded model that's <a href="https://www.tomsguide.com/entertainment/streaming-devices/tvos-27-cuts-off-two-apple-tv-devices-does-this-mean-a-new-box-is-coming">rumored to be in development</a>. But who knows whether that will arrive this year, or some unspecified point in the future. You certainly won't be getting it for a low price.</p><p>Me? I'm picking it up for the interface and the lack of advertising. There are too many ads on the internet, especially on streaming services, and I've grown tired of seeing ads on my home screen as well.</p><h2 id="where-you-can-actually-buy-apple-tv-4k-for-the-old-price">Where you can actually buy Apple TV 4K for the old 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2DcyGhafTmkZYicS43Xj8j" name="2.jpg" alt="The Apple TV 4K (2022) with remote" src="https://cdn.mos.cms.futurecdn.net/2DcyGhafTmkZYicS43Xj8j-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>It looks as though the Apple TV 4K has proven very popular over the last 24 hours. Walmart claims that it has sold over 500 of the things since yesterday, while Amazon and Best Buy have both run out of stock.</p><div><blockquote><p>Walmart has flagged the Apple TV 4K for low stock, which means there's a good chance they will also run out soon.</p></blockquote></div><p><a href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow">Walmart is arguably the best option</a> if you want your streaming box as soon as possible, offering next day same-day delivery and in-store pickup for those of you willing to drive to your nearest location. You can also get free shipping, as well as the usual slew of extended trials for Apple services — including Apple TV and Apple Music.</p><p>However Walmart has flagged the Apple TV 4K for low stock, which means there's a good chance they will also run out soon. You can guarantee that the next batch they receive is going to be priced on par with Apple.</p><p>Target isn't offering pickup or same-day delivery, but it <a href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow">will still ship you a 64GB Apple TV 4K</a> with the promise that it will arrive by June 30. That shipping is also free, but there's no mention of the extended free trials that Walmart is offering.</p><p>If both those retailers run out of stock, then it's always worth checking out <a href="https://www.ebay.com/sch/i.html?_nkw=Apple+tv+4k+64GB&amp;_sacat=0&amp;_from=R40&amp;_trksid=p2334524.m570.l1313&amp;_odkw=Apple+tv+4k&amp;_osacat=0" target="_blank" rel="nofollow">sites like eBay</a> to see if you can pick up a used model. Some of the prices have started going up already, and I saw one open box Apple TV <a href="https://www.ebay.com/itm/364121975277?_skw=Apple+tv+4k+64GB&amp;epid=27057122057&amp;itmmeta=01KW1GAB2BTHZE8ATCT9MB7HR3&amp;hash=item54c75c69ed:g:2cAAAOSw~bxj0Fda&amp;itmprp=enc%3AAQALAAAA8GfYFPkwiKCW4ZNSs2u11xCWtM2BqFB4U1EDryhAwpB4f%2FC8ofzVuSol7XrzXw4MSamiPN9UfcvzYODVvNta%2FinEq0RpuVsryW2EAkOqYXVp1ZGGGDFz6VAwg6WAawjCXVaRNrVJNPB1%2F0YzLFsrVAT%2FTg1x8eaeo%2FrIrhSKZ87%2BPn%2BKGJA0n%2BFBxEQHDCx7k8175j64qm1gqqyFD5NL4QBhmUT6dThQ8yCMRljjleInItY4R391xXGkOHp6CewjgUq8oXeAtsA7UanTjgNKksc1%2BVuv%2FW90MNLy6WAomHCU%2F10MVtUSD%2FtiXPDvLgOQjw%3D%3D%7Ctkp%3ABFBMuLGpsOBn" target="_blank" rel="nofollow">with a $189 asking price</a>, so it seems some sellers are already catching on and trying to take advantage of the price hike.</p><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&amp;brands=Amazon%2CApple%2CGoogle%2CLenovo%2CSamsung%2CTCL&amp;price=165_&amp;min_discount_ratio=0.95&amp;sort=best_match&amp;retailer=Amazon&amp;widget_title=Top+Deals+Handpicked+by+Our+Editors&amp;widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&amp;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 { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (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';          }        }        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.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const 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');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, 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.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/apples-price-hikes-finally-made-me-pick-up-the-apple-tv-4k-ive-been-eyeing-for-weeks-and-you-can-still-grab-one-at-the-old-price</link>
                                                                            <description>
                            <![CDATA[ Apple may have raised the price of the Apple TV 4K by $70, but these retailers didn't get the memo — and you should follow my lead and take advantage while you can. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UzdiYQy8En7hQdmA6aBhAa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sUdfVRZtkLBMGZRXSxmHp7-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 09:51:37 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sUdfVRZtkLBMGZRXSxmHp7-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[apple tv 4k with prime dasy sticker]]></media:description>                                                            <media:text><![CDATA[apple tv 4k with prime dasy sticker]]></media:text>
                                <media:title type="plain"><![CDATA[apple tv 4k with prime dasy sticker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sUdfVRZtkLBMGZRXSxmHp7-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've always been a big fan of Roku streamers, but recently I've been mulling over the idea of swapping for an <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a>. Not only am I getting tired of Roku's advertising, but the <a href="https://www.tomsguide.com/reviews/roku-streambar">Roku Streambar</a> that's been <a href="https://www.tomsguide.com/opinion/i-switched-from-roku-to-a-fire-tv-stick-for-two-weeks-heres-what-happened">powering my TV for five and a half years</a> seems to be glitching a lot more than usual. Yesterday saw me finally take the plunge and make that purchase.</p><p>Discounts on Apple products are quite rare, and the Apple TV 4K was not fortunate enough to be discounted in Amazon's Prime Day sale — or at any rival retailers. But considering Apple has just announced a series of price hikes, including a $70 increase on the Apple TV 4K, I realized it was now or never.</p><p>It seems that a lot of other people had the same idea, and it's actually become quite hard to find an Apple TV 4K at the old $129 price tag. Apple has a plentiful supply <a href="https://www.apple.com/shop/buy-tv/apple-tv-4k" target="_blank" rel="nofollow">if you're willing to pay $199</a>, but there's something about being asked to pay so much money for a 4-year-old device that rubs me the wrong way. </p><p>So here are the retailers that still have stock at the old price.</p><div class="product"><a data-dimension112="09f9f981-be52-4e8a-8313-ca983f557b15" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129" href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:454px;"><p class="vanilla-image-block" style="padding-top:93.61%;"><img id="vSoq2aA9FjoCQRdmuv3tuM" name="Screen Shot 2021-06-18 at 11.17.49 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vSoq2aA9FjoCQRdmuv3tuM-1920-80.png" mos="" align="middle" fullscreen="" width="454" height="425" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong><a href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow" data-dimension112="09f9f981-be52-4e8a-8313-ca983f557b15" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129">TV 4K (64GB): was $199 now $129</a></strong><br />Walmart has sold a lot of Apple TV 4Ks over the past 25 hours, and it looks like stock is starting to run low. So grab this while you can, complete with free shipping or same-day pickup, and a bunch of extended trials for Apple Services, including streaming and music.<a class="view-deal button" href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow" data-dimension112="09f9f981-be52-4e8a-8313-ca983f557b15" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="5f334e6d-f5c0-4a50-b8c7-e9160489c248" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129" href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:454px;"><p class="vanilla-image-block" style="padding-top:93.61%;"><img id="vSoq2aA9FjoCQRdmuv3tuM" name="Screen Shot 2021-06-18 at 11.17.49 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vSoq2aA9FjoCQRdmuv3tuM-1920-80.png" mos="" align="middle" fullscreen="" width="454" height="425" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong><a href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow" data-dimension112="5f334e6d-f5c0-4a50-b8c7-e9160489c248" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129">TV 4K (64GB): was $199 now $129</a></strong><br />Target also has the Apple TV 4K in stock at the old price, but you will need to wait for it to arrive. Deliveries are estimated to arrive by Tuesday June 30. There are no extras with this purchase, but you're still getting the same Apple TV 4K for $70 less than what Apple is now asking for.<a class="view-deal button" href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow" data-dimension112="5f334e6d-f5c0-4a50-b8c7-e9160489c248" data-action="Deal Block" data-label="TV 4K (64GB)" data-dimension48="TV 4K (64GB)" data-dimension25="$129">View Deal</a></p></div><h2 id="why-choose-the-apple-tv-4k">Why choose the Apple TV 4K?</h2><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="ryFasSGzkXnmei2KeYT9ZU" name="TG_AppleTV-4k_2022.jpg" alt="The Apple TV 4K (2022), with the Siri remote propped on its right side." src="https://cdn.mos.cms.futurecdn.net/ryFasSGzkXnmei2KeYT9ZU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Henry T. Casey / Tom's Guide)</span></figcaption></figure><p>One of the main benefits of buying an Apple TV 4K is that it's got the cleanest interface of any streaming device around. Unlike some rivals it's not constantly pushing you towards Apple services, or showcasing ads that you may or may not be interested in. That also means that there are no random branded buttons on the remote, a feature that has always bugged me.</p><div><blockquote><p>There are no random branded buttons on the remote, a feature that has always bugged me.</p></blockquote></div><p>You also have support for Apple smart home devices, Dolby Atmos and HDR10+, an ethernet port on the more expensive 128GB option and the ability to play games from the App Store. </p><p>Performance was also excellent at the time of release, thanks to the A15 Bionic chipset. And while old, I'm not sure whether you need iPhone or MacBook-tier performance on a streaming box. As long as it loads quickly and plays the content I want without issue, it's good with me.</p><p>There's also access to Siri, but due to the Apple TV's age, the current model isn't able to run Siri AI — even with the tvOS 27 beta installed. If you're desperate for Apple's AI on your TV, you might want to wait for the upgraded model that's <a href="https://www.tomsguide.com/entertainment/streaming-devices/tvos-27-cuts-off-two-apple-tv-devices-does-this-mean-a-new-box-is-coming">rumored to be in development</a>. But who knows whether that will arrive this year, or some unspecified point in the future. You certainly won't be getting it for a low price.</p><p>Me? I'm picking it up for the interface and the lack of advertising. There are too many ads on the internet, especially on streaming services, and I've grown tired of seeing ads on my home screen as well.</p><h2 id="where-you-can-actually-buy-apple-tv-4k-for-the-old-price">Where you can actually buy Apple TV 4K for the old 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2DcyGhafTmkZYicS43Xj8j" name="2.jpg" alt="The Apple TV 4K (2022) with remote" src="https://cdn.mos.cms.futurecdn.net/2DcyGhafTmkZYicS43Xj8j-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>It looks as though the Apple TV 4K has proven very popular over the last 24 hours. Walmart claims that it has sold over 500 of the things since yesterday, while Amazon and Best Buy have both run out of stock.</p><div><blockquote><p>Walmart has flagged the Apple TV 4K for low stock, which means there's a good chance they will also run out soon.</p></blockquote></div><p><a href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow">Walmart is arguably the best option</a> if you want your streaming box as soon as possible, offering next day same-day delivery and in-store pickup for those of you willing to drive to your nearest location. You can also get free shipping, as well as the usual slew of extended trials for Apple services — including Apple TV and Apple Music.</p><p>However Walmart has flagged the Apple TV 4K for low stock, which means there's a good chance they will also run out soon. You can guarantee that the next batch they receive is going to be priced on par with Apple.</p><p>Target isn't offering pickup or same-day delivery, but it <a href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow">will still ship you a 64GB Apple TV 4K</a> with the promise that it will arrive by June 30. That shipping is also free, but there's no mention of the extended free trials that Walmart is offering.</p><p>If both those retailers run out of stock, then it's always worth checking out <a href="https://www.ebay.com/sch/i.html?_nkw=Apple+tv+4k+64GB&amp;_sacat=0&amp;_from=R40&amp;_trksid=p2334524.m570.l1313&amp;_odkw=Apple+tv+4k&amp;_osacat=0" target="_blank" rel="nofollow">sites like eBay</a> to see if you can pick up a used model. Some of the prices have started going up already, and I saw one open box Apple TV <a href="https://www.ebay.com/itm/364121975277?_skw=Apple+tv+4k+64GB&amp;epid=27057122057&amp;itmmeta=01KW1GAB2BTHZE8ATCT9MB7HR3&amp;hash=item54c75c69ed:g:2cAAAOSw~bxj0Fda&amp;itmprp=enc%3AAQALAAAA8GfYFPkwiKCW4ZNSs2u11xCWtM2BqFB4U1EDryhAwpB4f%2FC8ofzVuSol7XrzXw4MSamiPN9UfcvzYODVvNta%2FinEq0RpuVsryW2EAkOqYXVp1ZGGGDFz6VAwg6WAawjCXVaRNrVJNPB1%2F0YzLFsrVAT%2FTg1x8eaeo%2FrIrhSKZ87%2BPn%2BKGJA0n%2BFBxEQHDCx7k8175j64qm1gqqyFD5NL4QBhmUT6dThQ8yCMRljjleInItY4R391xXGkOHp6CewjgUq8oXeAtsA7UanTjgNKksc1%2BVuv%2FW90MNLy6WAomHCU%2F10MVtUSD%2FtiXPDvLgOQjw%3D%3D%7Ctkp%3ABFBMuLGpsOBn" target="_blank" rel="nofollow">with a $189 asking price</a>, so it seems some sellers are already catching on and trying to take advantage of the price hike.</p><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&amp;brands=Amazon%2CApple%2CGoogle%2CLenovo%2CSamsung%2CTCL&amp;price=165_&amp;min_discount_ratio=0.95&amp;sort=best_match&amp;retailer=Amazon&amp;widget_title=Top+Deals+Handpicked+by+Our+Editors&amp;widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&amp;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 { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (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';          }        }        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.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const 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');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, 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.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  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[ Everything new on Apple TV in July 2026 — 'Silo' season 3 and much more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Summer is hitting full stride, but <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is making a strong case for spending time on the couch. The streamer’s July 2026 lineup mixes prestige sci-fi, returning favorites and feel-good movies that could easily fill a weekend watchlist. </p><p>Leading the charge is season 3 of "Silo," which continues peeling back the mysteries of its underground world while diving deeper into the story's distant past. Also returning is "Trying" for season 5, which once again proves that few shows do warmth and charm quite like this one. The crime thriller "Lucky" debuts with Anya Taylor-Joy as a con artist on the run. Plus, there's a pickleball comedy "The Dink" and the animated special "Snoopy Presents: There's No Place Like Home, Snoopy."</p><div class="product"><a data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$" href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong>Apple TV add-on subscription via Prime Video (2 months): </strong><a href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow" data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$"><del>was $12.99/month</del><strong> now $5.99/month @ Amazon</strong></a> <br />This Apple TV deal lets you add the channel to your existing Prime Video subscription for just $5.99/month for the first two months, down from the usual $12.99. It’s the perfect chance to binge Apple TV’s biggest hits.<a class="view-deal button" href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow" data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$">View Deal</a></p></div><p>Here's everything coming to Apple TV in July 2026.</p><h2 id="silo-season-3">'Silo' season 3</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/BLBvbMtjyAQ" allowfullscreen=""></iframe></div></div><p><strong>After two seasons of rationing answers like they're contraband, "Silo" is finally ready to crack open some of its biggest mysteries</strong>. Season 3 picks up with Juliette (Rebecca Ferguson) alive but suffering from amnesia, which is about as inconvenient as it sounds when you're trying to save a society built on secrets. The new season also travels back to the Before Times, chronicling the events that sent humanity underground in the first place. At long last, the bunker origin story is coming into focus.</p><p><a href="https://tv.apple.com/us/show/silo/umc.cmc.3yksgc857px0k0rqe5zd4jice" target="_blank" rel="nofollow"><em><strong>Watch "Silo" season 3 on Apple TV starting July 3</strong></em></a></p><h2 id="trying-season-5">'Trying' season 5</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/8-_Oxuozsw4" allowfullscreen=""></iframe></div></div><p>One of TV’s most reliable comfort watches returns, but don’t expect Nikki( Esther Smith) and Jason's (Rafe Spall) hard-won domestic bliss to stay blissful for long. Season 5 picks up after Kat, the biological mother of Princess and Tyler, lands on their doorstep, bringing a fresh wave of complications to the family they’ve worked so hard to build. Equal parts funny, messy and genuinely moving, <strong>"Trying" is proof that feel-good doesn’t have to mean conflict-free.</strong></p><p><a href="https://tv.apple.com/us/show/trying/umc.cmc.6muy4la7lj1omu5nci4bt2m66" target="_blank" rel="nofollow"><em><strong>Watch "Trying" season 5 on Apple TV starting July 8</strong></em></a></p><h2 id="lucky">'Lucky'</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/GAbT5qCTXR8" allowfullscreen=""></iframe></div></div><p>Anya Taylor-Joy trades dunes and mushroom kingdoms for cons and family trauma in this <strong>sleek crime thriller miniseries based on Marissa Stapley’s bestselling novel</strong>. She plays a reformed grifter forced back into the criminal life when a multimillion-dollar heist goes wrong. Timothy Olyphant is her outlaw father, Annette Bening wields danger as a mob leader, and there are enough double-crosses to fill a getaway car.</p><p><a href="https://tv.apple.com/us/show/lucky/umc.cmc.5qo7t3nngb2vj0m9dxkwebw1o" target="_blank" rel="nofollow"><em><strong>Watch "Lucky" on Apple TV starting July 15</strong></em></a></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="the-dink">'The Dink'</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>For most people, pickleball is a fun, not-too-strenuous activity. For washed-up tennis prodigy Dusty Boyd (Jake Johnson), it's a humiliating detour. In this sports comedy movie, he’s stuck coaching unruly kids at his father Chuck’s (Ed Harris) country club, where approval is harder to earn than a trophy. An injury sidelines him, forcing him into pickleball rehab against his will ... until he starts to enjoy it alongside doubles partner Candace (Mary Steenburgen). With Andy Roddick, Dusty’s identity crisis gets competitive.</p><p><a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow"><em><strong>Watch "The Dink" on Apple TV starting July 24</strong></em></a></p><h2 id="snoopy-presents-there-s-no-place-like-home-snoopy">'Snoopy Presents: There’s No Place Like Home, Snoopy'</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/4Okng09fWvo" allowfullscreen=""></iframe></div></div><p>In the 53rd Peanuts special, Snoopy’s iconic doghouse gets accidentally sold at a yard sale, and the world’s most imaginative beagle is understandably devastated. After all, it’s his creative HQ, his memory palace, his everything. Snoopy (voiced by Terry McGurrin) sets out to cope with the loss, with help from a new slate of kids.</p><p><a href="https://tv.apple.com/mx/movie/snoopy-presents-theres-no-place-like-home-snoopy/umc.cmc.52sgmi3vdpedurrbtz6louqqo?l=en" target="_blank" rel="nofollow"><em><strong>Watch "There's No Place Like Home, Snoopy" on Apple TV starting July 31</strong></em></a></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/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-july-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in June 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FUiENQx2LWXurwoSoeQjP7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 25 Jun 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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-320-70.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/4VdQw8T8Xz9Cct4TixYkfc-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a yellow rays background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a yellow rays background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a yellow rays background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer is hitting full stride, but <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is making a strong case for spending time on the couch. The streamer’s July 2026 lineup mixes prestige sci-fi, returning favorites and feel-good movies that could easily fill a weekend watchlist. </p><p>Leading the charge is season 3 of "Silo," which continues peeling back the mysteries of its underground world while diving deeper into the story's distant past. Also returning is "Trying" for season 5, which once again proves that few shows do warmth and charm quite like this one. The crime thriller "Lucky" debuts with Anya Taylor-Joy as a con artist on the run. Plus, there's a pickleball comedy "The Dink" and the animated special "Snoopy Presents: There's No Place Like Home, Snoopy."</p><div class="product"><a data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$" href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong>Apple TV add-on subscription via Prime Video (2 months): </strong><a href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow" data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$"><del>was $12.99/month</del><strong> now $5.99/month @ Amazon</strong></a> <br />This Apple TV deal lets you add the channel to your existing Prime Video subscription for just $5.99/month for the first two months, down from the usual $12.99. It’s the perfect chance to binge Apple TV’s biggest hits.<a class="view-deal button" href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow" data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$">View Deal</a></p></div><p>Here's everything coming to Apple TV in July 2026.</p><h2 id="silo-season-3">'Silo' season 3</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/BLBvbMtjyAQ" allowfullscreen=""></iframe></div></div><p><strong>After two seasons of rationing answers like they're contraband, "Silo" is finally ready to crack open some of its biggest mysteries</strong>. Season 3 picks up with Juliette (Rebecca Ferguson) alive but suffering from amnesia, which is about as inconvenient as it sounds when you're trying to save a society built on secrets. The new season also travels back to the Before Times, chronicling the events that sent humanity underground in the first place. At long last, the bunker origin story is coming into focus.</p><p><a href="https://tv.apple.com/us/show/silo/umc.cmc.3yksgc857px0k0rqe5zd4jice" target="_blank" rel="nofollow"><em><strong>Watch "Silo" season 3 on Apple TV starting July 3</strong></em></a></p><h2 id="trying-season-5">'Trying' season 5</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/8-_Oxuozsw4" allowfullscreen=""></iframe></div></div><p>One of TV’s most reliable comfort watches returns, but don’t expect Nikki( Esther Smith) and Jason's (Rafe Spall) hard-won domestic bliss to stay blissful for long. Season 5 picks up after Kat, the biological mother of Princess and Tyler, lands on their doorstep, bringing a fresh wave of complications to the family they’ve worked so hard to build. Equal parts funny, messy and genuinely moving, <strong>"Trying" is proof that feel-good doesn’t have to mean conflict-free.</strong></p><p><a href="https://tv.apple.com/us/show/trying/umc.cmc.6muy4la7lj1omu5nci4bt2m66" target="_blank" rel="nofollow"><em><strong>Watch "Trying" season 5 on Apple TV starting July 8</strong></em></a></p><h2 id="lucky">'Lucky'</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/GAbT5qCTXR8" allowfullscreen=""></iframe></div></div><p>Anya Taylor-Joy trades dunes and mushroom kingdoms for cons and family trauma in this <strong>sleek crime thriller miniseries based on Marissa Stapley’s bestselling novel</strong>. She plays a reformed grifter forced back into the criminal life when a multimillion-dollar heist goes wrong. Timothy Olyphant is her outlaw father, Annette Bening wields danger as a mob leader, and there are enough double-crosses to fill a getaway car.</p><p><a href="https://tv.apple.com/us/show/lucky/umc.cmc.5qo7t3nngb2vj0m9dxkwebw1o" target="_blank" rel="nofollow"><em><strong>Watch "Lucky" on Apple TV starting July 15</strong></em></a></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="the-dink">'The Dink'</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>For most people, pickleball is a fun, not-too-strenuous activity. For washed-up tennis prodigy Dusty Boyd (Jake Johnson), it's a humiliating detour. In this sports comedy movie, he’s stuck coaching unruly kids at his father Chuck’s (Ed Harris) country club, where approval is harder to earn than a trophy. An injury sidelines him, forcing him into pickleball rehab against his will ... until he starts to enjoy it alongside doubles partner Candace (Mary Steenburgen). With Andy Roddick, Dusty’s identity crisis gets competitive.</p><p><a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow"><em><strong>Watch "The Dink" on Apple TV starting July 24</strong></em></a></p><h2 id="snoopy-presents-there-s-no-place-like-home-snoopy">'Snoopy Presents: There’s No Place Like Home, Snoopy'</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/4Okng09fWvo" allowfullscreen=""></iframe></div></div><p>In the 53rd Peanuts special, Snoopy’s iconic doghouse gets accidentally sold at a yard sale, and the world’s most imaginative beagle is understandably devastated. After all, it’s his creative HQ, his memory palace, his everything. Snoopy (voiced by Terry McGurrin) sets out to cope with the loss, with help from a new slate of kids.</p><p><a href="https://tv.apple.com/mx/movie/snoopy-presents-theres-no-place-like-home-snoopy/umc.cmc.52sgmi3vdpedurrbtz6louqqo?l=en" target="_blank" rel="nofollow"><em><strong>Watch "There's No Place Like Home, Snoopy" on Apple TV starting July 31</strong></em></a></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/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express 4K+,Google Chromecast with Google TV,Apple TV 4K (2022),Roku Express 4K+ (2021),Amazon Fire TV Stick 4K Max 2023" data-widget-type="multimodelreview" data-widget-title="Streaming device deals not to miss"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Control your Apple TV like a pro with these 5 hidden remote features ]]></title>
                                                                                                <dc:content><![CDATA[ <p>On the surface, the Apple TV remote looks almost too simple. It has the obvious buttons you expect: play, pause, back, and volume control. But behind that minimalist design, Apple buried several powerful shortcuts inside tvOS that most users never discover.</p><p>Some of these hidden features solve genuinely frustrating problems like fixing a mid-episode freeze without having to pull the plug on your entire device. Others unlock accessibility tools or hand you advanced settings.</p><p>If you want to stop wrestling with menus and start streaming smarter, here are the five hidden Apple TV remote features worth learning.</p><section class="howto-block">                    <h3>1. Force-close apps without restarting</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/NdnVgdeifRzHh7irWTs9Xd.jpg"                                        alt="Apple TV 4K"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/NdnVgdeifRzHh7irWTs9Xd.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Apple)</div></figure>                    <p><p>When an Apple TV app misbehaves, most people unplug the entire device and wait for a restart. There's a faster way. </p><p>If you <strong>double-press the Home button</strong> your remote pulls up a carousel of currently running apps. Each open app appears as a card you can navigate through. <strong>Once you've selected the problematic app, swipe upward to force-close it</strong>. The app shuts down immediately without affecting anything else running on your Apple TV.</p><p>Closing them periodically keeps your streaming device responsive and prevents the creeping slowdown that happens over weeks of continuous use. It's especially useful if you're switching between multiple services and notice performance dropping.</p></p>                </section><section class="howto-block">                    <h3>2. Scrub through video with precision</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/Emrxy4ez8BVqVvadVHSdsE.jpg"                                        alt="Elago R5 apple tv remote case with Siri Remote"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/Emrxy4ez8BVqVvadVHSdsE.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>The clickpad on your remote isn't just for navigation, it's a timeline controller. <strong>Press the play/pause button, then slide your finger left or right on the clickpad to rewind or fast-forward </strong>through a show or movie. </p><p>You can also draw circles on the clickpad in either direction to scrub, which some users might find more intuitive than sliding.</p><p>For older Siri Remotes without the clickpad, <strong>use the touch surface instead</strong>. The advantage of scrubbing over using verbal commands is precision — you can land exactly where you want in a scene without overshooting by 15 seconds. </p><p>It's particularly useful when you're trying to find a specific moment or skip past credits without jumping too far ahead.</p></p>                </section><section class="howto-block">                    <h3>3. Switch audio outputs instantly</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/nx6RAmzfASJBNhrcoVSq66.jpg"                                        alt="Apple TV 4K interface"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/nx6RAmzfASJBNhrcoVSq66.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>If you have external speakers connected to your Apple TV — whether that's a pair of <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod minis</a> or a soundbar — you can change audio routing without diving into settings menus. </p><p>To open the audio dashboard without interrupting playback, simply <strong>long-press the TV/Control Center button</strong> (the rectangular button with the TV icon) on your Remote. The Control Center panel will slide into view, allowing you to click the <strong>Audio Controls icon</strong> and quickly select your desired speakers. </p><p>This is invaluable when you want to switch from TV speakers to a better sound system, temporarily route audio to your headphones for quiet listening, or even select multiple AirPlay 2 speakers at once to send perfectly synced audio to different rooms.</p></p>                </section><section class="howto-block">                    <h3>4. Enable accessibility features with one gesture</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/FtxGRgCuBZph8BQFSbxttP.jpg"                                        alt="Apple TV 4K settings"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/FtxGRgCuBZph8BQFSbxttP.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>VoiceOver is Apple's audio description system that reads menus, text, and interface elements aloud as you navigate. It's designed for users with vision impairments but benefits anyone who wants spoken feedback from their device. </p><p>You can set up a quick toggle in Accessibility settings — <strong>triple-press the Menu or Back button </strong>to activate it instantly.</p><p>Once enabled, standard navigation is done entirely with a single finger: <strong>simply drag your finger across the clickpad</strong> to explore and hear what is currently beneath it, or <strong>flick left or right with one finger</strong> to move sequentially to the next item. </p><p>The more advanced two-finger gestures are saved for controlling the speech itself —such as <strong>a single two-finger tap to instantly pause or resume the voice, or a two-finger flick up or down </strong>to have VoiceOver read the entire screen aloud.</p></p>                </section><section class="howto-block">                    <h3>5. Unlock advanced settings and demo mode</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/KGmEv9xmrE3iitmKSPiZt6.jpg"                                        alt="The Apple TV 4K (2022) remote in hand, tilted to the side"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/KGmEv9xmrE3iitmKSPiZt6.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Apple hides specialized menus in tvOS to prevent accidental system changes. To access the hidden Advanced Settings developer menu, go to <strong>Settings, System, Software Update</strong>,<strong> highlight the update field, and press Play/Pause four times</strong>. This menu safely disappears the next time you restart your Apple TV.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Odk92W"></div>                            </div>                            <script src="https://kwizly.com/embed/Odk92W.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/tvs/i-found-5-hidden-shortcuts-for-my-apple-tv-4k-that-make-it-so-much-easier-to-use-heres-how-to-use-them">5 features that make my Apple TV 4K so much easier to use</a></li><li><a href="https://www.tomsguide.com/tvs/your-tv-is-watching-you-how-to-turn-off-data-collection-on-lg-samsung-roku-and-more">Your TV is watching you — how to turn off data collection on LG, Samsung, Roku and more</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-fix-an-apple-tv-thats-not-working">How to fix an Apple TV that's not working — and fix Apple TV remote issues too</a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using</link>
                                                                            <description>
                            <![CDATA[ Your Apple TV remote has hidden powers that make everyday tasks faster. Here are the five most useful ones. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JkDXY7NcEtKGRkjfekq48c</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 22 Jun 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[TVs]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1920-80.jpg">
                                                            <media:credit><![CDATA[Henry T. Casey / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:description>                                                            <media:text><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:text>
                                <media:title type="plain"><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>On the surface, the Apple TV remote looks almost too simple. It has the obvious buttons you expect: play, pause, back, and volume control. But behind that minimalist design, Apple buried several powerful shortcuts inside tvOS that most users never discover.</p><p>Some of these hidden features solve genuinely frustrating problems like fixing a mid-episode freeze without having to pull the plug on your entire device. Others unlock accessibility tools or hand you advanced settings.</p><p>If you want to stop wrestling with menus and start streaming smarter, here are the five hidden Apple TV remote features worth learning.</p><section class="howto-block">                    <h3>1. Force-close apps without restarting</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/NdnVgdeifRzHh7irWTs9Xd.jpg"                                        alt="Apple TV 4K"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/NdnVgdeifRzHh7irWTs9Xd.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Apple)</div></figure>                    <p><p>When an Apple TV app misbehaves, most people unplug the entire device and wait for a restart. There's a faster way. </p><p>If you <strong>double-press the Home button</strong> your remote pulls up a carousel of currently running apps. Each open app appears as a card you can navigate through. <strong>Once you've selected the problematic app, swipe upward to force-close it</strong>. The app shuts down immediately without affecting anything else running on your Apple TV.</p><p>Closing them periodically keeps your streaming device responsive and prevents the creeping slowdown that happens over weeks of continuous use. It's especially useful if you're switching between multiple services and notice performance dropping.</p></p>                </section><section class="howto-block">                    <h3>2. Scrub through video with precision</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/Emrxy4ez8BVqVvadVHSdsE.jpg"                                        alt="Elago R5 apple tv remote case with Siri Remote"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/Emrxy4ez8BVqVvadVHSdsE.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>The clickpad on your remote isn't just for navigation, it's a timeline controller. <strong>Press the play/pause button, then slide your finger left or right on the clickpad to rewind or fast-forward </strong>through a show or movie. </p><p>You can also draw circles on the clickpad in either direction to scrub, which some users might find more intuitive than sliding.</p><p>For older Siri Remotes without the clickpad, <strong>use the touch surface instead</strong>. The advantage of scrubbing over using verbal commands is precision — you can land exactly where you want in a scene without overshooting by 15 seconds. </p><p>It's particularly useful when you're trying to find a specific moment or skip past credits without jumping too far ahead.</p></p>                </section><section class="howto-block">                    <h3>3. Switch audio outputs instantly</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/nx6RAmzfASJBNhrcoVSq66.jpg"                                        alt="Apple TV 4K interface"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/nx6RAmzfASJBNhrcoVSq66.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>If you have external speakers connected to your Apple TV — whether that's a pair of <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod minis</a> or a soundbar — you can change audio routing without diving into settings menus. </p><p>To open the audio dashboard without interrupting playback, simply <strong>long-press the TV/Control Center button</strong> (the rectangular button with the TV icon) on your Remote. The Control Center panel will slide into view, allowing you to click the <strong>Audio Controls icon</strong> and quickly select your desired speakers. </p><p>This is invaluable when you want to switch from TV speakers to a better sound system, temporarily route audio to your headphones for quiet listening, or even select multiple AirPlay 2 speakers at once to send perfectly synced audio to different rooms.</p></p>                </section><section class="howto-block">                    <h3>4. Enable accessibility features with one gesture</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/FtxGRgCuBZph8BQFSbxttP.jpg"                                        alt="Apple TV 4K settings"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/FtxGRgCuBZph8BQFSbxttP.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>VoiceOver is Apple's audio description system that reads menus, text, and interface elements aloud as you navigate. It's designed for users with vision impairments but benefits anyone who wants spoken feedback from their device. </p><p>You can set up a quick toggle in Accessibility settings — <strong>triple-press the Menu or Back button </strong>to activate it instantly.</p><p>Once enabled, standard navigation is done entirely with a single finger: <strong>simply drag your finger across the clickpad</strong> to explore and hear what is currently beneath it, or <strong>flick left or right with one finger</strong> to move sequentially to the next item. </p><p>The more advanced two-finger gestures are saved for controlling the speech itself —such as <strong>a single two-finger tap to instantly pause or resume the voice, or a two-finger flick up or down </strong>to have VoiceOver read the entire screen aloud.</p></p>                </section><section class="howto-block">                    <h3>5. Unlock advanced settings and demo mode</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/KGmEv9xmrE3iitmKSPiZt6.jpg"                                        alt="The Apple TV 4K (2022) remote in hand, tilted to the side"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/KGmEv9xmrE3iitmKSPiZt6.jpg"                                        class="expandable van-old-layout-image" />                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Apple hides specialized menus in tvOS to prevent accidental system changes. To access the hidden Advanced Settings developer menu, go to <strong>Settings, System, Software Update</strong>,<strong> highlight the update field, and press Play/Pause four times</strong>. This menu safely disappears the next time you restart your Apple TV.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Odk92W"></div>                            </div>                            <script src="https://kwizly.com/embed/Odk92W.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/tvs/i-found-5-hidden-shortcuts-for-my-apple-tv-4k-that-make-it-so-much-easier-to-use-heres-how-to-use-them">5 features that make my Apple TV 4K so much easier to use</a></li><li><a href="https://www.tomsguide.com/tvs/your-tv-is-watching-you-how-to-turn-off-data-collection-on-lg-samsung-roku-and-more">Your TV is watching you — how to turn off data collection on LG, Samsung, Roku and more</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-fix-an-apple-tv-thats-not-working">How to fix an Apple TV that's not working — and fix Apple TV remote issues too</a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Sugar' season 2 online – stream the Colin Farrell neo-noir mystery series from anywhere ]]></title>
                                                                                                <dc:content><![CDATA[ <p>"Sugar" put Colin Farrell back on TV screens in a slick, neo-noir detective series with a stunning twist. Now he’s back for more with a second season.</p><p>Below, we’ll show you how to watch "Sugar" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Sugar' S2 release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Sugar" season 2 premieres globally on Apple TV on <strong>Friday, June 19, 2026</strong>. New episodes then arrive weekly every Friday until the finale on August 7, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>When "Sugar" first started, we all thought we were getting a fairly standard, albeit very stylish, detective show. Tracking missing person Olivia Siegel, Farrell's eponymous private eye dug deep into family dramas, dark secrets, and a kidnapping plot.</p><p>Then, it all took a crazy twist right at the end, with the character revealed to not only be a great detective but also an alien! Now, in season 2, we'll see him take on a new missing persons case with the brother of a talented boxer going off the grid, while also continuing to search for his own sister. And, of course, we'll get more answers about his extraterrestrial origins.</p><p>You won't need to chase any clues to keep up with the latest episodes, as we show you how to <strong>watch "Sugar"</strong> season 2 from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-sugar-season-2-for-free-on-apple-tv"><span>How to watch 'Sugar' season 2 for FREE on Apple TV+</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Sugar" premieres on <a href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Friday, June 19, 2026. </strong>New episodes will land on the streamer each Friday from there onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a couple of episodes before deciding whether to carry on with the series.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $12.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-sugar-season-2-from-anywhere"><span>Watch 'Sugar' season 2 from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Sugar" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-sugar-season-2-trailer"><span>'Sugar' season 2 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/WJMbHySi5eQ" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-sugar-season-2-cast"><span>'Sugar' season 2 cast</span></h2><ul><li><strong>Colin Farrell</strong> as John Sugar</li><li><strong>Jin Ha</strong> as the missing boxer</li><li><strong>Raymond Lee</strong></li><li><strong>Tony Dalton</strong> as a lieutenant in the LA County Sheriff's Department</li><li><strong>Laura Donnelly</strong></li><li><strong>Sasha Calle</strong> as a hustler working for Sugar</li><li><strong>Shea Whigham</strong> as a government agency employee</li></ul><h2 class="article-body__section" id="section-sugar-season-2-episodes"><span>'Sugar' season 2 episodes</span></h2><ul><li><strong>Episode 1 - Home Away from Home</strong>: June 19, 2026 </li><li><strong>Episode 2 - Downer Town</strong>: June 26, 2026 </li><li><strong>Episode 3 - Watch Face</strong>: July 3, 2026 </li><li><strong>Episode 4 - Off 15</strong>: July 10, 2026 </li><li><strong>Episode 5 - TBA</strong>: July 17, 2026 </li><li><strong>Episode 6 - TBA</strong>: July 24, 2026 </li><li><strong>Episode 7 - TBA</strong>: July 31, 2026 </li><li><strong>Episode 8 - TBA</strong>: August 7, 2026 </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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear">How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/how-to-watch-sugar-season-2</link>
                                                                            <description>
                            <![CDATA[ See Colin Farrell in action as private detective John Sugar once more — here's how to watch "Sugar" season 2 online and from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YbpL4UzXciLDaNGmGKjWGd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Ajpj866amyS5YTw6HqmctQ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Ajpj866amyS5YTw6HqmctQ-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Colin Farrell in &quot;Sugar&quot;]]></media:description>                                                            <media:text><![CDATA[Colin Farrell in &quot;Sugar&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Colin Farrell in &quot;Sugar&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Ajpj866amyS5YTw6HqmctQ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Sugar" put Colin Farrell back on TV screens in a slick, neo-noir detective series with a stunning twist. Now he’s back for more with a second season.</p><p>Below, we’ll show you how to watch "Sugar" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Sugar' S2 release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Sugar" season 2 premieres globally on Apple TV on <strong>Friday, June 19, 2026</strong>. New episodes then arrive weekly every Friday until the finale on August 7, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>When "Sugar" first started, we all thought we were getting a fairly standard, albeit very stylish, detective show. Tracking missing person Olivia Siegel, Farrell's eponymous private eye dug deep into family dramas, dark secrets, and a kidnapping plot.</p><p>Then, it all took a crazy twist right at the end, with the character revealed to not only be a great detective but also an alien! Now, in season 2, we'll see him take on a new missing persons case with the brother of a talented boxer going off the grid, while also continuing to search for his own sister. And, of course, we'll get more answers about his extraterrestrial origins.</p><p>You won't need to chase any clues to keep up with the latest episodes, as we show you how to <strong>watch "Sugar"</strong> season 2 from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-sugar-season-2-for-free-on-apple-tv"><span>How to watch 'Sugar' season 2 for FREE on Apple TV+</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Sugar" premieres on <a href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Friday, June 19, 2026. </strong>New episodes will land on the streamer each Friday from there onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a couple of episodes before deciding whether to carry on with the series.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $12.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-sugar-season-2-from-anywhere"><span>Watch 'Sugar' season 2 from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Sugar" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-sugar-season-2-trailer"><span>'Sugar' season 2 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/WJMbHySi5eQ" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-sugar-season-2-cast"><span>'Sugar' season 2 cast</span></h2><ul><li><strong>Colin Farrell</strong> as John Sugar</li><li><strong>Jin Ha</strong> as the missing boxer</li><li><strong>Raymond Lee</strong></li><li><strong>Tony Dalton</strong> as a lieutenant in the LA County Sheriff's Department</li><li><strong>Laura Donnelly</strong></li><li><strong>Sasha Calle</strong> as a hustler working for Sugar</li><li><strong>Shea Whigham</strong> as a government agency employee</li></ul><h2 class="article-body__section" id="section-sugar-season-2-episodes"><span>'Sugar' season 2 episodes</span></h2><ul><li><strong>Episode 1 - Home Away from Home</strong>: June 19, 2026 </li><li><strong>Episode 2 - Downer Town</strong>: June 26, 2026 </li><li><strong>Episode 3 - Watch Face</strong>: July 3, 2026 </li><li><strong>Episode 4 - Off 15</strong>: July 10, 2026 </li><li><strong>Episode 5 - TBA</strong>: July 17, 2026 </li><li><strong>Episode 6 - TBA</strong>: July 24, 2026 </li><li><strong>Episode 7 - TBA</strong>: July 31, 2026 </li><li><strong>Episode 8 - TBA</strong>: August 7, 2026 </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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear">How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><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[ 'Widow's Bay' season 2: Everything we know so far ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We're halfway through 2026 already, and the list of <a href="https://www.tomsguide.com/entertainment/netflix/we-asked-our-readers-for-the-best-netflix-original-show-or-movie-of-2026-so-far-and-there-was-a-clear-winner">best shows of the year</a> (so far) is steadily growing. <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv"><strong>Apple TV's</strong></a><strong> "Widow's Bay"</strong> is certainly among that illustrious group. If you haven't tuned in to the comedy-horror hit just yet, the Katie Dippold-created mystery is set in the fictional New England town of Widow's Bay, a scenic but sinister spot that is seemingly afflicted with a centuries-old curse that, much to the chagrin of the local mayor (Matthew Rhys) and his tourism efforts, has flooded the island with evil supernatural forces. </p><p>The 10-episode first season was acclaimed by both pro critics and casual viewers alike. Over on <a href="https://www.rottentomatoes.com/tv/widows_bay" target="_blank">Rotten Tomatoes</a>, the show has an excellent 97% approval rating, with the critics' consensus praising: "Katie Dippold successfully continues to invest in eccentricity with this outlandish horror-comedy that stokes the genre's well-worn tropes to winning effect, bringing scares, laughs, and a game cast.")</p><p>So it's not a surprise that, though season 1 has only just wrapped up on June 17, folks are already buzzing about a potential second season of the Apple TV comedy. Here's everything we know so far about "Widow's Bay" season 2. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="will-there-be-a-widow-s-bay-season-2">Will there be a 'Widow's Bay' season 2?</h2><p>Good news: "Widow's Bay" is officially coming back for a second season. Apple TV+ renewed the comedy-horror series for a season 2 on June 11 ahead of its season-one finale, with Kate Dippold back as showrunner and Matthew Rhys returning as main character Tom Loftis.</p><p>“From the moment audiences arrived in Widow’s Bay, they’ve been hooked on every eerie mystery, unexpected laughs, and cursed secret that Katie, Hiro, Matthew, and the entire team have created,” said Matt Cherniss, head of programming, Apple TV, in a statement. “It’s become one of those shows everyone’s talking about, and we’re thrilled to see audiences continue to embrace it. We can’t wait to return for another season.”</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/Nmc2RYm6PUE" allowfullscreen=""></iframe></div></div><h2 id="when-will-widow-s-bay-season-2-be-released">When will 'Widow's Bay' season 2 be released?</h2><p>The streaming service hasn't officially announced when fans will be able to return to Widow's Bay for the show's second installment. </p><p>A writers room is still to be assembled, so we'll have some time before scripts are finished. And given that it took about 10 months from production (filming took place in Massachusetts in June 2025) to release (the first episode dropped on Apple TV on Wednesday, April 29), it's unlikely that a second season will premiere before late 2027 or early 2028. </p><h2 id="who-will-be-in-the-cast-of-widow-s-bay-season-2">Who will be in the cast of 'Widow's Bay' season 2?</h2><p>Of course, you can't have "Widow's Bay" without its beleaguered mayor Tom Loftis, so series lead <strong>Matthew Rhys </strong>will be reprising his role. He'll likely be joined by fellow show regulars <strong>Kate O'Flynn</strong> as Patricia Moyer, <strong>Stephen Root</strong> as Wyck Crawford, <strong>Kevin Carroll</strong> as Sheriff Bechir Clemmons, <strong>Kingston Rumi Southwick</strong> as Evan Loftis and <strong>Dale Dickey</strong> as Rosemary.</p><p>Fans can also expect to see much of the supporting cast return for season two, such as Emmy winner <strong>Jeff Hiller</strong> as Dale, <strong>K Callan</strong> as Ruth Livingston, <strong>Nancy Lenehan</strong> as Gerrie Doyle, <strong>Neil Casey</strong> as Kurt, and <strong>Sipiwe Moyo</strong> as Chelle. It will also be interesting to see which guest stars the series pulls in for the second season; as you no doubt remember, the show featured the likes of <strong>Hamish Linklater</strong> and <strong>Betty Gilpin</strong> in guest-star roles in its first edition. </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="oarrwybiJUFgXoWUuR3eDZ" name="Matthew Rhys in 'Widow's Bay'" alt="Matthew Rhys in 'Widow's Bay'" src="https://cdn.mos.cms.futurecdn.net/oarrwybiJUFgXoWUuR3eDZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><h2 id="what-will-widow-s-bay-season-2-be-about">What will 'Widow's Bay' season 2 be about?</h2><p>As mentioned, scripts haven't been completed just yet for "Widow's Bay" season 2, but showrunner Katie Dippold did give a bit of a teaser on what fans can expect in the upcoming eps: "Season 2 is about how everything is great on the island and there’s nothing to worry about," she included in the renewal announcement. Okay, so when we said tease, we really meant <em>tease</em>. </p><p>There aren't concrete plot details yet, but at least it sounds like star Matthew Rhys is just as desperate for intel as we are. "I’ve been asked, 'What do you think?' And I said, 'I have no idea how this is going to unfold!'" the actor told <a href="https://variety.com/2026/tv/news/widows-bay-finale-recap-matthew-rhys-interview-1236783271/" target="_blank">Variety</a> in a recent interview. </p><p>"This is why I don’t write, because I’m like, 'What are they gonna do?' Not just me — Kevin Carroll’s character with his child. Everyone! What they’ve done is loaded the bases, to use an American analogy I know nothing of. Everyone has a high-stakes cliffhanger. I don’t know how they’re gonna deal with their food, let alone Tom! It’s gonna be crazy."</p><p>Tom's Guide will keep you up to date on all things related to "Widow's Bay," including release dates, casting news, plot details, teaser trailers and more.</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/apple-tv/everything-new-on-apple-tv-in-june-2026">Everything new on Apple TV in June 2026</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li></ul><div data-model-name="Disney+,Netflix,Paramount Plus,Hulu,Peacock TV,Apple TV" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/widows-bay-season-2-everything-we-know-so-far</link>
                                                                            <description>
                            <![CDATA[ Apple TV's comedy-horror hit 'Widow's Bay is coming back for a second season—here's what we know so far about release schedules, cast details and more ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vK62fLDLffgETFnu6mYFsM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jk8d7efAdpyGCLhvP6ziCZ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 18:08:48 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE-320-70.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/jk8d7efAdpyGCLhvP6ziCZ-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Matthew Rhys in &#039;Widow&#039;s Bay&#039;]]></media:description>                                                            <media:text><![CDATA[Matthew Rhys in &#039;Widow&#039;s Bay&#039;]]></media:text>
                                <media:title type="plain"><![CDATA[Matthew Rhys in &#039;Widow&#039;s Bay&#039;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jk8d7efAdpyGCLhvP6ziCZ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're halfway through 2026 already, and the list of <a href="https://www.tomsguide.com/entertainment/netflix/we-asked-our-readers-for-the-best-netflix-original-show-or-movie-of-2026-so-far-and-there-was-a-clear-winner">best shows of the year</a> (so far) is steadily growing. <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv"><strong>Apple TV's</strong></a><strong> "Widow's Bay"</strong> is certainly among that illustrious group. If you haven't tuned in to the comedy-horror hit just yet, the Katie Dippold-created mystery is set in the fictional New England town of Widow's Bay, a scenic but sinister spot that is seemingly afflicted with a centuries-old curse that, much to the chagrin of the local mayor (Matthew Rhys) and his tourism efforts, has flooded the island with evil supernatural forces. </p><p>The 10-episode first season was acclaimed by both pro critics and casual viewers alike. Over on <a href="https://www.rottentomatoes.com/tv/widows_bay" target="_blank">Rotten Tomatoes</a>, the show has an excellent 97% approval rating, with the critics' consensus praising: "Katie Dippold successfully continues to invest in eccentricity with this outlandish horror-comedy that stokes the genre's well-worn tropes to winning effect, bringing scares, laughs, and a game cast.")</p><p>So it's not a surprise that, though season 1 has only just wrapped up on June 17, folks are already buzzing about a potential second season of the Apple TV comedy. Here's everything we know so far about "Widow's Bay" season 2. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="will-there-be-a-widow-s-bay-season-2">Will there be a 'Widow's Bay' season 2?</h2><p>Good news: "Widow's Bay" is officially coming back for a second season. Apple TV+ renewed the comedy-horror series for a season 2 on June 11 ahead of its season-one finale, with Kate Dippold back as showrunner and Matthew Rhys returning as main character Tom Loftis.</p><p>“From the moment audiences arrived in Widow’s Bay, they’ve been hooked on every eerie mystery, unexpected laughs, and cursed secret that Katie, Hiro, Matthew, and the entire team have created,” said Matt Cherniss, head of programming, Apple TV, in a statement. “It’s become one of those shows everyone’s talking about, and we’re thrilled to see audiences continue to embrace it. We can’t wait to return for another season.”</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/Nmc2RYm6PUE" allowfullscreen=""></iframe></div></div><h2 id="when-will-widow-s-bay-season-2-be-released">When will 'Widow's Bay' season 2 be released?</h2><p>The streaming service hasn't officially announced when fans will be able to return to Widow's Bay for the show's second installment. </p><p>A writers room is still to be assembled, so we'll have some time before scripts are finished. And given that it took about 10 months from production (filming took place in Massachusetts in June 2025) to release (the first episode dropped on Apple TV on Wednesday, April 29), it's unlikely that a second season will premiere before late 2027 or early 2028. </p><h2 id="who-will-be-in-the-cast-of-widow-s-bay-season-2">Who will be in the cast of 'Widow's Bay' season 2?</h2><p>Of course, you can't have "Widow's Bay" without its beleaguered mayor Tom Loftis, so series lead <strong>Matthew Rhys </strong>will be reprising his role. He'll likely be joined by fellow show regulars <strong>Kate O'Flynn</strong> as Patricia Moyer, <strong>Stephen Root</strong> as Wyck Crawford, <strong>Kevin Carroll</strong> as Sheriff Bechir Clemmons, <strong>Kingston Rumi Southwick</strong> as Evan Loftis and <strong>Dale Dickey</strong> as Rosemary.</p><p>Fans can also expect to see much of the supporting cast return for season two, such as Emmy winner <strong>Jeff Hiller</strong> as Dale, <strong>K Callan</strong> as Ruth Livingston, <strong>Nancy Lenehan</strong> as Gerrie Doyle, <strong>Neil Casey</strong> as Kurt, and <strong>Sipiwe Moyo</strong> as Chelle. It will also be interesting to see which guest stars the series pulls in for the second season; as you no doubt remember, the show featured the likes of <strong>Hamish Linklater</strong> and <strong>Betty Gilpin</strong> in guest-star roles in its first edition. </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="oarrwybiJUFgXoWUuR3eDZ" name="Matthew Rhys in 'Widow's Bay'" alt="Matthew Rhys in 'Widow's Bay'" src="https://cdn.mos.cms.futurecdn.net/oarrwybiJUFgXoWUuR3eDZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><h2 id="what-will-widow-s-bay-season-2-be-about">What will 'Widow's Bay' season 2 be about?</h2><p>As mentioned, scripts haven't been completed just yet for "Widow's Bay" season 2, but showrunner Katie Dippold did give a bit of a teaser on what fans can expect in the upcoming eps: "Season 2 is about how everything is great on the island and there’s nothing to worry about," she included in the renewal announcement. Okay, so when we said tease, we really meant <em>tease</em>. </p><p>There aren't concrete plot details yet, but at least it sounds like star Matthew Rhys is just as desperate for intel as we are. "I’ve been asked, 'What do you think?' And I said, 'I have no idea how this is going to unfold!'" the actor told <a href="https://variety.com/2026/tv/news/widows-bay-finale-recap-matthew-rhys-interview-1236783271/" target="_blank">Variety</a> in a recent interview. </p><p>"This is why I don’t write, because I’m like, 'What are they gonna do?' Not just me — Kevin Carroll’s character with his child. Everyone! What they’ve done is loaded the bases, to use an American analogy I know nothing of. Everyone has a high-stakes cliffhanger. I don’t know how they’re gonna deal with their food, let alone Tom! It’s gonna be crazy."</p><p>Tom's Guide will keep you up to date on all things related to "Widow's Bay," including release dates, casting news, plot details, teaser trailers and more.</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/apple-tv/everything-new-on-apple-tv-in-june-2026">Everything new on Apple TV in June 2026</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li></ul><div data-model-name="Disney+,Netflix,Paramount Plus,Hulu,Peacock TV,Apple TV" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ tvOS 27 cuts off two Apple TV devices — does this mean a new box is coming? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Apple spent most of <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> revealing the <a href="https://www.tomsguide.com/ai/apple-intelligence/i-just-saw-the-new-siri-ai-in-action-at-wwdc-heres-what-i-like-and-what-still-needs-work">upgraded Siri AI</a>, which left several Apple platforms, including tvOS, seemingly ignored. But there is an update coming, and it may indicate that new hardware is finally coming.</p><p>The new tvOS 27 is the first update in years that actually ends support for some older Apple TV streaming boxes. Specifically, the <a href="https://www.tomsguide.com/us/apple-tv-2015,review-3166.html">Apple TV HD</a>, launched in 2015, and the <a href="https://www.tomsguide.com/us/apple-tv-4k,review-4693.html">first-generation Apple TV 4K</a>, released in 2017, will not be compatible with the update. </p><p>That ends a decade and eight years of support, respectively. To be fair, the Apple TV HD <a href="https://www.tomsguide.com/news/apple-just-killed-the-apple-tv-hd">hasn't been available for the last four years</a>.</p><p>Instead, the update will only be eligible for the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2021">second-generation Apple TV 4K</a>, from 2021, and the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">third-generation models</a> released in 2022.  </p><p>Since at least 2024, <a href="https://www.tomsguide.com/entertainment/streaming-devices/is-a-new-apple-tv-in-the-works-heres-how-john-ternus-tenure-as-apple-ceo-could-benefit-apples-streaming-device">rumors have continuously suggested</a> that Apple was on the precipice of releasing a new Apple TV streaming device. </p><p>Clearly, that has not happened. And yet, here we are.</p><h2 id="apple-s-push-into-smart-home">Apple's push into smart home</h2><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="G6Xjctbki6NWtxvCEaExDj" name="smart speaker.jpg" alt="Voice commands - A Google Home smart speaker on a desk" src="https://cdn.mos.cms.futurecdn.net/G6Xjctbki6NWtxvCEaExDj-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>As long as rumors about a new Apple TV device have surfaced, it's also been expected that Apple will release a<a href="https://www.tomsguide.com/home/smart-home/apple-could-launch-7-new-smart-home-devices-this-year-but-theres-a-catch"> suite of smart home devices </a>centered around an AI-powered rebuilt Siri. Apple TV devices are supposed to be part of that program.</p><p>That new Siri is finally arriving with iOS 27, which could power how a new Apple TV connects to your smart home.</p><p>It's been suggested that Siri and Thread connectivity would allow you to use the new Apple TV as a sort of hub for smart devices. This connects with rumors that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera</a> that would allow for FaceTime calls and gesture-based controls. As far back as 2022, it was rumored that <a href="https://www.tomsguide.com/news/the-next-apple-tv-might-combine-homepad-and-facetime-camera">Apple might combine the streaming device</a> with a HomePod.</p><p>Unlike the rumored HomePod, it's never been clear if Apple is delaying a refresh because of Siri or for some other reason, despite the growing gap between updates.</p><h2 id="what-is-coming-with-tvos-27">What is coming with tvOS 27?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3P7D3ScniwLhWUtZseV6tP" name="TG Apple OLED LIST" alt="The tvOS platform on a TV." src="https://cdn.mos.cms.futurecdn.net/3P7D3ScniwLhWUtZseV6tP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Credit: Apple / Tom's Guide)</span></figcaption></figure><p>The tvOS 27 update isn't bereft of new features. Here's what we know is coming. </p><ul><li>More responsive Control Center</li><li>Faster AirPlay connectivity</li><li>Improved app launches, animations</li><li>Smarter downloads</li><li>New, larger text accessibility options</li><li>Apple Care details in the Settings app</li></ul><p>It is minimal, and Apple hasn't even put up a <a href="https://www.apple.com/os/" target="_blank">preview page</a> as it's done with the other 27 OS updates. Even the <a href="https://developer.apple.com/documentation/tvos-release-notes/tvos-27-release-notes" target="_blank">tvOS 27 release notes</a> that I found on the Apple Developer site mostly feature fixes that Apple is applying to tvOS.</p><p>The notes do mention the new HomeKit video recordings, which should improve Apple's just-announced<a href="https://www.tomsguide.com/home/smart-home/apple-intelligence-security-camera-features-just-seriously-undercut-ring-and-google" target="_blank"> smart home security camera capabilities</a>.</p><p>The first tvOS 27 developer beta is available now, and the public beta will launch in July. The full update will most likely be released later this year, in September.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/apple-intelligence/some-ai-features-arent-available-on-older-iphones-but-are-you-actually-missing-that-much">Some AI features aren't available on older iPhones, but are you actually missing that much?</a></li><li><a href="https://www.tomsguide.com/phones/i-tried-ios-27-clean-up-vs-galaxy-ai-photo-assist-in-a-7-round-test-and-i-was-surprised-with-how-close-it-was">I pitted iOS 27 Clean Up vs Galaxy AI in a 7-round eraser showdown — Apple makes it close, but here's where it stumbles</a></li><li><a href="https://www.tomsguide.com/ai/apple-spent-years-rebuilding-siri-but-chatgpt-changed-what-people-want-from-ai">Apple spent years fixing Siri — only for ChatGPT to make it irrelevant</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming-devices/tvos-27-cuts-off-two-apple-tv-devices-does-this-mean-a-new-box-is-coming</link>
                                                                            <description>
                            <![CDATA[ When tvOS 27 releases later this year, two Apple TV devices will lose support. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">33mXMidF4YS4ZBUDKEeMpd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Jun 2026 19:17:28 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming Devices]]></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-320-70.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/35tUhk2U4oNYnKewrYtsxJ-1920-80.jpg">
                                                            <media:credit><![CDATA[Lebedev Yury/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV]]></media:description>                                                            <media:text><![CDATA[Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple spent most of <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> revealing the <a href="https://www.tomsguide.com/ai/apple-intelligence/i-just-saw-the-new-siri-ai-in-action-at-wwdc-heres-what-i-like-and-what-still-needs-work">upgraded Siri AI</a>, which left several Apple platforms, including tvOS, seemingly ignored. But there is an update coming, and it may indicate that new hardware is finally coming.</p><p>The new tvOS 27 is the first update in years that actually ends support for some older Apple TV streaming boxes. Specifically, the <a href="https://www.tomsguide.com/us/apple-tv-2015,review-3166.html">Apple TV HD</a>, launched in 2015, and the <a href="https://www.tomsguide.com/us/apple-tv-4k,review-4693.html">first-generation Apple TV 4K</a>, released in 2017, will not be compatible with the update. </p><p>That ends a decade and eight years of support, respectively. To be fair, the Apple TV HD <a href="https://www.tomsguide.com/news/apple-just-killed-the-apple-tv-hd">hasn't been available for the last four years</a>.</p><p>Instead, the update will only be eligible for the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2021">second-generation Apple TV 4K</a>, from 2021, and the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">third-generation models</a> released in 2022.  </p><p>Since at least 2024, <a href="https://www.tomsguide.com/entertainment/streaming-devices/is-a-new-apple-tv-in-the-works-heres-how-john-ternus-tenure-as-apple-ceo-could-benefit-apples-streaming-device">rumors have continuously suggested</a> that Apple was on the precipice of releasing a new Apple TV streaming device. </p><p>Clearly, that has not happened. And yet, here we are.</p><h2 id="apple-s-push-into-smart-home">Apple's push into smart home</h2><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="G6Xjctbki6NWtxvCEaExDj" name="smart speaker.jpg" alt="Voice commands - A Google Home smart speaker on a desk" src="https://cdn.mos.cms.futurecdn.net/G6Xjctbki6NWtxvCEaExDj-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>As long as rumors about a new Apple TV device have surfaced, it's also been expected that Apple will release a<a href="https://www.tomsguide.com/home/smart-home/apple-could-launch-7-new-smart-home-devices-this-year-but-theres-a-catch"> suite of smart home devices </a>centered around an AI-powered rebuilt Siri. Apple TV devices are supposed to be part of that program.</p><p>That new Siri is finally arriving with iOS 27, which could power how a new Apple TV connects to your smart home.</p><p>It's been suggested that Siri and Thread connectivity would allow you to use the new Apple TV as a sort of hub for smart devices. This connects with rumors that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera</a> that would allow for FaceTime calls and gesture-based controls. As far back as 2022, it was rumored that <a href="https://www.tomsguide.com/news/the-next-apple-tv-might-combine-homepad-and-facetime-camera">Apple might combine the streaming device</a> with a HomePod.</p><p>Unlike the rumored HomePod, it's never been clear if Apple is delaying a refresh because of Siri or for some other reason, despite the growing gap between updates.</p><h2 id="what-is-coming-with-tvos-27">What is coming with tvOS 27?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check="" ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3P7D3ScniwLhWUtZseV6tP" name="TG Apple OLED LIST" alt="The tvOS platform on a TV." src="https://cdn.mos.cms.futurecdn.net/3P7D3ScniwLhWUtZseV6tP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Credit: Apple / Tom's Guide)</span></figcaption></figure><p>The tvOS 27 update isn't bereft of new features. Here's what we know is coming. </p><ul><li>More responsive Control Center</li><li>Faster AirPlay connectivity</li><li>Improved app launches, animations</li><li>Smarter downloads</li><li>New, larger text accessibility options</li><li>Apple Care details in the Settings app</li></ul><p>It is minimal, and Apple hasn't even put up a <a href="https://www.apple.com/os/" target="_blank">preview page</a> as it's done with the other 27 OS updates. Even the <a href="https://developer.apple.com/documentation/tvos-release-notes/tvos-27-release-notes" target="_blank">tvOS 27 release notes</a> that I found on the Apple Developer site mostly feature fixes that Apple is applying to tvOS.</p><p>The notes do mention the new HomeKit video recordings, which should improve Apple's just-announced<a href="https://www.tomsguide.com/home/smart-home/apple-intelligence-security-camera-features-just-seriously-undercut-ring-and-google" target="_blank"> smart home security camera capabilities</a>.</p><p>The first tvOS 27 developer beta is available now, and the public beta will launch in July. The full update will most likely be released later this year, in September.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/apple-intelligence/some-ai-features-arent-available-on-older-iphones-but-are-you-actually-missing-that-much">Some AI features aren't available on older iPhones, but are you actually missing that much?</a></li><li><a href="https://www.tomsguide.com/phones/i-tried-ios-27-clean-up-vs-galaxy-ai-photo-assist-in-a-7-round-test-and-i-was-surprised-with-how-close-it-was">I pitted iOS 27 Clean Up vs Galaxy AI in a 7-round eraser showdown — Apple makes it close, but here's where it stumbles</a></li><li><a href="https://www.tomsguide.com/ai/apple-spent-years-rebuilding-siri-but-chatgpt-changed-what-people-want-from-ai">Apple spent years fixing Siri — only for ChatGPT to make it irrelevant</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The original 1962 "Cape Fear" remains a timeless classic but that did not stop it being remade in 1991 with Robert De Niro as Max Cady and now, as a mini-series, with Javier Bardem playing the terrifying ex-convict on a mission...<br /><br />Here’s how to <strong>watch "Cape Fear" online </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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">'Cape Fear' - Release Dates &amp; Streams</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Cape Fear" premieres with a double episode drop on <strong>Friday, June 5</strong> worldwide. New episodes then arrive weekly every Friday until the finale on July 31, 2026.<br /><strong>• Global – </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch from anywhere – </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (Try risk-free; 75% Off)</strong></a></p></div></div><p>With 10 episodes to play with, showrunner Nick Antosca (see below for bio), can stretch out the psychological drama and torture for the Bowden family that has always been at the dark heart of the story since John D. MacDonald wrote the source novel, "The Executioners", almost 70 years ago. </p><p>This time, however, it has been updated to incorporate 21st-century concerns with gaslighting, AI fakes, false accusation and public shaming all called upon in the name of psychological overload - and that's just for the viewer, not the Bowden family.</p><p>Amy Adams delivers a star turn as Bowden matriarch, Anna, while Martin Scorsese and Steven Spielberg are among the executive producers.</p><p>Read on to find out all you need to watch <strong>"Cape Fear" </strong>online from anywhere.</p><h2 class="article-body__section" id="section-watch-cape-fear-on-apple-tv"><span>Watch 'Cape Fear' on Apple TV</span></h2><div class="product"><a data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension48=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong>"Cape Fear" premieres globally on </strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label='"Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)' data-dimension48='"Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)' data-dimension25=""><strong>Apple TV (7-day FREE trial for new subscribers)</strong></a><strong> on Friday, June 5.</strong></p><p>You will not need to rent or buy it as it will come as part of your Apple TV subscription.<br /><br />Prices for the streaming platforms are as follows:</p><p><strong>🇺🇸 U.S. — $12.99/month</strong><br /><strong>🇨🇦 CAN — CA$14.99/month</strong><br /><strong>🇬🇧 U.K. — £9.99/month</strong><br /><strong>🇦🇺 AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension48=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-cape-fear-anywhere"><span>Watch 'Cape Fear' anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there.</p><div class="product"><a data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/us/show/cape-fear/umc.cmc.377zdzwefgtzkvykexeca9qrc" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Cape Fear" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">View Deal</a></p></div><p>It's really easy to use a VPN to watch "Cape Fear".</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&amp;aff_id=3013&amp;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 want to watch it on your U.S. version of Apple TV, choose 'United States' from the list.</p><p><strong>3. Sit back and binge. </strong>Head to Apple TV, sign in, and watch "Cape Fear" from any location.</p><h2 class="article-body__section" id="section-what-you-need-to-know-about-cape-fear"><span>What you need to know about 'Cape Fear'</span></h2><h2 id="cape-fear-trailer">'Cape Fear' 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/FZ3sN5E-mBU" allowfullscreen=""></iframe></div></div><h2 id="cape-fear-cast">'Cape Fear' - Cast</h2><ul><li>Javier Bardem as Max Cady</li><li>Amy Adams as Anna Bowden</li><li>Patrick Wilson as Tom Bowden</li><li>Lily Collias as Natalie Bowden</li><li>Samantha Clifford as Hope</li><li>Amanda Dunn as Melissa</li><li>Gem Marc Collins as Kyle</li><li>Miles Mussenden as Carson</li><li>Gabriel Byndloss as Paloma</li><li>CCH Pounder as Noa Toussaint</li><li>Jullian Dulce Vida as Byron French</li><li>Joe Anders as Zack Bowden</li><li>Malia Pyles as Nevaeh Valentine</li><li>Brandon Hirsch as Jared</li><li>Jamie Hector</li><li>Margarita Levieva</li><li>Ron Perlman</li><li>Ted Levine</li><li>Patrick Fischler</li></ul><h3 class="article-body__section" id="section-cape-fear-episode-guide"><span>'Cape Fear' - Episode guide</span></h3><ul><li><strong>Episode 1 - Fingers &amp; Toes</strong>: Friday, June 5</li><li><strong>Episode 2 - Why Would I Want to Hurt You?</strong>: Friday, June 5</li><li><strong>Episode 3 - Phantom Sensations</strong>: Friday, June 12</li><li><strong>Episode 4 - Pierced</strong>: Friday, June 19</li><li><strong>Episode 5 - Faith</strong>: Friday, June 26</li><li><strong>Episode 6 - Possum</strong>: Friday, July 3</li><li><strong>Episode 7 - Mongrel</strong>: Friday, July 10</li><li><strong>Episode 8 - Los tiempos de Dios son Perfectos</strong>: Friday, July 17</li><li><strong>Episode 9 - The Scar</strong> : Friday, July 24</li><li><strong>Episode 10 - TBA</strong> : Friday, July 31</li></ul><section class="article__schema-question"><h3>What has creator, writer, exec producer and showrunner Nick Antosca done on TV before?</h3><article class="article__schema-answer"><p>Also a novelist, Antosca was writer/creator/co-creator of <strong>Hannibal </strong>(2015), <strong>Channel Zero</strong> (2016–2018), <strong>The Act </strong>(2019), <strong>Brand New Cherry Flavor</strong> (2021) and <strong>A Friend of the Family</strong> (2022).</p></article></section><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-june-2026">Everything new on Apple TV in June 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">Best streaming VPN</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-naked-and-afraid-global-showdown">How to watch 'Naked and Afraid: Global Showdown' — stream the survival reality TV show 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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear</link>
                                                                            <description>
                            <![CDATA[ Ex-convict Max Cady, on a revenge mission, just won't quit. Here's how to watch Javier Bardem thriller "Cape Fear" on Apple TV from anywhere in the world. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3oMHK4UHawzgLJxQASJAmc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sVBrnHJySTbX6bS4ySGZ9k-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 04 Jun 2026 23:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Bill Borrows ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xeK7rkjq8eWYnEFsoB9rka-320-70.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Bill Borrows is a leading journalist, feature writer and columnist. His work appears in most U.K. national newspapers from the &lt;a href=&quot;https://www.mirror.co.uk/sport/boxing/ricky-hatton-documentary-mental-health-30827644 )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Mirror&lt;/a&gt; to the &lt;a href=&quot;https://www.telegraph.co.uk/authors/b/bf-bj/bill-borrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Telegraph&lt;/a&gt; but also in publications such as the &lt;a href=&quot;https://www.thetimes.co.uk/article/owen-farrell-on-england-the-six-nations-father-andy-and-the-art-of-leadership-dtt5t8vvw&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Times Magazine&lt;/a&gt; where he has produced exclusive interviews with rugby legend Owen Farrell and heavyweight World champion boxer &lt;a href=&quot;https://www.thetimes.co.uk/article/tyson-fury-after-depression-and-deontay-wilder-the-comeback-continues-&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Tyson Fury&lt;/a&gt;. He has been a regular contributor to the prestigious &lt;a href=&quot;https://www.radiotimes.com/author/billborrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Radio Times&lt;/a&gt; magazine (and online) for over 10 years and during that time, alongside cover interviews with major TV personalities, has covered programmes on everything from the Paralympics to poltergeists and the Qatar World Cup to the Iraq War. Work has also appeared in many other magazines, including Cosmopolitan, &lt;a href=&quot;https://www.marieclaire.co.uk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Marie Clare&lt;/a&gt;, Grazia, Vogue Hommes International and TimeOut. &lt;/p&gt;&lt;p&gt;In a previous life he was Editor-at-Large at Loaded and &lt;a href=&quot;https://www.independent.co.uk/news/media/my-mentor-bill-borrows-on-hunter-s-thompson-6230842.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;interviewed his mentor&lt;/a&gt;, Hunter S. Thompson. He was also Editor-at-Large at Maxim magazine and Contributing Editor at Esquire and launch editor of both TimeOut Manchester and talkSPORT digital magazine. He is the author of the best-selling &lt;a href=&quot;https://www.amazon.co.uk/Hurricane-Turbulent-Life-Times-Higgins/dp/184354069X&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;The Hurricane&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: The Turbulent Life and Times of Alex Higgins&lt;/em&gt; - Sports Books of the Year The Times &amp; Sunday Telegraph, Books of the Year New Statesman - and also editor for several sport-related books including the &lt;a href=&quot;https://www.simonandschuster.com/books/The-talkSPORT-Book-of-Premier-League-Legends/Bill-Borrows/9781849839419&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT Book of Premier League Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;and co-wrote the &lt;a href=&quot;https://www.amazon.co.uk/Talksport-Greatest-British-Sporting-Legends/dp/0857200933&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT 100 Greatest British Sporting Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;with a lot of help from fellow journalist &lt;a href=&quot;https://www.tomsguide.com/author/tom-bailey&quot;&gt;Tom Bailey&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;On television he conceived and developed the &lt;a href=&quot;https://www.youtube.com/watch?v=IPDtcESrFWE )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;Posh Pawn&lt;/em&gt;&lt;/a&gt; TV series for Channel 4 and was Associate Producer on the award-winning &lt;em&gt;Murder in the Outback&lt;/em&gt; for Channel Seven in Australia and &lt;a href=&quot;https://www.channel4.com/programmes/murder-in-the-outback&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Channel 4&lt;/a&gt; in the U.K.. A frequent contributor for BBC Radio 5, talkSPORT and talkRADIO, his areas of specialisation include sport, history, politics, TV and film. He is currently writing a biography of the greatest detective of the Victorian period and doesn’t get much free time but does admit to an addiction to true crime podcasts, following Manchester City football team and a weakness for Spanish food.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/sVBrnHJySTbX6bS4ySGZ9k-1920-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                        <media:description><![CDATA[Max Cady (played by Javier Bardem) calls a meeting with his former legal team - Anna (Amy Adams) and Tom Bowden (Patrick Wilson) - in &quot;Cape Fear&quot;]]></media:description>                                                            <media:text><![CDATA[A menacing Max Cady appears]]></media:text>
                                <media:title type="plain"><![CDATA[A menacing Max Cady appears]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sVBrnHJySTbX6bS4ySGZ9k-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The original 1962 "Cape Fear" remains a timeless classic but that did not stop it being remade in 1991 with Robert De Niro as Max Cady and now, as a mini-series, with Javier Bardem playing the terrifying ex-convict on a mission...<br /><br />Here’s how to <strong>watch "Cape Fear" online </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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">'Cape Fear' - Release Dates &amp; Streams</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Cape Fear" premieres with a double episode drop on <strong>Friday, June 5</strong> worldwide. New episodes then arrive weekly every Friday until the finale on July 31, 2026.<br /><strong>• Global – </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch from anywhere – </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (Try risk-free; 75% Off)</strong></a></p></div></div><p>With 10 episodes to play with, showrunner Nick Antosca (see below for bio), can stretch out the psychological drama and torture for the Bowden family that has always been at the dark heart of the story since John D. MacDonald wrote the source novel, "The Executioners", almost 70 years ago. </p><p>This time, however, it has been updated to incorporate 21st-century concerns with gaslighting, AI fakes, false accusation and public shaming all called upon in the name of psychological overload - and that's just for the viewer, not the Bowden family.</p><p>Amy Adams delivers a star turn as Bowden matriarch, Anna, while Martin Scorsese and Steven Spielberg are among the executive producers.</p><p>Read on to find out all you need to watch <strong>"Cape Fear" </strong>online from anywhere.</p><h2 class="article-body__section" id="section-watch-cape-fear-on-apple-tv"><span>Watch 'Cape Fear' on Apple TV</span></h2><div class="product"><a data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension48=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p><strong>"Cape Fear" premieres globally on </strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label='"Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)' data-dimension48='"Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)' data-dimension25=""><strong>Apple TV (7-day FREE trial for new subscribers)</strong></a><strong> on Friday, June 5.</strong></p><p>You will not need to rent or buy it as it will come as part of your Apple TV subscription.<br /><br />Prices for the streaming platforms are as follows:</p><p><strong>🇺🇸 U.S. — $12.99/month</strong><br /><strong>🇨🇦 CAN — CA$14.99/month</strong><br /><strong>🇬🇧 U.K. — £9.99/month</strong><br /><strong>🇦🇺 AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension48=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-cape-fear-anywhere"><span>Watch 'Cape Fear' anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there.</p><div class="product"><a data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/us/show/cape-fear/umc.cmc.377zdzwefgtzkvykexeca9qrc" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Cape Fear" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">View Deal</a></p></div><p>It's really easy to use a VPN to watch "Cape Fear".</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&amp;aff_id=3013&amp;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 want to watch it on your U.S. version of Apple TV, choose 'United States' from the list.</p><p><strong>3. Sit back and binge. </strong>Head to Apple TV, sign in, and watch "Cape Fear" from any location.</p><h2 class="article-body__section" id="section-what-you-need-to-know-about-cape-fear"><span>What you need to know about 'Cape Fear'</span></h2><h2 id="cape-fear-trailer">'Cape Fear' 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/FZ3sN5E-mBU" allowfullscreen=""></iframe></div></div><h2 id="cape-fear-cast">'Cape Fear' - Cast</h2><ul><li>Javier Bardem as Max Cady</li><li>Amy Adams as Anna Bowden</li><li>Patrick Wilson as Tom Bowden</li><li>Lily Collias as Natalie Bowden</li><li>Samantha Clifford as Hope</li><li>Amanda Dunn as Melissa</li><li>Gem Marc Collins as Kyle</li><li>Miles Mussenden as Carson</li><li>Gabriel Byndloss as Paloma</li><li>CCH Pounder as Noa Toussaint</li><li>Jullian Dulce Vida as Byron French</li><li>Joe Anders as Zack Bowden</li><li>Malia Pyles as Nevaeh Valentine</li><li>Brandon Hirsch as Jared</li><li>Jamie Hector</li><li>Margarita Levieva</li><li>Ron Perlman</li><li>Ted Levine</li><li>Patrick Fischler</li></ul><h3 class="article-body__section" id="section-cape-fear-episode-guide"><span>'Cape Fear' - Episode guide</span></h3><ul><li><strong>Episode 1 - Fingers &amp; Toes</strong>: Friday, June 5</li><li><strong>Episode 2 - Why Would I Want to Hurt You?</strong>: Friday, June 5</li><li><strong>Episode 3 - Phantom Sensations</strong>: Friday, June 12</li><li><strong>Episode 4 - Pierced</strong>: Friday, June 19</li><li><strong>Episode 5 - Faith</strong>: Friday, June 26</li><li><strong>Episode 6 - Possum</strong>: Friday, July 3</li><li><strong>Episode 7 - Mongrel</strong>: Friday, July 10</li><li><strong>Episode 8 - Los tiempos de Dios son Perfectos</strong>: Friday, July 17</li><li><strong>Episode 9 - The Scar</strong> : Friday, July 24</li><li><strong>Episode 10 - TBA</strong> : Friday, July 31</li></ul><section class="article__schema-question"><h3>What has creator, writer, exec producer and showrunner Nick Antosca done on TV before?</h3><article class="article__schema-answer"><p>Also a novelist, Antosca was writer/creator/co-creator of <strong>Hannibal </strong>(2015), <strong>Channel Zero</strong> (2016–2018), <strong>The Act </strong>(2019), <strong>Brand New Cherry Flavor</strong> (2021) and <strong>A Friend of the Family</strong> (2022).</p></article></section><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-june-2026">Everything new on Apple TV in June 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">Best streaming VPN</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-naked-and-afraid-global-showdown">How to watch 'Naked and Afraid: Global Showdown' — stream the survival reality TV show 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[ ‘Star City’ review: Apple TV’s new ‘For All Mankind’ spinoff is a gripping Soviet spy thriller that I’m (mostly) here for ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Star City'</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: </strong>3.5 stars (out of 5)</p><p class="fancy-box__body-text"><strong>Verdict:</strong> “Star City” trades the soaring optimism of early “For All Mankind” for a darker, more paranoid Cold War spy-thriller vibe. It doesn’t hit the same emotional highs as its predecessor (at least not yet), but the tense atmosphere and strong performances make it an intriguing addition to the franchise.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episodes 1-2 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>Apple TV has spent the last few years quietly building one of the strongest sci-fi libraries among the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, but as the longest-running, “For All Mankind” remains the crown jewel. Ronald D. Moore’s alternate-history drama turned the space race into prestige television, blending Cold War politics, family melodrama and stressful engineering disasters into one improbably addictive package.</p><p>Over time, though, the series drifted further away from its grounded roots and deeper into sprawling sci-fi spectacle. So there’s something immediately appealing about “Star City,” a spinoff that rewinds the clock back to the late ’60s and asks: What if “For All Mankind” was less inspirational NASA drama and more paranoid Soviet spy thriller?</p><p>After watching the premiere's first two episodes, I’m cautiously on board. “Star City” doesn’t hit with quite the same emotional force as early “For All Mankind” as the premise naturally loses some impact the second time around. But shifting the story behind the Iron Curtain gives the franchise a fresh, darker energy. </p><h2 id="star-city-trades-optimism-for-paranoia">‘Star City’ trades optimism for paranoia</h2><p>Like the early seasons of "For All Mankind," “Star City” is set in the ’60s and early ’70s, taking us inside the Soviet space program following the USSR’s victory over the United States in the moon race. </p><p>At the center of it all is the mysterious, unnamed Chief Designer (Rhys Ifans), the architect behind the Soviet Union’s space dominance and a man treated with equal parts reverence and suspicion by the state. Around him orbits a sprawling ensemble of cosmonauts, engineers, KGB operatives and deeply unhappy spouses, because apparently emotional repression is just part of the Soviet identity.</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/V-yAMs307W4" allowfullscreen=""></iframe></div></div><p>The biggest tonal difference between this and “For All Mankind” becomes obvious immediately. The parent series, especially early on, had a sense of optimism and adventure underneath all the Cold War tension. “Star City,” meanwhile, feels actively allergic to hope. The sets are gray. The lighting is gray. The clothing is gray. </p><p> The grainy cinematography and drab Soviet aesthetic make the show feel oppressive, as likely intended. At times, it’s almost comically bleak — I half expected someone to announce that joy had officially been outlawed — but that makes the atmosphere all the more immersive.</p><p>The strongest part of the show involves Irina Morozova (Agnes O’Casey), a young KGB surveillance recruit tasked with listening in on cosmonauts and their families. Her storyline is the show's essence: a claustrophobic world where everybody is spying on everybody else and even minor personal failures can become state-level catastrophes.</p><p>"Star City" is smart to lean harder into espionage-thriller territory instead of simply recreating “For All Mankind” beat for beat. Yes, there are still nail-biting space sequences and last-minute engineering fixes that will trigger nostalgia for the original show’s early seasons. But the focus here is much more internal: secrets, betrayals and the psychological toll of life inside such a tightly-controlled society.</p><h2 id="verdict-star-city-is-an-intriguing-if-emotionally-chilly-pivot-for-the-franchise">Verdict: ‘Star City’ is an intriguing, if emotionally chilly, pivot for the franchise</h2><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="j9zLsRxedWS8KhVnC59ubF" name="starcity-ifans" alt="Rhys Ifans in Star City" src="https://cdn.mos.cms.futurecdn.net/j9zLsRxedWS8KhVnC59ubF-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>The biggest issue with “Star City,” at least based on the first two episodes, is that the characters haven’t fully come alive yet. There are compelling dynamics throughout the ensemble, particularly involving cosmonauts Sasha (Solly McLeod), Valya (Adam Nagaitis) and Anastasia Belikova (Alice Englert). But for now, the show currently feels more invested in mood than emotional depth.</p><p>That’s where comparisons to early “For All Mankind” get tricky. The characters were what made me so obsessed with the show early on. "Star City” hasn’t quite gotten there with its ensemble.</p><p>Still, there’s enough here to keep me watching. The performances are strong, particularly O’Casey and Ifans, and the darker spy thriller vibe gives the franchise a welcome change of pace instead of feeling like a tired retread. </p><p>No, “Star City” doesn’t feel as fresh or emotionally devastating as “For All Mankind” did when it first launched. But as a moodier, more paranoid companion piece to the original series, it’s a compelling mission so far.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eyqpbe"></div>                            </div>                            <script src="https://kwizly.com/embed/eyqpbe.js" async=""></script><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-other-bennet-sister">How to watch The Other Bennet Sister online</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/ive-watched-a-lot-of-shows-in-2026-so-far-heres-the-5-best">I watch TV for a living and these are the 5 shows for 2026 I’d actually recommend</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/xo-kitty-season-3-review-the-netflix-teen-dramedy-returns-with-a-charming-new-season-and-a-welcome-guest-star">'XO, Kitty' season 3 review: The Netflix teen dramedy returns with a charming new season — and a welcome guest star</a></li></ul><div data-model-name="HBO Max,Disney+,Hulu,Peacock TV,Paramount Plus" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/star-city-review-apple-tvs-new-for-all-mankind-spinoff-is-a-gripping-soviet-spy-thriller-that-im-mostly-here-for</link>
                                                                            <description>
                            <![CDATA[ This "Star City" review explores how Apple TV Plus’s new "For All Mankind" spinoff trades NASA optimism for a darker, paranoid Soviet spy thriller that mostly pulls it off. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ynEgt7FhZcvj7HWyVQXAGe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aRKRgqM7xNbwDBAyogp7WW-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 29 May 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></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-320-70.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/aRKRgqM7xNbwDBAyogp7WW-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Agnes O’Casey in Star City]]></media:description>                                                            <media:text><![CDATA[Agnes O’Casey in Star City]]></media:text>
                                <media:title type="plain"><![CDATA[Agnes O’Casey in Star City]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aRKRgqM7xNbwDBAyogp7WW-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Star City'</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: </strong>3.5 stars (out of 5)</p><p class="fancy-box__body-text"><strong>Verdict:</strong> “Star City” trades the soaring optimism of early “For All Mankind” for a darker, more paranoid Cold War spy-thriller vibe. It doesn’t hit the same emotional highs as its predecessor (at least not yet), but the tense atmosphere and strong performances make it an intriguing addition to the franchise.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episodes 1-2 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>Apple TV has spent the last few years quietly building one of the strongest sci-fi libraries among the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, but as the longest-running, “For All Mankind” remains the crown jewel. Ronald D. Moore’s alternate-history drama turned the space race into prestige television, blending Cold War politics, family melodrama and stressful engineering disasters into one improbably addictive package.</p><p>Over time, though, the series drifted further away from its grounded roots and deeper into sprawling sci-fi spectacle. So there’s something immediately appealing about “Star City,” a spinoff that rewinds the clock back to the late ’60s and asks: What if “For All Mankind” was less inspirational NASA drama and more paranoid Soviet spy thriller?</p><p>After watching the premiere's first two episodes, I’m cautiously on board. “Star City” doesn’t hit with quite the same emotional force as early “For All Mankind” as the premise naturally loses some impact the second time around. But shifting the story behind the Iron Curtain gives the franchise a fresh, darker energy. </p><h2 id="star-city-trades-optimism-for-paranoia">‘Star City’ trades optimism for paranoia</h2><p>Like the early seasons of "For All Mankind," “Star City” is set in the ’60s and early ’70s, taking us inside the Soviet space program following the USSR’s victory over the United States in the moon race. </p><p>At the center of it all is the mysterious, unnamed Chief Designer (Rhys Ifans), the architect behind the Soviet Union’s space dominance and a man treated with equal parts reverence and suspicion by the state. Around him orbits a sprawling ensemble of cosmonauts, engineers, KGB operatives and deeply unhappy spouses, because apparently emotional repression is just part of the Soviet identity.</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/V-yAMs307W4" allowfullscreen=""></iframe></div></div><p>The biggest tonal difference between this and “For All Mankind” becomes obvious immediately. The parent series, especially early on, had a sense of optimism and adventure underneath all the Cold War tension. “Star City,” meanwhile, feels actively allergic to hope. The sets are gray. The lighting is gray. The clothing is gray. </p><p> The grainy cinematography and drab Soviet aesthetic make the show feel oppressive, as likely intended. At times, it’s almost comically bleak — I half expected someone to announce that joy had officially been outlawed — but that makes the atmosphere all the more immersive.</p><p>The strongest part of the show involves Irina Morozova (Agnes O’Casey), a young KGB surveillance recruit tasked with listening in on cosmonauts and their families. Her storyline is the show's essence: a claustrophobic world where everybody is spying on everybody else and even minor personal failures can become state-level catastrophes.</p><p>"Star City" is smart to lean harder into espionage-thriller territory instead of simply recreating “For All Mankind” beat for beat. Yes, there are still nail-biting space sequences and last-minute engineering fixes that will trigger nostalgia for the original show’s early seasons. But the focus here is much more internal: secrets, betrayals and the psychological toll of life inside such a tightly-controlled society.</p><h2 id="verdict-star-city-is-an-intriguing-if-emotionally-chilly-pivot-for-the-franchise">Verdict: ‘Star City’ is an intriguing, if emotionally chilly, pivot for the franchise</h2><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="j9zLsRxedWS8KhVnC59ubF" name="starcity-ifans" alt="Rhys Ifans in Star City" src="https://cdn.mos.cms.futurecdn.net/j9zLsRxedWS8KhVnC59ubF-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline" /></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>The biggest issue with “Star City,” at least based on the first two episodes, is that the characters haven’t fully come alive yet. There are compelling dynamics throughout the ensemble, particularly involving cosmonauts Sasha (Solly McLeod), Valya (Adam Nagaitis) and Anastasia Belikova (Alice Englert). But for now, the show currently feels more invested in mood than emotional depth.</p><p>That’s where comparisons to early “For All Mankind” get tricky. The characters were what made me so obsessed with the show early on. "Star City” hasn’t quite gotten there with its ensemble.</p><p>Still, there’s enough here to keep me watching. The performances are strong, particularly O’Casey and Ifans, and the darker spy thriller vibe gives the franchise a welcome change of pace instead of feeling like a tired retread. </p><p>No, “Star City” doesn’t feel as fresh or emotionally devastating as “For All Mankind” did when it first launched. But as a moodier, more paranoid companion piece to the original series, it’s a compelling mission so far.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eyqpbe"></div>                            </div>                            <script src="https://kwizly.com/embed/eyqpbe.js" async=""></script><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-other-bennet-sister">How to watch The Other Bennet Sister online</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/ive-watched-a-lot-of-shows-in-2026-so-far-heres-the-5-best">I watch TV for a living and these are the 5 shows for 2026 I’d actually recommend</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/xo-kitty-season-3-review-the-netflix-teen-dramedy-returns-with-a-charming-new-season-and-a-welcome-guest-star">'XO, Kitty' season 3 review: The Netflix teen dramedy returns with a charming new season — and a welcome guest star</a></li></ul><div data-model-name="HBO Max,Disney+,Hulu,Peacock TV,Paramount Plus" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Star City' online – stream the Apple TV sci-fi spinoff from anywhere in the world ]]></title>
                                                                                                <dc:content><![CDATA[ <p>"Star City" is the new chapter in space-race drama from Apple TV, and stars Rhys Ifans and Anna Maxwell Martin in an alt-history retelling of the story of the Soviet Union's space program. Fans of "For All Mankind" will be delighted to know that the universe is growing...</p><p>Below, we’ll show you how to watch "Star City" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'For All Mankind' release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Star City" premieres globally on Apple TV on <strong>Friday, May 29, 2026</strong>, with the first two episodes. New episodes then arrive weekly every Friday until the finale on July 10, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p><a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-for-all-mankind-season-5-online">"For All Mankind" season 5</a> is approaching its end right now, but the show creators Ben Nedivi, Matt Wolpert, and Ronald D. Moore are wasting no time in delivering more space-age content to keep us all engrossed over the next few weeks.</p><p>"Star City" will turn the focus away from the U.S. and onto their rivals in the space race, the Soviets and the lives of the cosmonauts, engineers, and intelligence officers. With a cast led by the stellar Ifans, more high-concept alternate-history storylines, and the usual slick, eye-catching visuals, this is definitely a sci-fi series to get straight on your watchlist.</p><p>If you've been hooked on "For All Mankind", this is a natural next step. So, keep reading to find the full rollout and the simplest way to <strong>watch "Star City"</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-star-city-for-free-on-apple-tv"><span>How to watch 'Star City' for FREE on Apple TV+</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Star City" premieres on <a href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Friday, May 29, 2026</strong> with two new episodes.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so you can get a taste of the debut episodes before deciding whether to carry on your journey.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $12.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-star-city-from-anywhere"><span>Watch 'Star City' from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Star City" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-star-city-trailer"><span>'Star City' 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/V-yAMs307W4" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-star-city-cast"><span>'Star City' cast</span></h2><ul><li><strong>Rhys Ifans</strong> as the Chief Designer</li><li><strong>Anna Maxwell Martin</strong> as Lyudmilla Raskova</li><li><strong>Agnes O'Casey</strong> as Irina Morozova</li><li><strong>Alice Englert</strong> as Anastasia Belikova</li><li><strong>Solly McLeod</strong> as Sasha Polivanov</li><li><strong>Adam Nagaitis</strong> as Valya Markelova</li><li><strong>Ruby Ashbourne Serkis</strong> as Tanya Markelova</li><li><strong>Josef Davies</strong> as Sergei Nikilov</li><li><strong>Priya Kansara</strong> as Lakshmi</li></ul><h2 class="article-body__section" id="section-star-city-episodes"><span>'Star City' episodes</span></h2><ul><li><strong>Episode 1 - Pilot</strong>: May 29, 2026 </li><li><strong>Episode 2 - A Bear On A Chain</strong>: May 29, 2026 </li><li><strong>Episode 3 - Bad Dancer</strong>: June 5, 2026 </li><li><strong>Episode 4 - Dark Forest</strong>: June 12, 2026 </li><li><strong>Episode 5 - Bite Your Elbow</strong>: June 19, 2026 </li><li><strong>Episode 6 - TBA</strong>: June 26, 2026 </li><li><strong>Episode 7 - TBA</strong>: July 3, 2026 </li><li><strong>Episode 8 - TBA</strong>: July 10, 2026 </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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now" target="_blank">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/after-watching-the-for-all-mankind-season-5-premiere-im-glad-one-of-my-favorite-shows-is-back-even-if-its-a-bit-of-a-mess">After watching the 'For All Mankind' season 5 premiere, I’m glad one of my favorite shows is back — even if it’s a bit of a mess</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><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> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/watch-star-city-online</link>
                                                                            <description>
                            <![CDATA[ Find out how to watch "Star City" online from anywhere and potentially for free as a new "For All Mankind" spinoff show prepares for take-off. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SSCEXhQcqj7UT5BSffnDVc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/84kWSdzwUsnZAcdjxRZRp7-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 28 May 2026 23:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                                                                    <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/84kWSdzwUsnZAcdjxRZRp7-1920-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Promotional artwork for &quot;Star City&quot; TV show]]></media:description>                                                            <media:text><![CDATA[Promotional artwork for &quot;Star City&quot; TV show]]></media:text>
                                <media:title type="plain"><![CDATA[Promotional artwork for &quot;Star City&quot; TV show]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/84kWSdzwUsnZAcdjxRZRp7-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Star City" is the new chapter in space-race drama from Apple TV, and stars Rhys Ifans and Anna Maxwell Martin in an alt-history retelling of the story of the Soviet Union's space program. Fans of "For All Mankind" will be delighted to know that the universe is growing...</p><p>Below, we’ll show you how to watch "Star City" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'For All Mankind' release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Star City" premieres globally on Apple TV on <strong>Friday, May 29, 2026</strong>, with the first two episodes. New episodes then arrive weekly every Friday until the finale on July 10, 2026.<br /><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br /><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p><a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-for-all-mankind-season-5-online">"For All Mankind" season 5</a> is approaching its end right now, but the show creators Ben Nedivi, Matt Wolpert, and Ronald D. Moore are wasting no time in delivering more space-age content to keep us all engrossed over the next few weeks.</p><p>"Star City" will turn the focus away from the U.S. and onto their rivals in the space race, the Soviets and the lives of the cosmonauts, engineers, and intelligence officers. With a cast led by the stellar Ifans, more high-concept alternate-history storylines, and the usual slick, eye-catching visuals, this is definitely a sci-fi series to get straight on your watchlist.</p><p>If you've been hooked on "For All Mankind", this is a natural next step. So, keep reading to find the full rollout and the simplest way to <strong>watch "Star City"</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-star-city-for-free-on-apple-tv"><span>How to watch 'Star City' for FREE on Apple TV+</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class="" /></p></div></div></figure></a><p>"Star City" premieres on <a href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Friday, May 29, 2026</strong> with two new episodes.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so you can get a taste of the debut episodes before deciding whether to carry on your journey.</p><p>After the trial ends, you'll pay:<br /><br /><strong>U.S. — $12.99/month</strong><br /><strong>U.K. — £9.99/month</strong><br /><strong>CAN — CA$14.99/month</strong><br /><strong>AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-star-city-from-anywhere"><span>Watch 'Star City' from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;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="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe-1920-80.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&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months 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 /><br />Use Nord to unblock services like <a href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Star City" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&amp;aff_id=3013&amp;url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-star-city-trailer"><span>'Star City' 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/V-yAMs307W4" allowfullscreen=""></iframe></div></div><h2 class="article-body__section" id="section-star-city-cast"><span>'Star City' cast</span></h2><ul><li><strong>Rhys Ifans</strong> as the Chief Designer</li><li><strong>Anna Maxwell Martin</strong> as Lyudmilla Raskova</li><li><strong>Agnes O'Casey</strong> as Irina Morozova</li><li><strong>Alice Englert</strong> as Anastasia Belikova</li><li><strong>Solly McLeod</strong> as Sasha Polivanov</li><li><strong>Adam Nagaitis</strong> as Valya Markelova</li><li><strong>Ruby Ashbourne Serkis</strong> as Tanya Markelova</li><li><strong>Josef Davies</strong> as Sergei Nikilov</li><li><strong>Priya Kansara</strong> as Lakshmi</li></ul><h2 class="article-body__section" id="section-star-city-episodes"><span>'Star City' episodes</span></h2><ul><li><strong>Episode 1 - Pilot</strong>: May 29, 2026 </li><li><strong>Episode 2 - A Bear On A Chain</strong>: May 29, 2026 </li><li><strong>Episode 3 - Bad Dancer</strong>: June 5, 2026 </li><li><strong>Episode 4 - Dark Forest</strong>: June 12, 2026 </li><li><strong>Episode 5 - Bite Your Elbow</strong>: June 19, 2026 </li><li><strong>Episode 6 - TBA</strong>: June 26, 2026 </li><li><strong>Episode 7 - TBA</strong>: July 3, 2026 </li><li><strong>Episode 8 - TBA</strong>: July 10, 2026 </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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now" target="_blank">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/after-watching-the-for-all-mankind-season-5-premiere-im-glad-one-of-my-favorite-shows-is-back-even-if-its-a-bit-of-a-mess">After watching the 'For All Mankind' season 5 premiere, I’m glad one of my favorite shows is back — even if it’s a bit of a mess</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><div data-widget-type="review" data-model-name="Apple TV (Subscription)"></div><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>
            </channel>
</rss>