<?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>Sun, 13 Sep 2026 10:30:00 +0000</lastBuildDate>
                            <language>en</language>
                                <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.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.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.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.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.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-1280-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 Peripherals]]></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.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-1280-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-1280-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.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.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.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.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.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.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.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-1280-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.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-1280-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-1280-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.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.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.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="high" 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-1280-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.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-1280-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-1280-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.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="high" 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-1280-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.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-1280-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-1280-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.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-1280-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.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-1280-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-1280-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.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.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.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.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.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.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.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.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.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.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-1280-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.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-1280-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-1280-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.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.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.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.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.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.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.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.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.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-1280-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.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-1280-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-1280-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.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.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.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.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-1280-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 Peripherals]]></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.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-1280-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-1280-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.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.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.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.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.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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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-1280-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.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-1280-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-1280-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.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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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.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.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.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.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.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-1280-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.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-1280-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-1280-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.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.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.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.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.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.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-1280-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.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-1280-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-1280-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.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&aff_id=3013&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&aff_id=3013&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.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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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-1280-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.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-1280-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-1280-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&aff_id=3013&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&aff_id=3013&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.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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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-1280-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.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-1280-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-1280-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.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.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.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.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.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.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.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.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.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-1280-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.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-1280-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-1280-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.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.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.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.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.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.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.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.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.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.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-1280-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.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-1280-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-1280-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.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.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.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-1280-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.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-1280-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-1280-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.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.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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> — and potentially for free.</strong> </p><div  class="fancy-box"><div class="fancy_box-title">'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&aff_id=3013&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&aff_id=3013&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.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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help you to access your streams as if you were back home.<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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a>. It's the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> on the market:</p><div class="product"><a data-dimension112="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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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 & 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-1280-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-1280-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-1280-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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> — and potentially for free.</strong> </p><div  class="fancy-box"><div class="fancy_box-title">'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&aff_id=3013&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&aff_id=3013&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.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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help you to access your streams as if you were back home.<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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a>. It's the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> on the market:</p><div class="product"><a data-dimension112="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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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 & 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-1280-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.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-1280-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-1280-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 & 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 & 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-1280-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.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-1280-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-1280-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 & 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 & 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-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Jul 2026 12:13:27 +0000</updated>
                                                                                                                                            <category><![CDATA[Movies]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/2BBxi4XKw9kzPB8ePSZPYZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Universal Pictures; Lucasfilm; Amazon MGM Studios]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:description>                                                            <media:text><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:text>
                                <media:title type="plain"><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2BBxi4XKw9kzPB8ePSZPYZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week’s crop of new movies across the biggest <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> is one of the most packed of the year to date. There are new arrivals on popular platforms like Netflix, HBO Max, Hulu, Apple TV and Peacock. There's also a handful of buzzy newcomers on premium streaming.</p><p>With so much choice, picking a highlight is no easy feat. Star Wars fans will likely flock to the PVOD debut of “The Mandalorian and Grogu,” while anybody looking for a different kind of sci-fi should consider Spielberg’s “Disclosure Day.” Alternatively, Netflix has a new Kevin Hart comedy, HBO Max has a fantasy action sequel, and Hulu has a feature film based on a cult web series that is one of the funniest movies I’ve watched in 2026.   </p><p>You’re really spoilt for choice, so I’ve combed through all the most noteworthy new movies on streaming this week and picked out the ones you need to know about. For more recommendations, check out the <a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-usd150-million-disaster-movie-about-the-moon-falling-out-of-orbit-july-21-27">3 new to Prime Video thriller movies to stream this week</a>.<strong> </strong>And if binge-watching is more your speed, here’s a guide to all the <a href="https://www.tomsguide.com/entertainment/streaming/4-biggest-new-shows-to-stream-this-week-july-20-26">top new TV shows this week.</a> </p><h2 id="star-wars-the-mandalorian-and-grogu-pvod-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.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-1280-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.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-1280-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-1280-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.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 & 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-1280-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.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-1280-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-1280-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 & 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.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.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-1280-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.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-1280-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-1280-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.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.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.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.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.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.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&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .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-1280-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.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-1280-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-1280-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.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.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.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.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&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .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.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.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.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.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&_sacat=0&_from=R40&_trksid=p2334524.m570.l1313&_odkw=Apple+tv+4k&_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&epid=27057122057&itmmeta=01KW1GAB2BTHZE8ATCT9MB7HR3&hash=item54c75c69ed:g:2cAAAOSw~bxj0Fda&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&brands=Amazon%2CApple%2CGoogle%2CLenovo%2CSamsung%2CTCL&price=165_&min_discount_ratio=0.95&sort=best_match&retailer=Amazon&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { 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-1280-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.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-1280-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-1280-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.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.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.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.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&_sacat=0&_from=R40&_trksid=p2334524.m570.l1313&_odkw=Apple+tv+4k&_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&epid=27057122057&itmmeta=01KW1GAB2BTHZE8ATCT9MB7HR3&hash=item54c75c69ed:g:2cAAAOSw~bxj0Fda&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&brands=Amazon%2CApple%2CGoogle%2CLenovo%2CSamsung%2CTCL&price=165_&min_discount_ratio=0.95&sort=best_match&retailer=Amazon&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { 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.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-1280-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.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-1280-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-1280-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.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-1280-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.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-1280-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-1280-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&aff_id=3013&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&aff_id=3013&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.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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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-1280-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.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-1280-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-1280-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&aff_id=3013&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&aff_id=3013&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.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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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.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-1280-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.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-1280-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-1280-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.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.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.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-1280-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.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-1280-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-1280-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.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.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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with this VPN</strong></a> <strong>– and potentially for free!</strong></p><div  class="fancy-box"><div class="fancy_box-title">'Cape Fear' - Release Dates & 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&aff_id=3013&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.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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you 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 & 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-1280-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.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-1280-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-1280-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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with this VPN</strong></a> <strong>– and potentially for free!</strong></p><div  class="fancy-box"><div class="fancy_box-title">'Cape Fear' - Release Dates & 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&aff_id=3013&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.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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you 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 & 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.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-1280-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.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-1280-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-1280-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.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&aff_id=3013&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&aff_id=3013&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.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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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-1280-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.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-1280-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-1280-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&aff_id=3013&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&aff_id=3013&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.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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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&aff_id=3013&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>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in June 2026 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Summer TV season is here, and with the heat rising, <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is giving us the perfect excuse to stay inside with the AC on full blast. The lineup for June 2026 is small but buzzy, with two high-profile releases arriving just in time for long weekends and late-night binges.</p><p>First up is "Cape Fear," a new series take on the classic thriller that already terrified audiences in both the original film and Martin Scorsese's remake. Expanding the story into a full series means even more paranoia and tension.</p><p>Then there’s season 2 of "Sugar," which returns with more noir mystery, alien weirdness and Colin Farrell giving cool guy energy. If you’re looking for your next watchlist additions, here's everything new on Apple TV in June 2026.</p><h2 id="cape-fear">'Cape Fear'</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><p>This series adaptation of "Cape Fear" takes the 1991 classic by Martin Scorsese and drags it into doomscroll era with gaslightin, AI fakes and public shaming. Javier Bardem inherits the Robert De Niro role as Max Cady, a newly freed ex-con who decides the married lawyers who put him away owe him far more than an apology. Amy Adams and Patrick Wilson play the increasingly rattled Bowdens, stuck watching everyone around them fall for a man they know is dangerous. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/cape-fear/umc.cmc.377zdzwefgtzkvykexeca9qrc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting June 5</strong></em></p><h2 id="sugar-season-2">'Sugar' season 2</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:662px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="znDbT8dfBS5RCqAqP5ht4W" name="Screen Shot 2024-04-03 at 11.47.36 PM Cropped.png" alt="Colin Farrell as detective John Sugar, wearing a suit and sitting in a car whilst looking pensive in new show "Sugar"" src="https://cdn.mos.cms.futurecdn.net/znDbT8dfBS5RCqAqP5ht4W.png" mos="" align="middle" fullscreen="" width="662" height="372" 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>After spending season 1 masquerading as a stylish neo-noir detective series before detonating into full-on sci-fi weirdness, “Sugar” returns with Colin Farrell back in trench-coat mode as Los Angeles private eye John Sugar. This time, he’s investigating the disappearance of a troubled boxer’s older brother while continuing the search for his own missing sister, all against the backdrop of a sprawling conspiracy that may be bigger than Earth itself. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting June 19</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/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><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</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-june-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in June 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">22oKAFRwgKEoxPxAcudoCD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4BKdqTz5ocHypHjtJQRVHX-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 26 May 2026 05: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.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/4BKdqTz5ocHypHjtJQRVHX-1280-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-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer TV season is here, and with the heat rising, <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is giving us the perfect excuse to stay inside with the AC on full blast. The lineup for June 2026 is small but buzzy, with two high-profile releases arriving just in time for long weekends and late-night binges.</p><p>First up is "Cape Fear," a new series take on the classic thriller that already terrified audiences in both the original film and Martin Scorsese's remake. Expanding the story into a full series means even more paranoia and tension.</p><p>Then there’s season 2 of "Sugar," which returns with more noir mystery, alien weirdness and Colin Farrell giving cool guy energy. If you’re looking for your next watchlist additions, here's everything new on Apple TV in June 2026.</p><h2 id="cape-fear">'Cape Fear'</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><p>This series adaptation of "Cape Fear" takes the 1991 classic by Martin Scorsese and drags it into doomscroll era with gaslightin, AI fakes and public shaming. Javier Bardem inherits the Robert De Niro role as Max Cady, a newly freed ex-con who decides the married lawyers who put him away owe him far more than an apology. Amy Adams and Patrick Wilson play the increasingly rattled Bowdens, stuck watching everyone around them fall for a man they know is dangerous. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/cape-fear/umc.cmc.377zdzwefgtzkvykexeca9qrc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting June 5</strong></em></p><h2 id="sugar-season-2">'Sugar' season 2</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:662px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="znDbT8dfBS5RCqAqP5ht4W" name="Screen Shot 2024-04-03 at 11.47.36 PM Cropped.png" alt="Colin Farrell as detective John Sugar, wearing a suit and sitting in a car whilst looking pensive in new show "Sugar"" src="https://cdn.mos.cms.futurecdn.net/znDbT8dfBS5RCqAqP5ht4W.png" mos="" align="middle" fullscreen="" width="662" height="372" 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>After spending season 1 masquerading as a stylish neo-noir detective series before detonating into full-on sci-fi weirdness, “Sugar” returns with Colin Farrell back in trench-coat mode as Los Angeles private eye John Sugar. This time, he’s investigating the disappearance of a troubled boxer’s older brother while continuing the search for his own missing sister, all against the backdrop of a sprawling conspiracy that may be bigger than Earth itself. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting June 19</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/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><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</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[ How to watch 'Maximum Pleasure Guaranteed' online – stream dark comedy now with Apple TV free trial ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you like your comedy shows to take a ride on the wild side and offer up mysteries and secrets, you'll love getting stuck into "Maximum Pleasure Guaranteed".</p><p>Below, we’ll show you how to watch "Maximum Pleasure Guaranteed" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&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">'Maximum Pleasure Guaranteed' release date and time</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Maximum Pleasure Guaranteed" premieres globally on Apple TV on <strong>Wednesday, May 20, 2026</strong>, with the first two episodes. New episodes then arrive weekly every Wednesday until the finale on July 15, 2026.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>What would you do if you witnessed a murder? Call the police, get help, and hope the whole thing gets resolved without too much trouble for yourself, probably. But what if no one else even believes the crime took place?</p><p>That's the mess Tatiana Maslany finds herself in with this exciting new dark comedy. She plays a divorced soccer mom dealing with your standard suburban drama, before the apparent murder turns her life upside down and inside out.</p><p>If this show sounds like it's right up your street, keep reading to find the full rollout and the simplest way to <strong>watch "Maximum Pleasure Guaranteed"</strong> from wherever you are — and potentially for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-maximum-pleasure-guaranteed-for-free-on-apple-tv"><span>How to watch 'Maximum Pleasure Guaranteed' 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.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Maximum Pleasure Guaranteed" premieres on <a href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" 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> in the U.S., U.K., Australia, and Canada on <strong>Wednesday, May 20, 2026</strong>.</p><p>New 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>.</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-maximum-pleasure-guaranteed-from-anywhere"><span>Watch 'Maximum Pleasure Guaranteed' from anywhere</span></h2><p>Traveling and locked out of your Apple TV 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 streaming services 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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="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/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Maximum Pleasure Guaranteed" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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-maximum-pleasure-guaranteed-trailer"><span>'Maximum Pleasure Guaranteed' 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/I28gOWOUpp8" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-maximum-pleasure-guaranteed-cast"><span>'Maximum Pleasure Guaranteed' cast</span></h2><ul><li><strong>Tatiana Maslany</strong> as Paula</li><li><strong>Jake Johnson</strong> as Karl</li><li><strong>Jessy Hodges</strong> as Mallory</li><li><strong>Charlie Hall</strong> as Rudy</li><li><strong>John Michael Hall</strong> as Detectivee Baxter</li><li><strong>Jianna and Jeena Platon</strong> as Pd</li><li><strong>Kiarra Hamagami Goldberg</strong> as Geri</li><li><strong>Nola Wallace</strong> as Hazel</li><li><strong>Jennifer Ferrin</strong> as Joyce</li><li><strong>Tara Summers</strong> as Suzie</li><li><strong>Daniel Dale</strong> as Sky</li><li><strong>David Garelick</strong> as Caleb</li></ul><h2 class="article-body__section" id="section-maximum-pleasure-guaranteed-episodes"><span>'Maximum Pleasure Guaranteed' episodes</span></h2><ul><li><strong>Episode 1</strong>: May 20, 2026 </li><li><strong>Episode 2</strong>: May 20, 2026 </li><li><strong>Episode 3</strong>: May 27, 2026 </li><li><strong>Episode 4</strong>: June 3, 2026 </li><li><strong>Episode 5</strong>: June 10, 2026 </li><li><strong>Episode 6</strong>: June 17, 2026 </li><li><strong>Episode 7</strong>: June 24, 2026 </li><li><strong>Episode 8</strong>: July 1, 2026 </li><li><strong>Episode 9</strong>: July 8, 2026 </li><li><strong>Episode 10</strong>: July 15, 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/us/best-streaming-video-services,review-2625.html" target="_blank">The best streaming services to subscribe to right now</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-maximum-pleasure-guaranteed</link>
                                                                            <description>
                            <![CDATA[ Find out how to watch "Maximum Pleasure Guaranteed" online from anywhere and potentially for free as Tatiana Maslany stars in the new dark comedy series. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">d6QKHTWA4V5ZXBKSGkoCDf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DhoCQgMUuirmdyFCyzthp5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 20 May 2026 09:18:14 +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.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/DhoCQgMUuirmdyFCyzthp5-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tatiana Maslany in Maximum Pleasure Guaranteed]]></media:description>                                                            <media:text><![CDATA[Tatiana Maslany in Maximum Pleasure Guaranteed]]></media:text>
                                <media:title type="plain"><![CDATA[Tatiana Maslany in Maximum Pleasure Guaranteed]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DhoCQgMUuirmdyFCyzthp5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you like your comedy shows to take a ride on the wild side and offer up mysteries and secrets, you'll love getting stuck into "Maximum Pleasure Guaranteed".</p><p>Below, we’ll show you how to watch "Maximum Pleasure Guaranteed" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&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">'Maximum Pleasure Guaranteed' release date and time</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Maximum Pleasure Guaranteed" premieres globally on Apple TV on <strong>Wednesday, May 20, 2026</strong>, with the first two episodes. New episodes then arrive weekly every Wednesday until the finale on July 15, 2026.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>What would you do if you witnessed a murder? Call the police, get help, and hope the whole thing gets resolved without too much trouble for yourself, probably. But what if no one else even believes the crime took place?</p><p>That's the mess Tatiana Maslany finds herself in with this exciting new dark comedy. She plays a divorced soccer mom dealing with your standard suburban drama, before the apparent murder turns her life upside down and inside out.</p><p>If this show sounds like it's right up your street, keep reading to find the full rollout and the simplest way to <strong>watch "Maximum Pleasure Guaranteed"</strong> from wherever you are — and potentially for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-maximum-pleasure-guaranteed-for-free-on-apple-tv"><span>How to watch 'Maximum Pleasure Guaranteed' 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.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Maximum Pleasure Guaranteed" premieres on <a href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" 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> in the U.S., U.K., Australia, and Canada on <strong>Wednesday, May 20, 2026</strong>.</p><p>New 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>.</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-maximum-pleasure-guaranteed-from-anywhere"><span>Watch 'Maximum Pleasure Guaranteed' from anywhere</span></h2><p>Traveling and locked out of your Apple TV 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 streaming services 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&aff_id=3013&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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="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/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Maximum Pleasure Guaranteed" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="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-maximum-pleasure-guaranteed-trailer"><span>'Maximum Pleasure Guaranteed' 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/I28gOWOUpp8" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-maximum-pleasure-guaranteed-cast"><span>'Maximum Pleasure Guaranteed' cast</span></h2><ul><li><strong>Tatiana Maslany</strong> as Paula</li><li><strong>Jake Johnson</strong> as Karl</li><li><strong>Jessy Hodges</strong> as Mallory</li><li><strong>Charlie Hall</strong> as Rudy</li><li><strong>John Michael Hall</strong> as Detectivee Baxter</li><li><strong>Jianna and Jeena Platon</strong> as Pd</li><li><strong>Kiarra Hamagami Goldberg</strong> as Geri</li><li><strong>Nola Wallace</strong> as Hazel</li><li><strong>Jennifer Ferrin</strong> as Joyce</li><li><strong>Tara Summers</strong> as Suzie</li><li><strong>Daniel Dale</strong> as Sky</li><li><strong>David Garelick</strong> as Caleb</li></ul><h2 class="article-body__section" id="section-maximum-pleasure-guaranteed-episodes"><span>'Maximum Pleasure Guaranteed' episodes</span></h2><ul><li><strong>Episode 1</strong>: May 20, 2026 </li><li><strong>Episode 2</strong>: May 20, 2026 </li><li><strong>Episode 3</strong>: May 27, 2026 </li><li><strong>Episode 4</strong>: June 3, 2026 </li><li><strong>Episode 5</strong>: June 10, 2026 </li><li><strong>Episode 6</strong>: June 17, 2026 </li><li><strong>Episode 7</strong>: June 24, 2026 </li><li><strong>Episode 8</strong>: July 1, 2026 </li><li><strong>Episode 9</strong>: July 8, 2026 </li><li><strong>Episode 10</strong>: July 15, 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/us/best-streaming-video-services,review-2625.html" target="_blank">The best streaming services to subscribe to right now</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[ For All Mankind is one of my favorite Apple TV shows, and the design of its alt-universe iPhones is indicative of why I love it so much ]]></title>
                                                                                                <dc:content><![CDATA[ <p><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">For All Mankind</a> is easily one of the best shows to hit streaming over the past few years, and <a href="https://www.tomsguide.com/opinion/i-finally-gave-this-apple-tv-plus-show-a-shot-and-its-the-best-thing-ive-seen-in-years">easily a highlight</a> of Apple TV's already-exceptional library of original TV shows. The concept of "What If" has always appealed to me, especially with science fiction, and it is fascinating to see a version of our world where the space race never ended.</p><p>One thing I particularly like seeing is how technology has advanced differently in the show, in part due to the alternate timeline's increased push into the great beyond throughout the '80s and '90s. The show acknowledges those changes in a bunch of different ways, and I've been taking great pleasure in trying to spot as many as I can. </p><p>As a result, I've become a little bit obsessed with For All Mankind's take on the iPhone, which has been showing up throughout the fifth season.</p><h2 id="for-all-mankind-is-pushing-ahead-in-weird-and-wonderful-ways">For All Mankind is pushing ahead in weird and wonderful ways</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2476px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="PZDoLnLhRyvsBcMDeRxMSk" name="Screenshot 2026-05-13 170825" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/PZDoLnLhRyvsBcMDeRxMSk.png" mos="" align="middle" fullscreen="" width="2476" height="1393" 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>As we've seen in our universe, space travel has played a crucial role in developing technology that has important applications back here on Earth. NASA has a <a href="https://www.jpl.nasa.gov/infographics/20-inventions-we-wouldnt-have-without-space-travel/" target="_blank">whole list</a>, including LED lights, memory foam, wireless headsets and even the computer mouse.</p><p>For All Mankind's increased investment in space travel means that manifests in a lot of different ways on the show. Lunar rover technology led to electric cars gaining prominence in the 1980s, as did video conferencing technology, while the need for nuclear power on the moon meant technology existed to prevent the Three Mile Island disaster. </p><p>Eagle-eyed viewers <a href="https://www.imore.com/ipod-isnt-dead-least-all-mankind-season-3" target="_blank">even spotted an iPod</a> during season 3's 1994 Mars mission — a whole seven years before the iPod would go on sale in the real world. How? It's never explained, but it goes to show that even consumer technology is somehow more advanced in this space-fueled timeline.</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:2517px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="iXpoW46FJFRS5zdbLqHoRk" name="Screenshot 2026-05-13 171356" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/iXpoW46FJFRS5zdbLqHoRk.png" mos="" align="middle" fullscreen="" width="2517" height="1416" 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>Season 5 kicks off in 2012, and needless to say, that means smartphones make an appearance. Seeing as this is an Apple TV show, we don't get to see alternate takes on the Google Nexus or Samsung Galaxy. But these aren't exactly iPhones either. They sure look like iPhones, but the show makes it very clear that these things are actually called Newtons.</p><p>Frankly, I think that's a very cool easter egg to have in this show. Anyone who knows <a href="https://www.tomsguide.com/tech/apple-50th-anniversary-quiz-how-well-do-you-remember-these-controversial-moments-and-tech-innovations">Apple's product history</a> will know that the Newton was Apple's failed attempt to enter the PDA market back in 1993. The mini-computer was marred with issues and delays that turned it into something of a joke. </p><p>Despite this widespread mockery and lackluster sales, the Newton stayed in production until 1998, when it was killed at the behest of returning CEO Steve Jobs.</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:2139px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="fXguULGeS8EseMNZDr6eMk" name="Screenshot 2026-05-13 171348" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/fXguULGeS8EseMNZDr6eMk.png" mos="" align="middle" fullscreen="" width="2139" height="1203" 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>This wouldn't be the first time an Apple Newton showed up in " For All Mankind, either. Season 3 featured the "Newton Message Pad", which was a compact home video phone, while a larger model appeared in season 4  with a more tablet-inspired design.</p><h2 id="for-all-mankind-s-newton-phones-are-a-sight-to-behold">For All Mankind's Newton Phones are a sight to behold</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2240px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hwW7cyCTzTkfKSQwBRD2Ck" name="Screenshot 2026-05-13 155015" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/hwW7cyCTzTkfKSQwBRD2Ck.png" mos="" align="middle" fullscreen="" width="2240" height="1260" 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 2012 Newton models featured in For All Mankind season 5 are so clearly based on the iPhone. But, unlike the iPod, it's clear that these devices are distinct from any kind of Apple device we've seen in the real world. The show could have taken a relatively modern iPhone and slapped it into the show as a form of product placement. Instead, they seem to have put in a lot of effort to make them stand out.</p><p>A lot of things are still the same as you'd expect with an iPhone. The devices are touchscreen-based, suggesting that the world still decided to give the stylus the boot at some point, and the software looks remarkably like iOS did before iOS 7's controversial 2014 redesign. But the actual hardware is quite something.</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:1378px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="5Jphhy2BTftCQgNZN4mezj" name="Screenshot 2026-05-13 160830" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/5Jphhy2BTftCQgNZN4mezj.png" mos="" align="middle" fullscreen="" width="1378" height="775" 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 Newton is almost like a mashup between a bunch of different Apple devices. The chunky metal frame is reminiscent of the metal iPod Classics, while the back panel has the vertically-stacked dual camera lenses that first appeared on the iPhone X. That said, it doesn't feature the same full-screen design as the tenth anniversary iPhone. </p><p>This device retains the chunky bezels and notch-free design that hasn't been seen on a flagship iPhone since the release of iPhone 8, but there's no physical home button to be seen. Instead, there's the same white pill that's present on modern iPhones, and what I can only assume is a fingerprint scanner on the top right side of the phone</p><p>There also appears to be a charging port that looks fairly similar to USB-C, which didn't appear on iPhones until 2023, and a headphone jack. That suggests that even in this more advanced timeline, Apple hasn't felt "brave" enough to strip that port out of its phones just yet.</p><h2 id="bottom-line-product-placement-done-well">Bottom line: Product placement done well</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2074px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="CzXiL7fvSkkcMeXS4rmKzE" name="Screenshot 2026-05-13 170703" alt="for all mankind newton design" src="https://cdn.mos.cms.futurecdn.net/CzXiL7fvSkkcMeXS4rmKzE.png" mos="" align="middle" fullscreen="" width="2074" height="1167" 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 is no shortage of Apple-centric product placement on TV these days, even in shows that aren't made for the Apple TV streaming service. Keep your eyes open, and you'll see iPhones, MacBooks, AirPods and countless other devices appearing on screen. It's rarely in your face the way some product placement is, but it's the kind of thing that you can't unsee.</p><p>For All Mankind has reached the point in its timeline where the set designers could have done something similar. Slap some iPhones into the actors' hands, and dress up some desks with an iMac and be done with it. In fact, there are office scenes that prominently feature the Magic Mouse and what looks like a 2009 iMac. Which, while hardly inventive, is at least period-appropriate.</p><p>It's still very cool to see the amount of effort that's gone into creating an alternate version of the iPhone, for a world where travelling to the moon and Mars is seen as fairly routine. For All Mankind's Newton is eye-catching, and obviously an iPhone analogue to anyone who looks at it, but looking closer reveals a bunch of cool details that phone nerds like myself can appreciate.</p><p>At the very least, it's a reminder that this is an alternate version of our world, and a way of pointing out how different things could have been if history had unfolded just a little bit differently.</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-fold-tipped-for-only-two-colors-and-after-the-joy-of-the-macbook-neo-i-cant-help-but-feel-disappointed">iPhone Fold tipped for only two colors — and after the joy of the MacBook Neo, I can't help but feel disappointed</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-iphone-camera-may-finally-catch-up-to-android-in-a-big-way-and-its-great-news-for-pros">The iPhone camera may finally catch up to Android in a big way with iOS 27 — here's how</a></li><li><a href="https://www.tomsguide.com/phones/iphones/9-iphone-accessories-for-under-usd20-we-cant-live-without">9 iPhone accessories for under $20 we can't live without</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/for-all-mankind-is-one-of-my-favorite-apple-tv-shows-and-the-design-of-its-alt-universe-iphones-is-indicative-of-why-i-love-it-so-much</link>
                                                                            <description>
                            <![CDATA[ iPhones may not technically exist in For All Mankind, but the alternate universe has something just as good — and it's a sight to behold. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gUL787yHwkoxfds4AYKPk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qeHMNPmZXJaZxaBuAtRSTk-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 14 May 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <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/qeHMNPmZXJaZxaBuAtRSTk-1280-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[for all mankind season 5]]></media:description>                                                            <media:text><![CDATA[for all mankind season 5]]></media:text>
                                <media:title type="plain"><![CDATA[for all mankind season 5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qeHMNPmZXJaZxaBuAtRSTk-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><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">For All Mankind</a> is easily one of the best shows to hit streaming over the past few years, and <a href="https://www.tomsguide.com/opinion/i-finally-gave-this-apple-tv-plus-show-a-shot-and-its-the-best-thing-ive-seen-in-years">easily a highlight</a> of Apple TV's already-exceptional library of original TV shows. The concept of "What If" has always appealed to me, especially with science fiction, and it is fascinating to see a version of our world where the space race never ended.</p><p>One thing I particularly like seeing is how technology has advanced differently in the show, in part due to the alternate timeline's increased push into the great beyond throughout the '80s and '90s. The show acknowledges those changes in a bunch of different ways, and I've been taking great pleasure in trying to spot as many as I can. </p><p>As a result, I've become a little bit obsessed with For All Mankind's take on the iPhone, which has been showing up throughout the fifth season.</p><h2 id="for-all-mankind-is-pushing-ahead-in-weird-and-wonderful-ways">For All Mankind is pushing ahead in weird and wonderful ways</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2476px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="PZDoLnLhRyvsBcMDeRxMSk" name="Screenshot 2026-05-13 170825" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/PZDoLnLhRyvsBcMDeRxMSk.png" mos="" align="middle" fullscreen="" width="2476" height="1393" 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>As we've seen in our universe, space travel has played a crucial role in developing technology that has important applications back here on Earth. NASA has a <a href="https://www.jpl.nasa.gov/infographics/20-inventions-we-wouldnt-have-without-space-travel/" target="_blank">whole list</a>, including LED lights, memory foam, wireless headsets and even the computer mouse.</p><p>For All Mankind's increased investment in space travel means that manifests in a lot of different ways on the show. Lunar rover technology led to electric cars gaining prominence in the 1980s, as did video conferencing technology, while the need for nuclear power on the moon meant technology existed to prevent the Three Mile Island disaster. </p><p>Eagle-eyed viewers <a href="https://www.imore.com/ipod-isnt-dead-least-all-mankind-season-3" target="_blank">even spotted an iPod</a> during season 3's 1994 Mars mission — a whole seven years before the iPod would go on sale in the real world. How? It's never explained, but it goes to show that even consumer technology is somehow more advanced in this space-fueled timeline.</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:2517px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="iXpoW46FJFRS5zdbLqHoRk" name="Screenshot 2026-05-13 171356" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/iXpoW46FJFRS5zdbLqHoRk.png" mos="" align="middle" fullscreen="" width="2517" height="1416" 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>Season 5 kicks off in 2012, and needless to say, that means smartphones make an appearance. Seeing as this is an Apple TV show, we don't get to see alternate takes on the Google Nexus or Samsung Galaxy. But these aren't exactly iPhones either. They sure look like iPhones, but the show makes it very clear that these things are actually called Newtons.</p><p>Frankly, I think that's a very cool easter egg to have in this show. Anyone who knows <a href="https://www.tomsguide.com/tech/apple-50th-anniversary-quiz-how-well-do-you-remember-these-controversial-moments-and-tech-innovations">Apple's product history</a> will know that the Newton was Apple's failed attempt to enter the PDA market back in 1993. The mini-computer was marred with issues and delays that turned it into something of a joke. </p><p>Despite this widespread mockery and lackluster sales, the Newton stayed in production until 1998, when it was killed at the behest of returning CEO Steve Jobs.</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:2139px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="fXguULGeS8EseMNZDr6eMk" name="Screenshot 2026-05-13 171348" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/fXguULGeS8EseMNZDr6eMk.png" mos="" align="middle" fullscreen="" width="2139" height="1203" 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>This wouldn't be the first time an Apple Newton showed up in " For All Mankind, either. Season 3 featured the "Newton Message Pad", which was a compact home video phone, while a larger model appeared in season 4  with a more tablet-inspired design.</p><h2 id="for-all-mankind-s-newton-phones-are-a-sight-to-behold">For All Mankind's Newton Phones are a sight to behold</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2240px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hwW7cyCTzTkfKSQwBRD2Ck" name="Screenshot 2026-05-13 155015" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/hwW7cyCTzTkfKSQwBRD2Ck.png" mos="" align="middle" fullscreen="" width="2240" height="1260" 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 2012 Newton models featured in For All Mankind season 5 are so clearly based on the iPhone. But, unlike the iPod, it's clear that these devices are distinct from any kind of Apple device we've seen in the real world. The show could have taken a relatively modern iPhone and slapped it into the show as a form of product placement. Instead, they seem to have put in a lot of effort to make them stand out.</p><p>A lot of things are still the same as you'd expect with an iPhone. The devices are touchscreen-based, suggesting that the world still decided to give the stylus the boot at some point, and the software looks remarkably like iOS did before iOS 7's controversial 2014 redesign. But the actual hardware is quite something.</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:1378px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="5Jphhy2BTftCQgNZN4mezj" name="Screenshot 2026-05-13 160830" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/5Jphhy2BTftCQgNZN4mezj.png" mos="" align="middle" fullscreen="" width="1378" height="775" 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 Newton is almost like a mashup between a bunch of different Apple devices. The chunky metal frame is reminiscent of the metal iPod Classics, while the back panel has the vertically-stacked dual camera lenses that first appeared on the iPhone X. That said, it doesn't feature the same full-screen design as the tenth anniversary iPhone. </p><p>This device retains the chunky bezels and notch-free design that hasn't been seen on a flagship iPhone since the release of iPhone 8, but there's no physical home button to be seen. Instead, there's the same white pill that's present on modern iPhones, and what I can only assume is a fingerprint scanner on the top right side of the phone</p><p>There also appears to be a charging port that looks fairly similar to USB-C, which didn't appear on iPhones until 2023, and a headphone jack. That suggests that even in this more advanced timeline, Apple hasn't felt "brave" enough to strip that port out of its phones just yet.</p><h2 id="bottom-line-product-placement-done-well">Bottom line: Product placement done well</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2074px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="CzXiL7fvSkkcMeXS4rmKzE" name="Screenshot 2026-05-13 170703" alt="for all mankind newton design" src="https://cdn.mos.cms.futurecdn.net/CzXiL7fvSkkcMeXS4rmKzE.png" mos="" align="middle" fullscreen="" width="2074" height="1167" 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 is no shortage of Apple-centric product placement on TV these days, even in shows that aren't made for the Apple TV streaming service. Keep your eyes open, and you'll see iPhones, MacBooks, AirPods and countless other devices appearing on screen. It's rarely in your face the way some product placement is, but it's the kind of thing that you can't unsee.</p><p>For All Mankind has reached the point in its timeline where the set designers could have done something similar. Slap some iPhones into the actors' hands, and dress up some desks with an iMac and be done with it. In fact, there are office scenes that prominently feature the Magic Mouse and what looks like a 2009 iMac. Which, while hardly inventive, is at least period-appropriate.</p><p>It's still very cool to see the amount of effort that's gone into creating an alternate version of the iPhone, for a world where travelling to the moon and Mars is seen as fairly routine. For All Mankind's Newton is eye-catching, and obviously an iPhone analogue to anyone who looks at it, but looking closer reveals a bunch of cool details that phone nerds like myself can appreciate.</p><p>At the very least, it's a reminder that this is an alternate version of our world, and a way of pointing out how different things could have been if history had unfolded just a little bit differently.</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-fold-tipped-for-only-two-colors-and-after-the-joy-of-the-macbook-neo-i-cant-help-but-feel-disappointed">iPhone Fold tipped for only two colors — and after the joy of the MacBook Neo, I can't help but feel disappointed</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-iphone-camera-may-finally-catch-up-to-android-in-a-big-way-and-its-great-news-for-pros">The iPhone camera may finally catch up to Android in a big way with iOS 27 — here's how</a></li><li><a href="https://www.tomsguide.com/phones/iphones/9-iphone-accessories-for-under-usd20-we-cant-live-without">9 iPhone accessories for under $20 we can't live without</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I almost gave up on Apple TV’s No. 1 show — then ChatGPT convinced me to keep watching ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I hate giving up on a show. This is especially true if I've raved about it to my friends and already invested several hours into the story. I want to believe there's a payoff coming. </p><p>I know that not every episode can be exciting and a weird detour is often intentional. And sometimes the character that I suddenly find annoying is essential to a more satisfying arc. <br><br>But, that's exactly where I found myself recently with "Your Friends & Neighbors " on <a href="https://www.tomsguide.com/opinion/i-cancelled-apple-tv-plus-heres-why-i-just-changed-my-mind">Apple TV</a>. The Jon Hamm-led drama has been one of Apple TV’s biggest shows recently. Not only is it ranked No. 1 on Apple TV in the U.S. (at time of writing), it has also topped Apple TV+’s worldwide TV chart.</p><p>So this wasn’t some random show I had stumbled into. This was Apple TV’s current hit. But after forcing myself to finish episode 6 of season 2, after already getting bored with episode 5, I had one thought: <em>Is this show starting to drag?</em></p><p>So instead of rage-quitting, I did what I increasingly do when I’m stuck between entertainment guilt and sunk-cost fallacy: I asked <a href="https://www.tomsguide.com/news/chatgpt">ChatGPT</a> whether I should keep watching.</p><h2 id="why-i-almost-gave-up">Why I almost gave up</h2><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="9oX4FwxTTQLShWqRDdkcTc" name="yourfriendsandneighbors" alt="Jon Hamm in Your Friends and Neighbors" src="https://cdn.mos.cms.futurecdn.net/9oX4FwxTTQLShWqRDdkcTc.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 first season of "<a href="https://www.tomsguide.com/entertainment/streaming/watch-your-friends-and-neighbors-season-2">Your Friends & Neighbors</a>" had a killer premise. Jon Hamm plays Andrew “Coop” Cooper, a disgraced hedge fund manager who starts stealing from the wealthy people around him after his life falls apart. It had the sharp, almost addictive quality of watching terrible rich people make terrible decisions in extremely nice kitchens.</p><div><blockquote><p>I felt that very familiar streaming-era panic: Am I watching a great show deepen, or am I watching a good show lose momentum?</p></blockquote></div><p>Season 2 keeps a lot of that appeal. James Marsden joins as Owen Ashe, a new neighbor whose arrival threatens to expose Coop’s secrets and pull his family deeper into danger. <a href="https://www.tomsguide.com/news/new-tv-shows">Season 2 premiered April 3, 2026</a> and is rolling out weekly through June 5, with 10 episodes total.</p><p>On paper, that should be enough to keep things moving. But around episodes 5 and 6, the show seemed to shift gears. The crime-thriller energy slowed down. The pacing became more emotional and more interior. Instead of feeling like the walls were closing in on Coop, it started to feel like the show was wandering through grief, family drama and relationship fallout. I found myself scrolling during episodes or even fast forwarding to skip the "boring" parts. </p><p>I realize some of the best shows slow down before they get better. But as a viewer, I felt that very familiar streaming-era panic: <em>Am I watching a great show deepen, or am I watching a good show lose momentum?</em></p><h2 id="the-chatgpt-prompt-i-used-when-the-show-got-boring">The ChatGPT prompt I used when the show got 'boring'</h2><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="AUstGAF7cNZ8uQAxKzTX6M" name="8 - 2026-05-13T141259.508" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/AUstGAF7cNZ8uQAxKzTX6M.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here’s what I asked ChatGPT: <em>“I just finished episode 6 in season 2 of Your Friends & Neighbors. The show seems to be dragging since the last two episodes. Is it worth continuing?”</em></p><p>What I liked about the answer was that it didn’t just say, “Yes, keep watching.” It reframed the question. ChatGPT pointed out that episode 6 might not be filler as much as a pivot. The show seems to be moving away from pure burglary tension and into the emotional consequences of Coop’s choices. In other words, the slower pacing may be intentional.</p><p>That made me think about the show differently. I had been judging it by the energy of its premise: rich man steals from rich neighbors, chaos follows. But season 2 may be asking a slightly different question: what happens when someone builds a second life out of lies and starts believing he can actually survive it?</p><p>That’s a better reason to keep watching than “I’ve already come this far.”</p><h2 id="chatgpt-was-right-about-one-thing">ChatGPT was right about one thing</h2><p>After thinking about it, I realized my frustration wasn’t that "Your Friends & Neighbors" had become bad. It was that it had become less instantly satisfying. That’s different.</p><p>The first season gave viewers a clean engine: Coop needs money, Coop steals, Coop gets pulled deeper into a mess of his own making. Season 2 is messier. It’s more about consequences, grief and whether Coop is still the smartest person in the room or just the most delusional.</p><p><a href="https://www.rottentomatoes.com/tv/your_friends_and_neighbors/s02" target="_blank">Rotten Tomatoes</a>’ critic consensus for season 2 makes a similar point, saying the show “digs itself into a deeper and richer character hole” while praising Hamm, Olivia Munn and Marsden.</p><p>That doesn’t mean every slower episode works. But it does suggest the show is trying to become something more textured than a glossy crime caper.</p><p>And honestly, that’s where ChatGPT was useful. It didn’t tell me whether the show was objectively good. It helped me separate two different questions: <em>Am I bored because the show is failing? Or am I impatient because the show is changing?</em></p><h2 id="the-takeaway">The takeaway</h2><p>My verdict: I’m giving it one more episode. I’m not fully sold yet. Episode 6 still felt slower than I wanted, especially after the sharpness that made the show so easy to binge in the first place. But I’m not quitting either, thanks to ChatGPT's advice to help change my perspective.</p><p>At this point, "Your Friends & Neighbors" has earned at least one more episode from me. Jon Hamm remains the show’s biggest reason to keep watching, and James Marsden’s Owen Ashe gives season 2 a new kind of threat that could still pay off in a big way.</p><p>My hope is that episode 7 reconnects the emotional fallout to the central tension between Coop, Owen and the secrets piling up around them. If that happens, I’m back in. If it keeps drifting, this may become the kind of show I finish later, not one I rush to watch every week.</p><p>And that may be the real lesson here. ChatGPT didn’t tell me (or even know) whether the show would stick the landing, but it did help me figure out what I was actually reacting to. For now, I’m sticking with Apple TV’s No. 1 show. But episode 7 has work to do.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-used-gary-vees-attention-is-currency-mindset-with-chatgpt-and-it-saved-my-weakest-idea">I used Gary Vee’s ‘attention is currency’ mindset with ChatGPT — and it saved my weakest idea</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-to-apply-lewis-howes-greatness-mindset-to-my-life-and-it-completely-changed-how-i-approach-work">I asked ChatGPT to apply Lewis Howes’ ‘Greatness’ mindset to my life — and it completely changed how I approach work</a></li><li><a href="https://www.tomsguide.com/ai/i-gave-chatgpt-permission-to-disagree-with-me-with-this-prompt-and-its-responses-became-dramatically-better">I gave ChatGPT permission to disagree with me with this prompt — and its responses became dramatically better</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-almost-gave-up-on-apple-tv-s-no-1-show-then-chatgpt-convinced-me-to-keep-watching</link>
                                                                            <description>
                            <![CDATA[ I was ready to quit Your Friends & Neighbors after season 2 started dragging, so I asked ChatGPT if Apple TV’s No. 1 show was still worth watching. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2qDUvAYLzVeXEUsMQZCS3f</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mPujTeACHxcJaNUMHU5CMY-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 14 May 2026 05:01:00 +0000</pubDate>                                                                                                                                <updated>Thu, 14 May 2026 20:49:51 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mPujTeACHxcJaNUMHU5CMY-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV app on iPhone]]></media:description>                                                            <media:text><![CDATA[Apple TV app on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV app on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mPujTeACHxcJaNUMHU5CMY-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I hate giving up on a show. This is especially true if I've raved about it to my friends and already invested several hours into the story. I want to believe there's a payoff coming. </p><p>I know that not every episode can be exciting and a weird detour is often intentional. And sometimes the character that I suddenly find annoying is essential to a more satisfying arc. <br><br>But, that's exactly where I found myself recently with "Your Friends & Neighbors " on <a href="https://www.tomsguide.com/opinion/i-cancelled-apple-tv-plus-heres-why-i-just-changed-my-mind">Apple TV</a>. The Jon Hamm-led drama has been one of Apple TV’s biggest shows recently. Not only is it ranked No. 1 on Apple TV in the U.S. (at time of writing), it has also topped Apple TV+’s worldwide TV chart.</p><p>So this wasn’t some random show I had stumbled into. This was Apple TV’s current hit. But after forcing myself to finish episode 6 of season 2, after already getting bored with episode 5, I had one thought: <em>Is this show starting to drag?</em></p><p>So instead of rage-quitting, I did what I increasingly do when I’m stuck between entertainment guilt and sunk-cost fallacy: I asked <a href="https://www.tomsguide.com/news/chatgpt">ChatGPT</a> whether I should keep watching.</p><h2 id="why-i-almost-gave-up">Why I almost gave up</h2><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="9oX4FwxTTQLShWqRDdkcTc" name="yourfriendsandneighbors" alt="Jon Hamm in Your Friends and Neighbors" src="https://cdn.mos.cms.futurecdn.net/9oX4FwxTTQLShWqRDdkcTc.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 first season of "<a href="https://www.tomsguide.com/entertainment/streaming/watch-your-friends-and-neighbors-season-2">Your Friends & Neighbors</a>" had a killer premise. Jon Hamm plays Andrew “Coop” Cooper, a disgraced hedge fund manager who starts stealing from the wealthy people around him after his life falls apart. It had the sharp, almost addictive quality of watching terrible rich people make terrible decisions in extremely nice kitchens.</p><div><blockquote><p>I felt that very familiar streaming-era panic: Am I watching a great show deepen, or am I watching a good show lose momentum?</p></blockquote></div><p>Season 2 keeps a lot of that appeal. James Marsden joins as Owen Ashe, a new neighbor whose arrival threatens to expose Coop’s secrets and pull his family deeper into danger. <a href="https://www.tomsguide.com/news/new-tv-shows">Season 2 premiered April 3, 2026</a> and is rolling out weekly through June 5, with 10 episodes total.</p><p>On paper, that should be enough to keep things moving. But around episodes 5 and 6, the show seemed to shift gears. The crime-thriller energy slowed down. The pacing became more emotional and more interior. Instead of feeling like the walls were closing in on Coop, it started to feel like the show was wandering through grief, family drama and relationship fallout. I found myself scrolling during episodes or even fast forwarding to skip the "boring" parts. </p><p>I realize some of the best shows slow down before they get better. But as a viewer, I felt that very familiar streaming-era panic: <em>Am I watching a great show deepen, or am I watching a good show lose momentum?</em></p><h2 id="the-chatgpt-prompt-i-used-when-the-show-got-boring">The ChatGPT prompt I used when the show got 'boring'</h2><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="AUstGAF7cNZ8uQAxKzTX6M" name="8 - 2026-05-13T141259.508" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/AUstGAF7cNZ8uQAxKzTX6M.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here’s what I asked ChatGPT: <em>“I just finished episode 6 in season 2 of Your Friends & Neighbors. The show seems to be dragging since the last two episodes. Is it worth continuing?”</em></p><p>What I liked about the answer was that it didn’t just say, “Yes, keep watching.” It reframed the question. ChatGPT pointed out that episode 6 might not be filler as much as a pivot. The show seems to be moving away from pure burglary tension and into the emotional consequences of Coop’s choices. In other words, the slower pacing may be intentional.</p><p>That made me think about the show differently. I had been judging it by the energy of its premise: rich man steals from rich neighbors, chaos follows. But season 2 may be asking a slightly different question: what happens when someone builds a second life out of lies and starts believing he can actually survive it?</p><p>That’s a better reason to keep watching than “I’ve already come this far.”</p><h2 id="chatgpt-was-right-about-one-thing">ChatGPT was right about one thing</h2><p>After thinking about it, I realized my frustration wasn’t that "Your Friends & Neighbors" had become bad. It was that it had become less instantly satisfying. That’s different.</p><p>The first season gave viewers a clean engine: Coop needs money, Coop steals, Coop gets pulled deeper into a mess of his own making. Season 2 is messier. It’s more about consequences, grief and whether Coop is still the smartest person in the room or just the most delusional.</p><p><a href="https://www.rottentomatoes.com/tv/your_friends_and_neighbors/s02" target="_blank">Rotten Tomatoes</a>’ critic consensus for season 2 makes a similar point, saying the show “digs itself into a deeper and richer character hole” while praising Hamm, Olivia Munn and Marsden.</p><p>That doesn’t mean every slower episode works. But it does suggest the show is trying to become something more textured than a glossy crime caper.</p><p>And honestly, that’s where ChatGPT was useful. It didn’t tell me whether the show was objectively good. It helped me separate two different questions: <em>Am I bored because the show is failing? Or am I impatient because the show is changing?</em></p><h2 id="the-takeaway">The takeaway</h2><p>My verdict: I’m giving it one more episode. I’m not fully sold yet. Episode 6 still felt slower than I wanted, especially after the sharpness that made the show so easy to binge in the first place. But I’m not quitting either, thanks to ChatGPT's advice to help change my perspective.</p><p>At this point, "Your Friends & Neighbors" has earned at least one more episode from me. Jon Hamm remains the show’s biggest reason to keep watching, and James Marsden’s Owen Ashe gives season 2 a new kind of threat that could still pay off in a big way.</p><p>My hope is that episode 7 reconnects the emotional fallout to the central tension between Coop, Owen and the secrets piling up around them. If that happens, I’m back in. If it keeps drifting, this may become the kind of show I finish later, not one I rush to watch every week.</p><p>And that may be the real lesson here. ChatGPT didn’t tell me (or even know) whether the show would stick the landing, but it did help me figure out what I was actually reacting to. For now, I’m sticking with Apple TV’s No. 1 show. But episode 7 has work to do.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-used-gary-vees-attention-is-currency-mindset-with-chatgpt-and-it-saved-my-weakest-idea">I used Gary Vee’s ‘attention is currency’ mindset with ChatGPT — and it saved my weakest idea</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-to-apply-lewis-howes-greatness-mindset-to-my-life-and-it-completely-changed-how-i-approach-work">I asked ChatGPT to apply Lewis Howes’ ‘Greatness’ mindset to my life — and it completely changed how I approach work</a></li><li><a href="https://www.tomsguide.com/ai/i-gave-chatgpt-permission-to-disagree-with-me-with-this-prompt-and-its-responses-became-dramatically-better">I gave ChatGPT permission to disagree with me with this prompt — and its responses became dramatically better</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I cut my streaming bill to under $20 a month — here's my 3-step plan to fight the streaming price hikes ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With my monthly streaming bill creeping higher and higher with all these price hikes, I finally said: "Enough is enough." The days of streaming as a cheaper alternative to cable are long gone. All those streaming subscriptions add up quickly, especially when my favorite movies and shows are scattered across a growing number of platforms with intrusive ads that make me want to rip my hair out. </p><p>The good news is that you don’t have to cancel everything to lower your monthly bill — though a regular audit of which streaming services you actually use is the best place to start. That's the first step in how I cut my monthly streaming bill down to under $20 a month. After going over everything I was subscribed to (including a few I'd forgotten I'd ever signed up for), I realized I was paying over $70 a month for services I only used once in a blue moon. </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/r4gCu1d-etc" allowfullscreen></iframe></div></div><p>There are plenty of ways to save on your monthly streaming bill, from cycling between services depending on release schedules to exploring free or lower-cost streaming alternatives. Below, I’ve outlined the best strategies I've found for cutting costs without sacrificing the shows and movies I want to watch every day. </p><h2 id="1-audit-and-axe">1. Audit and axe</h2><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="mDNSZm5ah4asJu6kEVFqh7" name="Netflix.jpg" alt="A TV with the Netflix logo sits behind a hand holding a remote" src="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Once I rounded up everything I was paying for in one place, it became a lot easier to figure out which of <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> I needed to keep and those I needed to ditch. I laid out all my subscriptions in a Google Sheet along with the movies and shows I primarily used them for, like Prime Video for "Fallout" or HBO Max for "The Last of Us." I reckoned that until a new season drops, I could do without. </p><p>Now, I have a strict rule to keep my monthly streaming bill under control: If I haven't watched a single exclusive in the last month, the platform gets the axe. That way, I'm only paying for what I actually watch. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OozpqW"></div>                            </div>                            <script src="https://kwizly.com/embed/OozpqW.js" async></script><h2 id="2-subscription-cycling">2. Subscription cycling</h2><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="zrcB59XrtDzYpDhiT75YT7" name="shutterstock_1154935312.jpg" alt="best netflix alternatives" src="https://cdn.mos.cms.futurecdn.net/zrcB59XrtDzYpDhiT75YT7.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: Manuel Esteban / Shutterstock)</span></figcaption></figure><p>Remembering to add and drop subscriptions each month can be tedious, but it's worth the time and effort to save a few bucks. Here's how it works: I pick one service like Netflix for a month, binge the latest movies and shows I want to watch like "Lord of the Flies" or "Remarkably Bright Creatures," and then cancel it once I'm done. </p><p>It helps to set a calendar reminder a couple of days before the billing cycle, because anything that isn't in my calendar is a gamble whether I'll remember it. Then, the next month, I sign up for another platform with new releases I want to watch. That way, I always have something new to watch, but my bill stays under $20. </p><h2 id="3-leverage-free-streaming-services">3. Leverage free streaming services</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BK6zoJUDSej6PX2Vns5dwh" name="tubi-tablet.jpg" alt="Tubi on a tablet with headphones and popcorn nearby" src="https://cdn.mos.cms.futurecdn.net/BK6zoJUDSej6PX2Vns5dwh.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: Shutterstock; Tubi)</span></figcaption></figure><p>I tell just about anyone who will listen to check out <a href="https://www.tomsguide.com/best-picks/best-free-streaming-services">free streaming services</a> before adding more subscriptions to their monthly bill. FAST platforms like Tubi, <a href="https://www.tomsguide.com/tag/pluto-tv">Pluto TV</a>, the <a href="https://www.tomsguide.com/tag/roku">Roku</a> Channel have built impressive libraries over the years with thousands of movies and shows, not to mention hundreds of live channels that look and feel like cable. Sure, you'll have to sit through some ads, but you'd have to do that anyway unless you're shelling out for premium tiers. </p><p>With over 200,000 movies and TV shows, Tubi is my top choice. Its library of movies includes recently released blockbusters and Hollywood classics from the likes of Paramount, Lionsgate and MGM. You also don't have to sign up for an account to use it, though you'll need one for access to features like parental controls and viewing history. Pluto TV is also an excellent option for live TV streaming, with plenty of live channels you can tune into like MTV, BET, CNN, Fox Sports and more. </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 data-model-name="Disney Plus,Hulu,Max,Paramount Plus,Peacock TV" data-widget-type="multimodelreview" data-widget-title="Streaming service deals not to miss"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/tired-of-streaming-price-hikes-heres-the-exact-3-step-strategy-i-used-to-cut-my-streaming-bill-to-under-usd20-a-month</link>
                                                                            <description>
                            <![CDATA[ If your monthly streaming bill has grown out of control with rising price hikes, here's the strategies I use to cut it back to under $20. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xoqZfJYdozaNybsoiVpvW4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ayvSAvcdaXGoXCNs4LshUX-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 11 May 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 12 May 2026 10:30:10 +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.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/ayvSAvcdaXGoXCNs4LshUX-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[woman using remote control on smart tv]]></media:description>                                                            <media:text><![CDATA[woman using remote control on smart tv]]></media:text>
                                <media:title type="plain"><![CDATA[woman using remote control on smart tv]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ayvSAvcdaXGoXCNs4LshUX-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With my monthly streaming bill creeping higher and higher with all these price hikes, I finally said: "Enough is enough." The days of streaming as a cheaper alternative to cable are long gone. All those streaming subscriptions add up quickly, especially when my favorite movies and shows are scattered across a growing number of platforms with intrusive ads that make me want to rip my hair out. </p><p>The good news is that you don’t have to cancel everything to lower your monthly bill — though a regular audit of which streaming services you actually use is the best place to start. That's the first step in how I cut my monthly streaming bill down to under $20 a month. After going over everything I was subscribed to (including a few I'd forgotten I'd ever signed up for), I realized I was paying over $70 a month for services I only used once in a blue moon. </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/r4gCu1d-etc" allowfullscreen></iframe></div></div><p>There are plenty of ways to save on your monthly streaming bill, from cycling between services depending on release schedules to exploring free or lower-cost streaming alternatives. Below, I’ve outlined the best strategies I've found for cutting costs without sacrificing the shows and movies I want to watch every day. </p><h2 id="1-audit-and-axe">1. Audit and axe</h2><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="mDNSZm5ah4asJu6kEVFqh7" name="Netflix.jpg" alt="A TV with the Netflix logo sits behind a hand holding a remote" src="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Once I rounded up everything I was paying for in one place, it became a lot easier to figure out which of <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> I needed to keep and those I needed to ditch. I laid out all my subscriptions in a Google Sheet along with the movies and shows I primarily used them for, like Prime Video for "Fallout" or HBO Max for "The Last of Us." I reckoned that until a new season drops, I could do without. </p><p>Now, I have a strict rule to keep my monthly streaming bill under control: If I haven't watched a single exclusive in the last month, the platform gets the axe. That way, I'm only paying for what I actually watch. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OozpqW"></div>                            </div>                            <script src="https://kwizly.com/embed/OozpqW.js" async></script><h2 id="2-subscription-cycling">2. Subscription cycling</h2><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="zrcB59XrtDzYpDhiT75YT7" name="shutterstock_1154935312.jpg" alt="best netflix alternatives" src="https://cdn.mos.cms.futurecdn.net/zrcB59XrtDzYpDhiT75YT7.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: Manuel Esteban / Shutterstock)</span></figcaption></figure><p>Remembering to add and drop subscriptions each month can be tedious, but it's worth the time and effort to save a few bucks. Here's how it works: I pick one service like Netflix for a month, binge the latest movies and shows I want to watch like "Lord of the Flies" or "Remarkably Bright Creatures," and then cancel it once I'm done. </p><p>It helps to set a calendar reminder a couple of days before the billing cycle, because anything that isn't in my calendar is a gamble whether I'll remember it. Then, the next month, I sign up for another platform with new releases I want to watch. That way, I always have something new to watch, but my bill stays under $20. </p><h2 id="3-leverage-free-streaming-services">3. Leverage free streaming services</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BK6zoJUDSej6PX2Vns5dwh" name="tubi-tablet.jpg" alt="Tubi on a tablet with headphones and popcorn nearby" src="https://cdn.mos.cms.futurecdn.net/BK6zoJUDSej6PX2Vns5dwh.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: Shutterstock; Tubi)</span></figcaption></figure><p>I tell just about anyone who will listen to check out <a href="https://www.tomsguide.com/best-picks/best-free-streaming-services">free streaming services</a> before adding more subscriptions to their monthly bill. FAST platforms like Tubi, <a href="https://www.tomsguide.com/tag/pluto-tv">Pluto TV</a>, the <a href="https://www.tomsguide.com/tag/roku">Roku</a> Channel have built impressive libraries over the years with thousands of movies and shows, not to mention hundreds of live channels that look and feel like cable. Sure, you'll have to sit through some ads, but you'd have to do that anyway unless you're shelling out for premium tiers. </p><p>With over 200,000 movies and TV shows, Tubi is my top choice. Its library of movies includes recently released blockbusters and Hollywood classics from the likes of Paramount, Lionsgate and MGM. You also don't have to sign up for an account to use it, though you'll need one for access to features like parental controls and viewing history. Pluto TV is also an excellent option for live TV streaming, with plenty of live channels you can tune into like MTV, BET, CNN, Fox Sports and more. </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 data-model-name="Disney Plus,Hulu,Max,Paramount Plus,Peacock TV" data-widget-type="multimodelreview" data-widget-title="Streaming service deals not to miss"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best Apple TV shows you (probably) haven't watched but should stream now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you haven't added <a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV</a> to your trusty bank of top streaming services, you're missing out. The Apple-owned platform is home to some of the most popular and critically acclaimed shows around, including hit comedies like "<a href="https://www.tomsguide.com/entertainment/apple-tv/huge-ted-lasso-season-4-update-including-summer-release-window-first-look-images-and-new-characters">Ted Lasso</a>" and "<a href="https://www.tomsguide.com/opinion/apple-tv-plus-shrinking-is-the-best-new-show-youre-not-watching">Shrinking</a>," mind-bending sci-fi series like "<a href="https://www.tomsguide.com/entertainment/apple-tv-plus/severance-showrunner-reveals-the-end-is-in-sight-as-apple-sci-fi-sensation-racks-up-8-more-emmy-wins">Severance</a>" and "<a href="https://www.tomsguide.com/news/apples-new-post-apocalyptic-tv-show-is-a-certified-hit-with-both-critics-and-fans">Silo</a>," and buzzy new dramas like "<a href="https://www.tomsguide.com/entertainment/streaming/watch-your-friends-and-neighbors-season-2">Your Friends and Neighbors</a>" and "<a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-new-comedy-drama-with-elle-fanning-is-one-of-the-best-new-shows-ive-streamed-so-far-this-year">Margo's Got Money Troubles</a>."</p><p>But the sheer sprawl of that streaming selection means that you might have accidentally missed out on some seriously great but not-as-popular shows over the years. That's where Tom's Guide comes in: We've sorted through the options and come up with a rec list of originally overlooked but high-quality Apple TV series that deserved way more buzz than they got. </p><p>Here are three overlooked Apple TV shows to add to your watch list ASAP.</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="sugar">'Sugar'</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/twvPGxuEOEA" allowfullscreen></iframe></div></div><p>Created by Mark Protosevich ("The Cell," "Oldboy"), this Apple TV neo-noir mystery stars Colin Farrell as the eponymous John Sugar, a private investigator recruited by a wealthy and powerful movie producer (James Cromwell) to examine the sudden disappearance of his granddaughter in Los Angeles. However, Sugar's investigation into the missing persons case leads him to not only uncover deep-seated secrets in the City of Angels but also his own personal demons.<strong> </strong></p><p>Smartly written and stylishly wrought, the addictive eight-episode mystery was renewed for a second season back in October 2024; new episodes are set to premiere on the Apple streamer on June 19, 2026. While the first season also featured Amy Ryan, Dennis Boutsikaris, Nate Corddry and Alex Hernandez, season two will star a new cast, with Jin Ha, Raymond Lee, Tony Dalton, Laura Donnelly, Sasha Calle, and Shea Whigham joining Farrell. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/es/show/servant/umc.cmc.4y25wuby7pck9o6vaubbbk7gb" target="_blank" rel="nofollow"><em><strong>"Sugar" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="physical">'Physical'</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/PQTFdslwJYo" allowfullscreen></iframe></div></div><p>You might already know Rose Byrne's Apple TV+ comedy series "Platonic," which unromantically pairs her up with real-life buddy Seth Rogen. But the Oscar-nominated star actually has <em>another </em>top-notch (albeit lesser-known) show on the Apple platform: "Physical". </p><p>It's a half-hour dark comedy starring Byrne as Sheila Rubin, a quietly tortured housewife living in 1980s San Diego and supporting her hyper-liberal husband’s bid for state assembly. Sheila is unhappy in her marriage and low on self-esteem after a lifelong battle with bulimia, but finds much-needed relief in an unexpected place: the world of aerobics. Created by Annie Weisman, the sweatband satire ran for three seasons on Apple TV.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/physical/umc.cmc.6gdc6v4vwyaab7klocftv2s10" target="_blank" rel="nofollow"><em><strong>"Physical" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="servant">'Servant'</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/N1cOR0sRRIw" allowfullscreen></iframe></div></div><p>If you want your next Apple TV series with a side of chills and thrills, "Servant" might be the one for you. Created by Tony Basgallop ("To the Ends of the Earth"), with M. Night Shyamalan acting as both showrunner and executive producer, the psychological horror thriller focuses on wealthy Philadelphia couple Dorothy and Sean Turner — played by Lauren Ambrose and Toby Kebbell, respectively — whose marriage is crumbling under their own grief following the death of their thirteen-week-old son, Jericho. </p><p>Unable to accept the loss, the couple introduces a lifelike newborn doll and a young nanny (Nell Tiger Free) into their daily lives, not realizing that in doing so they've also opened the door to mysterious, supernatural forces. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/es/show/servant/umc.cmc.4y25wuby7pck9o6vaubbbk7gb" target="_blank" rel="nofollow"><em><strong>"Servant" 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/apple-tv/everything-new-on-apple-tv-in-may-2026">Everything new on Apple TV in May 2026</a></li><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/apple-tvs-new-comedy-drama-with-elle-fanning-is-one-of-the-best-new-shows-ive-streamed-so-far-this-year">Apple TV has another hit on its hands with this must-watch new comedy-drama</a></li></ul><div data-model-name="Apple TV,Netflix,Peacock TV,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/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now</link>
                                                                            <description>
                            <![CDATA[ From a Colin Farrell-led neo-noir to a Rose Byrne-starring '80s comedy, here are three overlooked Apple TV shows that deserved more buzz ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hf5qTrpHpJJC6Q9RQJMCpa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 10 May 2026 09:45:00 +0000</pubDate>                                                                                                                                <updated>Sun, 10 May 2026 12:33:43 +0000</updated>
                                                                                                                                            <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.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/hrTBe4yDuQUeE7F6eLMCvS-1280-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-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you haven't added <a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV</a> to your trusty bank of top streaming services, you're missing out. The Apple-owned platform is home to some of the most popular and critically acclaimed shows around, including hit comedies like "<a href="https://www.tomsguide.com/entertainment/apple-tv/huge-ted-lasso-season-4-update-including-summer-release-window-first-look-images-and-new-characters">Ted Lasso</a>" and "<a href="https://www.tomsguide.com/opinion/apple-tv-plus-shrinking-is-the-best-new-show-youre-not-watching">Shrinking</a>," mind-bending sci-fi series like "<a href="https://www.tomsguide.com/entertainment/apple-tv-plus/severance-showrunner-reveals-the-end-is-in-sight-as-apple-sci-fi-sensation-racks-up-8-more-emmy-wins">Severance</a>" and "<a href="https://www.tomsguide.com/news/apples-new-post-apocalyptic-tv-show-is-a-certified-hit-with-both-critics-and-fans">Silo</a>," and buzzy new dramas like "<a href="https://www.tomsguide.com/entertainment/streaming/watch-your-friends-and-neighbors-season-2">Your Friends and Neighbors</a>" and "<a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-new-comedy-drama-with-elle-fanning-is-one-of-the-best-new-shows-ive-streamed-so-far-this-year">Margo's Got Money Troubles</a>."</p><p>But the sheer sprawl of that streaming selection means that you might have accidentally missed out on some seriously great but not-as-popular shows over the years. That's where Tom's Guide comes in: We've sorted through the options and come up with a rec list of originally overlooked but high-quality Apple TV series that deserved way more buzz than they got. </p><p>Here are three overlooked Apple TV shows to add to your watch list ASAP.</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="sugar">'Sugar'</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/twvPGxuEOEA" allowfullscreen></iframe></div></div><p>Created by Mark Protosevich ("The Cell," "Oldboy"), this Apple TV neo-noir mystery stars Colin Farrell as the eponymous John Sugar, a private investigator recruited by a wealthy and powerful movie producer (James Cromwell) to examine the sudden disappearance of his granddaughter in Los Angeles. However, Sugar's investigation into the missing persons case leads him to not only uncover deep-seated secrets in the City of Angels but also his own personal demons.<strong> </strong></p><p>Smartly written and stylishly wrought, the addictive eight-episode mystery was renewed for a second season back in October 2024; new episodes are set to premiere on the Apple streamer on June 19, 2026. While the first season also featured Amy Ryan, Dennis Boutsikaris, Nate Corddry and Alex Hernandez, season two will star a new cast, with Jin Ha, Raymond Lee, Tony Dalton, Laura Donnelly, Sasha Calle, and Shea Whigham joining Farrell. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/es/show/servant/umc.cmc.4y25wuby7pck9o6vaubbbk7gb" target="_blank" rel="nofollow"><em><strong>"Sugar" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="physical">'Physical'</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/PQTFdslwJYo" allowfullscreen></iframe></div></div><p>You might already know Rose Byrne's Apple TV+ comedy series "Platonic," which unromantically pairs her up with real-life buddy Seth Rogen. But the Oscar-nominated star actually has <em>another </em>top-notch (albeit lesser-known) show on the Apple platform: "Physical". </p><p>It's a half-hour dark comedy starring Byrne as Sheila Rubin, a quietly tortured housewife living in 1980s San Diego and supporting her hyper-liberal husband’s bid for state assembly. Sheila is unhappy in her marriage and low on self-esteem after a lifelong battle with bulimia, but finds much-needed relief in an unexpected place: the world of aerobics. Created by Annie Weisman, the sweatband satire ran for three seasons on Apple TV.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/physical/umc.cmc.6gdc6v4vwyaab7klocftv2s10" target="_blank" rel="nofollow"><em><strong>"Physical" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="servant">'Servant'</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/N1cOR0sRRIw" allowfullscreen></iframe></div></div><p>If you want your next Apple TV series with a side of chills and thrills, "Servant" might be the one for you. Created by Tony Basgallop ("To the Ends of the Earth"), with M. Night Shyamalan acting as both showrunner and executive producer, the psychological horror thriller focuses on wealthy Philadelphia couple Dorothy and Sean Turner — played by Lauren Ambrose and Toby Kebbell, respectively — whose marriage is crumbling under their own grief following the death of their thirteen-week-old son, Jericho. </p><p>Unable to accept the loss, the couple introduces a lifelike newborn doll and a young nanny (Nell Tiger Free) into their daily lives, not realizing that in doing so they've also opened the door to mysterious, supernatural forces. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/es/show/servant/umc.cmc.4y25wuby7pck9o6vaubbbk7gb" target="_blank" rel="nofollow"><em><strong>"Servant" 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/apple-tv/everything-new-on-apple-tv-in-may-2026">Everything new on Apple TV in May 2026</a></li><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/apple-tvs-new-comedy-drama-with-elle-fanning-is-one-of-the-best-new-shows-ive-streamed-so-far-this-year">Apple TV has another hit on its hands with this must-watch new comedy-drama</a></li></ul><div data-model-name="Apple TV,Netflix,Peacock TV,Hulu,Paramount Plus,Disney+" data-widget-type="multimodelreview" data-widget-title="Today's best streaming deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Is a new Apple TV in the works? Here's how John Ternus' appointment as Apple CEO could benefit Apple's streaming device ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With Tim Cook moving on after what's arguably one of the most impressive runs any tech CEO has ever had, Apple is about to get a new leader in the form of <a href="https://www.tomsguide.com/phones/iphones/massive-changes-at-apple-john-ternus-takes-over-as-ceo-sept-1-while-tim-cook-moves-to-executive-chairman">John Ternus</a>. Ternus has been at the company for 25 years, spending most of that time deep in Apple's hardware engineering.</p><p>So where does that leave <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV</a>? Despite being one of the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming boxes</a> out there, it's a product that's always felt forgotten. Meanwhile, iPhones, Macs and iPads get all the attention.</p><p>With a hardware-first CEO running things and Apple seemingly rethinking its approach to the home, there are genuine reasons to believe the Apple TV might finally get some love. But there are also reasons not to get too excited. </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/kkBudtxgor0" allowfullscreen></iframe></div></div><h2 id="john-ternus-hardware-nerd">John Ternus: hardware nerd</h2><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="XK7W9gHWEgHPdh5kir8n9" name="Ternus and Cook" alt="John Ternus and Tim Cook" src="https://cdn.mos.cms.futurecdn.net/XK7W9gHWEgHPdh5kir8n9.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>Ternus isn't someone who's climbed the ladder through finance, marketing or operations. On the contrary, he's a hardware person through and through. In fact, his entire Apple career has been about getting involved with the engineering and manufacturing of physical products. </p><p>It's easy to look at streaming devices and think they're simple compared to something like an iPhone. In actuality, building these devices means navigating a surprisingly tangled set of decisions around chips, thermal management, connectivity and manufacturing.</p><div class="product"><a data-dimension112="48ffb912-e897-42c9-bcfa-78362ca4090b" data-action="Deal Block" data-label="Apple TV 4K Streaming device" data-dimension48="Apple TV 4K Streaming device" data-dimension25="$149" href="https://www.bestbuy.com/product/apple-tv-4k-128gb-streaming-device-3rd-generation-wi-fi-ethernet-black/JJ8ZH9F3Z4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1076px;"><p class="vanilla-image-block" style="padding-top:99.44%;"><img id="CyXUvbZpgvpfgbo68N3S9R" name="1714492717.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CyXUvbZpgvpfgbo68N3S9R.jpg" mos="" align="middle" fullscreen="" width="1076" height="1070" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/apple-tv-4k-128gb-streaming-device-3rd-generation-wi-fi-ethernet-black/JJ8ZH9F3Z4" target="_blank" rel="nofollow" data-dimension112="48ffb912-e897-42c9-bcfa-78362ca4090b" data-action="Deal Block" data-label="Apple TV 4K Streaming device" data-dimension48="Apple TV 4K Streaming device" data-dimension25="$149">Apple TV 4K Streaming device: $149</a></strong><br>The Apple TV 4K streaming box is our top choice for Apple users. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-tv-4k-128gb-streaming-device-3rd-generation-wi-fi-ethernet-black/JJ8ZH9F3Z4" target="_blank" rel="nofollow" data-dimension112="48ffb912-e897-42c9-bcfa-78362ca4090b" data-action="Deal Block" data-label="Apple TV 4K Streaming device" data-dimension48="Apple TV 4K Streaming device" data-dimension25="$149">View Deal</a></p></div><p>Ternus has been dealing with exactly those kinds of challenges across Apple's full product line for more than two decades. He knows the tradeoffs inside and out, and he’s made this trades for previous Apple TV boxes — arguably the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming devices</a> out there.</p><p>To be clear, having a hardware-focused CEO doesn't automatically make every product better. However, it could certainly make the <em>process</em> of hardware decision-making more efficient. Whether those decisions actually result in a more compelling Apple TV, though, is a separate conversation.</p><h2 id="apple-is-already-leaning-into-the-smart-home-space">Apple is already leaning into the smart home space</h2><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="B95DcAauGWFAAyYtQsqPQ4" name="Apple Home.jpg" alt="A photo of an iPad running Apple Home alongside an Apple HomePod mini and an Apple TV" src="https://cdn.mos.cms.futurecdn.net/B95DcAauGWFAAyYtQsqPQ4.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>In recent years, Apple has extended its reach into the smart home through products like the HomePod and the <a href="https://www.tomsguide.com/reviews/apple-homepod-2nd-generation">HomePod 2</a>. But both the HomePod and the Apple TV seem to get forgotten — at least compared to other Apple products that get annual refreshes. Sure, you could argue that the Apple TV doesn't <em>need</em> a chip bump, but regardless, rumors indicate Apple is planning a renewed push into the smart home.</p><p>Now, that doesn't automatically mean that the Apple TV itself will get more attention. Most of the rumors surround things like a HomePod with a display and potentially even a smart doorbell, but if Apple is indeed pushing deeper into the home, perhaps we'll see other kinds of new products, like an Apple TV soundbar, or even a cheaper Apple TV dongle.</p><p>Apple's been down this road before with HomeKit and the HomePod, and the results were mixed at best, of course. But there's a real difference between the smart home being a pet project for some mid-level team and having the CEO personally invested in making it work. Conviction at the top changes things.</p><h2 id="the-apple-tv-has-a-great-track-record">The Apple TV has a great track record</h2><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="4xH2sCvXbZjeneNd7vBnfc" name="IMG_7777.jpg" alt="The Apple TV 4K seen from above" src="https://cdn.mos.cms.futurecdn.net/4xH2sCvXbZjeneNd7vBnfc.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Despite a relative lack of upgrades, Apple TV has long been considered the best consumer streamer, and for good reason. Yes, it's more expensive than others from the likes of Roku, and you could argue that streamers in general are on the way out given the fact that most TVs have smart platforms built right into them. That said, if you want a powerful, smart TV platform that integrates with your Apple account, the Apple TV is still the way to go.</p><p>It's also technologically advanced. The A15 chip makes the Apple TV 4K feel <em>much</em> faster and more responsive than most other platforms, and the tvOS operating system feels a far more polished than most of the competition.</p><p>That's before even mentioning how well it works with things like the HomePod or AirPods. I often use AirPods with the Apple TV to avoid waking up others in my home. When it comes to high-end streaming devices, there's arguably no competition to the Apple TV.</p><div><blockquote><p>When it comes to high-end streaming devices, there's arguably no competition to the Apple TV.</p></blockquote></div><p>That raises an important question: Why update a product that's head and shoulders above the competition? For this reason, I can easily envision Apple <em>expanding</em> the Apple TV lineup rather than simply updating it.</p><p>Perhaps the key to all of this is Siri. Yes, Apple has lagged others when it comes to using generative AI for its smart assistant, but that's seemingly going to change soon, with a Google <a href="https://www.tomsguide.com/ai/google-promises-siri-powered-by-gemini-is-coming-later-this-year">Gemini-powered version of Siri</a>.</p><p>If Apple is able to finally deliver an all-new, powerful Siri, why wouldn't it want that Siri to be more present in the home, too? That could come through new HomePods, sure, but other kinds of speakers, too — the sort that companies like Sonos currently make. The <a href="https://www.tomsguide.com/audio/soundbars/sonos-arc-ultra-review">Sonos Arc Ultra</a> is consistently rated one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> you can get. I could see Apple wanting to take a shot at that.</p><h2 id="nothing-is-certain">Nothing is certain</h2><p>It's probably worth tempering expectations, of course. Rumors of Apple's push into the smart home aside, Ternus himself is unlikely to change things overnight. After all, anything released in the next two years or so would have already been under development since before Ternus took over. </p><p>Plus, as head of one of the largest companies in the world, he'll have <em>plenty</em> on his plate already. If Ternus is spending his days wrestling with AI strategy, managing iPhone margins and charting a course for the <a href="https://www.tomsguide.com/computing/vr-ar/apple-has-reportedly-stopped-work-on-the-vision-pro-heres-what-we-know">future of the Vision Pro</a>, the Apple TV could still wind up further down the priority list than its fans would hope. </p><p>The fact is, we have no idea if a next-gen Apple TV is in active development, or if Apple plans home theater-related products other than the Apple TV in the future. But the pieces are in place for the Apple TV to get a meaningful lift under Ternus.</p><p>Apple TV fans have more reason for hope right now than they've had in a long time — but keeping expectations in check until we see what actually ships is the smart move.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2Yb2e"></div>                            </div>                            <script src="https://kwizly.com/embed/W2Yb2e.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/i-interviewed-john-ternus-right-before-he-was-named-apple-ceo-heres-the-5-quotes-that-stand-out-to-me">I interviewed John Ternus right before he was named Apple’s next CEO — here’s the 5 quotes that stuck with me</a></li><li><a href="https://www.tomsguide.com/tvs/apple-tv-4k-is-still-the-best-streaming-box-when-it-comes-to-privacy">Apple TV 4K is still the best streaming box when it comes to privacy</a></li><li><a href="https://www.tomsguide.com/computing/vr-ar/apple-has-reportedly-stopped-work-on-the-vision-pro-heres-what-we-know">Apple has reportedly 'stopped work on the Vision Pro' — here's what we know</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>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</link>
                                                                            <description>
                            <![CDATA[ With John Ternus set to replace Tim Cook as Apple CEO, what does the future of Apple streaming devices (like the Apple TV 4K) look like? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aUoSU34kfGMnnzbzmLaQo4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DjjhaBb7iQzCMYs3zYHm23-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 08 May 2026 08:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming Devices]]></category>
                                                    <category><![CDATA[TVs]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christian de Looper ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/cyHuThvGLCKTfcMnWJiY4Y.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Christian de Looper is a freelance writer who has covered every facet of consumer tech, including mobile, audio, home theater, computing, gaming, and even car tech. At Tom’s Guide, Christian covers TV and home theater tech, and has reviewed dozens of TVs, soundbars, and A/V receivers, including those from the likes of Samsung, Hisense, TCL, and Vizio. Christian has also covered numerous industry events, from CES to F8, and is an expert at writing reviews, buying guides, and news. Outside of Tom’s Guide, Christian’s byline can be seen at TechRadar, Forbes, Digital Trends, Business Insider, and more. Follow Christian on Twitter to keep up with all his tech coverage.&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/DjjhaBb7iQzCMYs3zYHm23-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A side-by-side composite: John Ternus sitting on a chair during an interview alongside an Apple TV 4K streaming device.]]></media:description>                                                            <media:text><![CDATA[A side-by-side composite: John Ternus sitting on a chair during an interview alongside an Apple TV 4K streaming device.]]></media:text>
                                <media:title type="plain"><![CDATA[A side-by-side composite: John Ternus sitting on a chair during an interview alongside an Apple TV 4K streaming device.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DjjhaBb7iQzCMYs3zYHm23-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With Tim Cook moving on after what's arguably one of the most impressive runs any tech CEO has ever had, Apple is about to get a new leader in the form of <a href="https://www.tomsguide.com/phones/iphones/massive-changes-at-apple-john-ternus-takes-over-as-ceo-sept-1-while-tim-cook-moves-to-executive-chairman">John Ternus</a>. Ternus has been at the company for 25 years, spending most of that time deep in Apple's hardware engineering.</p><p>So where does that leave <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV</a>? Despite being one of the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming boxes</a> out there, it's a product that's always felt forgotten. Meanwhile, iPhones, Macs and iPads get all the attention.</p><p>With a hardware-first CEO running things and Apple seemingly rethinking its approach to the home, there are genuine reasons to believe the Apple TV might finally get some love. But there are also reasons not to get too excited. </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/kkBudtxgor0" allowfullscreen></iframe></div></div><h2 id="john-ternus-hardware-nerd">John Ternus: hardware nerd</h2><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="XK7W9gHWEgHPdh5kir8n9" name="Ternus and Cook" alt="John Ternus and Tim Cook" src="https://cdn.mos.cms.futurecdn.net/XK7W9gHWEgHPdh5kir8n9.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>Ternus isn't someone who's climbed the ladder through finance, marketing or operations. On the contrary, he's a hardware person through and through. In fact, his entire Apple career has been about getting involved with the engineering and manufacturing of physical products. </p><p>It's easy to look at streaming devices and think they're simple compared to something like an iPhone. In actuality, building these devices means navigating a surprisingly tangled set of decisions around chips, thermal management, connectivity and manufacturing.</p><div class="product"><a data-dimension112="48ffb912-e897-42c9-bcfa-78362ca4090b" data-action="Deal Block" data-label="Apple TV 4K Streaming device" data-dimension48="Apple TV 4K Streaming device" data-dimension25="$149" href="https://www.bestbuy.com/product/apple-tv-4k-128gb-streaming-device-3rd-generation-wi-fi-ethernet-black/JJ8ZH9F3Z4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1076px;"><p class="vanilla-image-block" style="padding-top:99.44%;"><img id="CyXUvbZpgvpfgbo68N3S9R" name="1714492717.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CyXUvbZpgvpfgbo68N3S9R.jpg" mos="" align="middle" fullscreen="" width="1076" height="1070" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.bestbuy.com/product/apple-tv-4k-128gb-streaming-device-3rd-generation-wi-fi-ethernet-black/JJ8ZH9F3Z4" target="_blank" rel="nofollow" data-dimension112="48ffb912-e897-42c9-bcfa-78362ca4090b" data-action="Deal Block" data-label="Apple TV 4K Streaming device" data-dimension48="Apple TV 4K Streaming device" data-dimension25="$149">Apple TV 4K Streaming device: $149</a></strong><br>The Apple TV 4K streaming box is our top choice for Apple users. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-tv-4k-128gb-streaming-device-3rd-generation-wi-fi-ethernet-black/JJ8ZH9F3Z4" target="_blank" rel="nofollow" data-dimension112="48ffb912-e897-42c9-bcfa-78362ca4090b" data-action="Deal Block" data-label="Apple TV 4K Streaming device" data-dimension48="Apple TV 4K Streaming device" data-dimension25="$149">View Deal</a></p></div><p>Ternus has been dealing with exactly those kinds of challenges across Apple's full product line for more than two decades. He knows the tradeoffs inside and out, and he’s made this trades for previous Apple TV boxes — arguably the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming devices</a> out there.</p><p>To be clear, having a hardware-focused CEO doesn't automatically make every product better. However, it could certainly make the <em>process</em> of hardware decision-making more efficient. Whether those decisions actually result in a more compelling Apple TV, though, is a separate conversation.</p><h2 id="apple-is-already-leaning-into-the-smart-home-space">Apple is already leaning into the smart home space</h2><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="B95DcAauGWFAAyYtQsqPQ4" name="Apple Home.jpg" alt="A photo of an iPad running Apple Home alongside an Apple HomePod mini and an Apple TV" src="https://cdn.mos.cms.futurecdn.net/B95DcAauGWFAAyYtQsqPQ4.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>In recent years, Apple has extended its reach into the smart home through products like the HomePod and the <a href="https://www.tomsguide.com/reviews/apple-homepod-2nd-generation">HomePod 2</a>. But both the HomePod and the Apple TV seem to get forgotten — at least compared to other Apple products that get annual refreshes. Sure, you could argue that the Apple TV doesn't <em>need</em> a chip bump, but regardless, rumors indicate Apple is planning a renewed push into the smart home.</p><p>Now, that doesn't automatically mean that the Apple TV itself will get more attention. Most of the rumors surround things like a HomePod with a display and potentially even a smart doorbell, but if Apple is indeed pushing deeper into the home, perhaps we'll see other kinds of new products, like an Apple TV soundbar, or even a cheaper Apple TV dongle.</p><p>Apple's been down this road before with HomeKit and the HomePod, and the results were mixed at best, of course. But there's a real difference between the smart home being a pet project for some mid-level team and having the CEO personally invested in making it work. Conviction at the top changes things.</p><h2 id="the-apple-tv-has-a-great-track-record">The Apple TV has a great track record</h2><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="4xH2sCvXbZjeneNd7vBnfc" name="IMG_7777.jpg" alt="The Apple TV 4K seen from above" src="https://cdn.mos.cms.futurecdn.net/4xH2sCvXbZjeneNd7vBnfc.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Despite a relative lack of upgrades, Apple TV has long been considered the best consumer streamer, and for good reason. Yes, it's more expensive than others from the likes of Roku, and you could argue that streamers in general are on the way out given the fact that most TVs have smart platforms built right into them. That said, if you want a powerful, smart TV platform that integrates with your Apple account, the Apple TV is still the way to go.</p><p>It's also technologically advanced. The A15 chip makes the Apple TV 4K feel <em>much</em> faster and more responsive than most other platforms, and the tvOS operating system feels a far more polished than most of the competition.</p><p>That's before even mentioning how well it works with things like the HomePod or AirPods. I often use AirPods with the Apple TV to avoid waking up others in my home. When it comes to high-end streaming devices, there's arguably no competition to the Apple TV.</p><div><blockquote><p>When it comes to high-end streaming devices, there's arguably no competition to the Apple TV.</p></blockquote></div><p>That raises an important question: Why update a product that's head and shoulders above the competition? For this reason, I can easily envision Apple <em>expanding</em> the Apple TV lineup rather than simply updating it.</p><p>Perhaps the key to all of this is Siri. Yes, Apple has lagged others when it comes to using generative AI for its smart assistant, but that's seemingly going to change soon, with a Google <a href="https://www.tomsguide.com/ai/google-promises-siri-powered-by-gemini-is-coming-later-this-year">Gemini-powered version of Siri</a>.</p><p>If Apple is able to finally deliver an all-new, powerful Siri, why wouldn't it want that Siri to be more present in the home, too? That could come through new HomePods, sure, but other kinds of speakers, too — the sort that companies like Sonos currently make. The <a href="https://www.tomsguide.com/audio/soundbars/sonos-arc-ultra-review">Sonos Arc Ultra</a> is consistently rated one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> you can get. I could see Apple wanting to take a shot at that.</p><h2 id="nothing-is-certain">Nothing is certain</h2><p>It's probably worth tempering expectations, of course. Rumors of Apple's push into the smart home aside, Ternus himself is unlikely to change things overnight. After all, anything released in the next two years or so would have already been under development since before Ternus took over. </p><p>Plus, as head of one of the largest companies in the world, he'll have <em>plenty</em> on his plate already. If Ternus is spending his days wrestling with AI strategy, managing iPhone margins and charting a course for the <a href="https://www.tomsguide.com/computing/vr-ar/apple-has-reportedly-stopped-work-on-the-vision-pro-heres-what-we-know">future of the Vision Pro</a>, the Apple TV could still wind up further down the priority list than its fans would hope. </p><p>The fact is, we have no idea if a next-gen Apple TV is in active development, or if Apple plans home theater-related products other than the Apple TV in the future. But the pieces are in place for the Apple TV to get a meaningful lift under Ternus.</p><p>Apple TV fans have more reason for hope right now than they've had in a long time — but keeping expectations in check until we see what actually ships is the smart move.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2Yb2e"></div>                            </div>                            <script src="https://kwizly.com/embed/W2Yb2e.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/i-interviewed-john-ternus-right-before-he-was-named-apple-ceo-heres-the-5-quotes-that-stand-out-to-me">I interviewed John Ternus right before he was named Apple’s next CEO — here’s the 5 quotes that stuck with me</a></li><li><a href="https://www.tomsguide.com/tvs/apple-tv-4k-is-still-the-best-streaming-box-when-it-comes-to-privacy">Apple TV 4K is still the best streaming box when it comes to privacy</a></li><li><a href="https://www.tomsguide.com/computing/vr-ar/apple-has-reportedly-stopped-work-on-the-vision-pro-heres-what-we-know">Apple has reportedly 'stopped work on the Vision Pro' — here's what we know</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in May 2026 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We're finally in the thick of spring, folks, with flowers blooming, birds chirping and plenty of great TV coming to a screen near you. And yes, that includes a fresh month of new selections from <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>, one of the top streaming services around: As you already know, every month, the Apple platform does a sweep through its sprawling selection of movies and TV series, bringing in new titillating titles for you to add to your watch list. And May 2026 will be no exception, with a quartet of buzzy new releases joining the service.  </p><p>Kicking off this month is "Unconditional," a new mother-daughter thriller from the team behind "Homeland."<em> </em>Then we've got the premiere of the dark comedy "Maximum Pleasure Guaranteed," starring Emmy winner Tatiana Maslany as a burnt-out mom who finds herself roped into a cam-boy conspiracy. </p><p>Later in the month, we get the family-adventure film "Propeller One-Way Night Coach," which is the directorial debut of John Travolta, as well as "Star City," an equally high-flying sci-fi spinoff of the popular Apple series "<a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-for-all-mankind-season-5-online">For All Mankind</a>." Looking for what to queue up next? Keep scrolling for a closer look at what’s new on Apple TV this May. </p><h2 id="unconditional">'Unconditional'</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/j99ypz4OuEk" allowfullscreen></iframe></div></div><p>From the producers of "Homeland" comes this new thriller series, which follows twentysomething Gali (Talia Lynne Ronn) and her mom, Orna (Liraz Chamami), whose mother-daughter vacation turns into a nightmare when the former is arrested for drug smuggling in Moscow. Refusing to accept the charges, Orna desperately sets off to prove her daughter's innocence, a fight for freedom that pulls her into a deadly web of crime and corruption.</p><p>Joining those leading ladies, the 'Unconditional" ensemble will also feature Amir Haddad (“La Belle et Le Boulanger”), Yossi Marshek (“Yellow Peppers,” "Manpower"), Evgenia Dodina (“Invisible,” “Virgins”) and Vladimir Friedman (“Bad Boy”).  The eight-part series is written by Adam Bizanski and directed by Johnathan Gurfinkel.</p><p><em><strong>Watch on </strong></em><a href="https://apple.co/Unconditional" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 8</strong></em></p><h2 id="maximum-pleasure-guaranteed">'Maximum Pleasure Guaranteed'</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/_8KOzyMYgiw" allowfullscreen></iframe></div></div><p>"Orphan Black" great Tatiana Maslany leads Apple TV's new dark comedy-thriller show "Maximum Pleasure Guaranteed" as newly divorced mom Paula who, when not struggling through an identity crisis and a custody battle with her now ex-husband Karl (played by Jake Johnson), is busy being infatuated with a young cam-boy named Trevor (Brandon Flynn). </p><p>Soon, though, it becomes clear that Trevor's attentions aren't entirely sincere and he's simply trying to scam Paula, a disappointment that turned dangerous when the mom seemingly witnesses the sex worker committing a murder. Paula begins her own crime investigations, which sees her falling down "a rabbit hole of blackmail, murder and youth soccer," per the show's official logline. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 20</strong></em></p><h2 id="propeller-one-way-night-coach">'Propeller One-Way Night Coach'</h2><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="AX47q2E9uZYL6ZQ4q6icsW" name="Propeller One-Way Night Coach" alt="Propeller One-Way Night Coach" src="https://cdn.mos.cms.futurecdn.net/AX47q2E9uZYL6ZQ4q6icsW.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>Hollywood legend and flying enthusiast John Travolta brings together both of his famous hobbies with the film adaptation of "Propeller One-Way Night Coach," which will serve as the actor's directorial debut. Based on his own 1997 children's novel of the same name, the family-adventure flick is set in the golden age of aviation and follows young aerophile Jeff (Clark Shotwell) and his mother (Kelly Eviston-Quinnett) as they embark on a one-way, cross-country flight to California. </p><p>"Between airline meals, charming flight attendants (played by Ella Bleu Travolta and Olga Hoffmann), unexpected stopovers, larger-than-life passengers and a thrilling glimpse at first class, the journey unfolds in moments both magical and unexpected, charting the course for the boy’s future," reads the official film synopsis. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> from May 29</strong></em></p><h2 id="star-city">‘Star City'</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/Uh-8EUCJHx8" allowfullscreen></iframe></div></div><p>A spinoff of the long-running Apple drama "For All Mankind," sci-fi newcomer "Star City" shifts the focus of the global space race to the Soviet Union's perspective.</p><p> Starring Rhys Ifans, Anna Maxwell Martin, Agnes O'Casey, Adam Nagaitis, Alice Englert and Josef Davies, among others, the series introduces you to the Soviet cosmonauts, engineers, and intelligence officers who are risking everything for the USSR to be the first to reach the moon. </p><p>However, as you peek behind the Iron Curtain and see both the personal hardships and political pressures required of such a feat, you'll soon discover that what's on the ground is far more dangerous than what's up in the stars. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/nz/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 29</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/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><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</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-may-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in May 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UUWGFN6szdUfxbwEaUfqpa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 25 Apr 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.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/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a orange yellow background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a orange yellow background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a orange yellow background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're finally in the thick of spring, folks, with flowers blooming, birds chirping and plenty of great TV coming to a screen near you. And yes, that includes a fresh month of new selections from <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>, one of the top streaming services around: As you already know, every month, the Apple platform does a sweep through its sprawling selection of movies and TV series, bringing in new titillating titles for you to add to your watch list. And May 2026 will be no exception, with a quartet of buzzy new releases joining the service.  </p><p>Kicking off this month is "Unconditional," a new mother-daughter thriller from the team behind "Homeland."<em> </em>Then we've got the premiere of the dark comedy "Maximum Pleasure Guaranteed," starring Emmy winner Tatiana Maslany as a burnt-out mom who finds herself roped into a cam-boy conspiracy. </p><p>Later in the month, we get the family-adventure film "Propeller One-Way Night Coach," which is the directorial debut of John Travolta, as well as "Star City," an equally high-flying sci-fi spinoff of the popular Apple series "<a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-for-all-mankind-season-5-online">For All Mankind</a>." Looking for what to queue up next? Keep scrolling for a closer look at what’s new on Apple TV this May. </p><h2 id="unconditional">'Unconditional'</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/j99ypz4OuEk" allowfullscreen></iframe></div></div><p>From the producers of "Homeland" comes this new thriller series, which follows twentysomething Gali (Talia Lynne Ronn) and her mom, Orna (Liraz Chamami), whose mother-daughter vacation turns into a nightmare when the former is arrested for drug smuggling in Moscow. Refusing to accept the charges, Orna desperately sets off to prove her daughter's innocence, a fight for freedom that pulls her into a deadly web of crime and corruption.</p><p>Joining those leading ladies, the 'Unconditional" ensemble will also feature Amir Haddad (“La Belle et Le Boulanger”), Yossi Marshek (“Yellow Peppers,” "Manpower"), Evgenia Dodina (“Invisible,” “Virgins”) and Vladimir Friedman (“Bad Boy”).  The eight-part series is written by Adam Bizanski and directed by Johnathan Gurfinkel.</p><p><em><strong>Watch on </strong></em><a href="https://apple.co/Unconditional" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 8</strong></em></p><h2 id="maximum-pleasure-guaranteed">'Maximum Pleasure Guaranteed'</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/_8KOzyMYgiw" allowfullscreen></iframe></div></div><p>"Orphan Black" great Tatiana Maslany leads Apple TV's new dark comedy-thriller show "Maximum Pleasure Guaranteed" as newly divorced mom Paula who, when not struggling through an identity crisis and a custody battle with her now ex-husband Karl (played by Jake Johnson), is busy being infatuated with a young cam-boy named Trevor (Brandon Flynn). </p><p>Soon, though, it becomes clear that Trevor's attentions aren't entirely sincere and he's simply trying to scam Paula, a disappointment that turned dangerous when the mom seemingly witnesses the sex worker committing a murder. Paula begins her own crime investigations, which sees her falling down "a rabbit hole of blackmail, murder and youth soccer," per the show's official logline. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 20</strong></em></p><h2 id="propeller-one-way-night-coach">'Propeller One-Way Night Coach'</h2><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="AX47q2E9uZYL6ZQ4q6icsW" name="Propeller One-Way Night Coach" alt="Propeller One-Way Night Coach" src="https://cdn.mos.cms.futurecdn.net/AX47q2E9uZYL6ZQ4q6icsW.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>Hollywood legend and flying enthusiast John Travolta brings together both of his famous hobbies with the film adaptation of "Propeller One-Way Night Coach," which will serve as the actor's directorial debut. Based on his own 1997 children's novel of the same name, the family-adventure flick is set in the golden age of aviation and follows young aerophile Jeff (Clark Shotwell) and his mother (Kelly Eviston-Quinnett) as they embark on a one-way, cross-country flight to California. </p><p>"Between airline meals, charming flight attendants (played by Ella Bleu Travolta and Olga Hoffmann), unexpected stopovers, larger-than-life passengers and a thrilling glimpse at first class, the journey unfolds in moments both magical and unexpected, charting the course for the boy’s future," reads the official film synopsis. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> from May 29</strong></em></p><h2 id="star-city">‘Star City'</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/Uh-8EUCJHx8" allowfullscreen></iframe></div></div><p>A spinoff of the long-running Apple drama "For All Mankind," sci-fi newcomer "Star City" shifts the focus of the global space race to the Soviet Union's perspective.</p><p> Starring Rhys Ifans, Anna Maxwell Martin, Agnes O'Casey, Adam Nagaitis, Alice Englert and Josef Davies, among others, the series introduces you to the Soviet cosmonauts, engineers, and intelligence officers who are risking everything for the USSR to be the first to reach the moon. </p><p>However, as you peek behind the Iron Curtain and see both the personal hardships and political pressures required of such a feat, you'll soon discover that what's on the ground is far more dangerous than what's up in the stars. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/nz/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 29</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/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><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</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[ Jessica Chastain's Apple TV crime thriller is back on after being postponed following Charlie Kirk's assassination ]]></title>
                                                                                                <dc:content><![CDATA[ <p>"The Savant" is finally coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>. At least, that's what its star, Jessica Chastain, is telling people.</p><p>At the 2026 Breakthrough Prize ceremony in Santa Monica, the actress revealed to <a href="https://variety.com/2026/tv/columns/jessica-chastain-apple-tv-finally-release-the-savant-after-postponement-charlie-kirk-assassination-1236725384/" target="_blank">Variety</a>'s Marc Malkin that her shelved thriller miniseries is finally going to see the light of day. "Before it was like, ‘I don’t know if we’re going to see it,'" she told Malkin. "But now I can say, 'We’re going to see it.'"</p><p>There's a good chance you heard about this show being put on ice, even if you didn't remember the name. We first got <a href="https://www.tomsguide.com/entertainment/streaming/new-apple-tv-plus-thriller-starring-jessica-chastain-gets-release-date">a look at "The Savant"</a> back in July 2025, which is loosely based on a 2019 Cosmopolitan story, "Is It Possible to Stop a Mass Shooting Before It Happens?" It stars Chastain as a woman who works as an undercover investigator to infiltrate online hate groups and stop domestic extremists. It was slated for a Sept. 26, 2025, release date, but just three days prior to that, Apple announced that the series was being postponed.</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:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JWZKjN8AfozxGpHzD4jVjd" name="The_Savant_Photo_010103" alt="Episode 1. Dagmara Dominczyk and Jessica Chastain in "The Savant," coming soon to Apple TV." src="https://cdn.mos.cms.futurecdn.net/JWZKjN8AfozxGpHzD4jVjd.png" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>While Apple didn't explain why the series was shelved, most people (myself included) concluded it was due to the assassination of Charlie Kirk on September 10. </p><p>As to why Apple took nearly two weeks to delay a series, then put it on hold for a further several months, who's to say? Could it be Apple was worried about blowback? Most likely, though, unless there's something I'm missing, the show centering around politically motivated hate groups and Kirk being killed in an act of political violence is the only connective tissue here. There doesn't appear to be any character resembling even a facsimile of Kirk.</p><p>Maybe this project secretly needed more work, and Apple took a chance to shelve something it wasn't confident in? Far less likely, but it is surprising that suddenly, Apple has determined that 10 months is the exact right amount of time it needed to wait to release this show. </p><p>Of course, that's only if rumors of a July 2026 release window are correct. There's still no guarantee the show premieres at all. While Chastain is telling people on the red carpet that "The Savant" is coming and Variety reports the thriller series is coming in July, Apple has yet to say anything official. Until the tech giant's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html" target="_blank">streaming service</a> says anything, this show could remain in the dark indefinitely.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X8pDgX"></div>                            </div>                            <script src="https://kwizly.com/embed/X8pDgX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-new-releases-7-shows-and-movies-you-need-to-stream-this-week-april-20-26-2026">Netflix new releases: 7 shows and movies you need to stream this week (April 20-26)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/lorne-is-an-snl-documentary-far-more-hilarious-than-most-comedy-movies-and-i-had-a-blast">'Lorne' is an 'SNL' documentary far more hilarious than most comedy movies, and I had a blast</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/i-just-watched-philadelphia-and-i-cant-believe-this-was-the-only-time-tom-hanks-and-denzel-teamed-up-for-a-movie">I just watched 'Philadelphia' and I can't believe this was the only time Tom Hanks and Denzel teamed up for a movie</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/jessica-chastains-apple-tv-crime-thriller-is-back-on-after-being-postponed-following-charlie-kirks-assassination</link>
                                                                            <description>
                            <![CDATA[ Jessica Chastain has revealed her Apple TV crime thriller series, "The Savant," will finally be released this year after an indefinite hold. Here's when it is tipped to be released. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">e7mGbAZ4ic5bBHMd9jQwon</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mjVo8qX2haQq9KFg5KtfWG-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Apr 2026 17:01:51 +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.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/mjVo8qX2haQq9KFg5KtfWG-1280-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Episode 1. Jessica Chastain in &quot;The Savant,&quot; coming soon to Apple TV.]]></media:description>                                                            <media:text><![CDATA[Episode 1. Jessica Chastain in &quot;The Savant,&quot; coming soon to Apple TV.]]></media:text>
                                <media:title type="plain"><![CDATA[Episode 1. Jessica Chastain in &quot;The Savant,&quot; coming soon to Apple TV.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mjVo8qX2haQq9KFg5KtfWG-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"The Savant" is finally coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>. At least, that's what its star, Jessica Chastain, is telling people.</p><p>At the 2026 Breakthrough Prize ceremony in Santa Monica, the actress revealed to <a href="https://variety.com/2026/tv/columns/jessica-chastain-apple-tv-finally-release-the-savant-after-postponement-charlie-kirk-assassination-1236725384/" target="_blank">Variety</a>'s Marc Malkin that her shelved thriller miniseries is finally going to see the light of day. "Before it was like, ‘I don’t know if we’re going to see it,'" she told Malkin. "But now I can say, 'We’re going to see it.'"</p><p>There's a good chance you heard about this show being put on ice, even if you didn't remember the name. We first got <a href="https://www.tomsguide.com/entertainment/streaming/new-apple-tv-plus-thriller-starring-jessica-chastain-gets-release-date">a look at "The Savant"</a> back in July 2025, which is loosely based on a 2019 Cosmopolitan story, "Is It Possible to Stop a Mass Shooting Before It Happens?" It stars Chastain as a woman who works as an undercover investigator to infiltrate online hate groups and stop domestic extremists. It was slated for a Sept. 26, 2025, release date, but just three days prior to that, Apple announced that the series was being postponed.</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:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JWZKjN8AfozxGpHzD4jVjd" name="The_Savant_Photo_010103" alt="Episode 1. Dagmara Dominczyk and Jessica Chastain in "The Savant," coming soon to Apple TV." src="https://cdn.mos.cms.futurecdn.net/JWZKjN8AfozxGpHzD4jVjd.png" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>While Apple didn't explain why the series was shelved, most people (myself included) concluded it was due to the assassination of Charlie Kirk on September 10. </p><p>As to why Apple took nearly two weeks to delay a series, then put it on hold for a further several months, who's to say? Could it be Apple was worried about blowback? Most likely, though, unless there's something I'm missing, the show centering around politically motivated hate groups and Kirk being killed in an act of political violence is the only connective tissue here. There doesn't appear to be any character resembling even a facsimile of Kirk.</p><p>Maybe this project secretly needed more work, and Apple took a chance to shelve something it wasn't confident in? Far less likely, but it is surprising that suddenly, Apple has determined that 10 months is the exact right amount of time it needed to wait to release this show. </p><p>Of course, that's only if rumors of a July 2026 release window are correct. There's still no guarantee the show premieres at all. While Chastain is telling people on the red carpet that "The Savant" is coming and Variety reports the thriller series is coming in July, Apple has yet to say anything official. Until the tech giant's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html" target="_blank">streaming service</a> says anything, this show could remain in the dark indefinitely.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X8pDgX"></div>                            </div>                            <script src="https://kwizly.com/embed/X8pDgX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-new-releases-7-shows-and-movies-you-need-to-stream-this-week-april-20-26-2026">Netflix new releases: 7 shows and movies you need to stream this week (April 20-26)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/lorne-is-an-snl-documentary-far-more-hilarious-than-most-comedy-movies-and-i-had-a-blast">'Lorne' is an 'SNL' documentary far more hilarious than most comedy movies, and I had a blast</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/i-just-watched-philadelphia-and-i-cant-believe-this-was-the-only-time-tom-hanks-and-denzel-teamed-up-for-a-movie">I just watched 'Philadelphia' and I can't believe this was the only time Tom Hanks and Denzel teamed up for a movie</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple TV has another hit on its hands with this must-watch new comedy-drama ]]></title>
                                                                                                <dc:content><![CDATA[ <p><a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is home to a slew of top TV shows, and the streamer has just bolstered its winning roster of exclusives with a new comedy-drama that I'd rank as one of the best new shows I've streamed so far in 2026. </p><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: Margo's Got Money Troubles</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: </strong>4/5 stars</li><li><strong>Verdict: </strong>"Margo's Got Money Troubles" is a warm, funny comedy/drama boasting emotion, heart, real stakes, and a great set of characters (and an ensemble to match).</li><li><strong>Premiere date/time: </strong>Three episodes available to stream now, new episodes premiere Wednesdays</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/margos-got-money-troubles/umc.cmc.6wgw0u6vuwydp6obbzzccup3w" target="_blank" rel="nofollow">Apple TV</a></li></ul></p></div></div><p>This is "Margo's Got Money Troubles," a brand-new family dramedy from David E. Kelley ("Big Little Lies," "<a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-presumed-innocent-online">Presumed Innocent</a>"). Based on <a href="https://www.amazon.com/Margos-Got-Money-Troubles-Novel/dp/0063356597/" target="_blank" rel="nofollow">Rufi Thorpe's novel of the same name,</a> this is an emotional, very funny, and layered comedy-drama that approaches its many topics and themes with real warmth. </p><p>As of publication (April 15), the series just had its three-episode premiere on Apple TV, and having had the chance to stream the season in full ahead of release, I'd definitely recommend it. You can find a little more info about the show alongside my full "Margo's Got Money Troubles" review below, to help you decide whether to add it to your watchlist or not. </p><h2 id="what-is-margo-s-got-money-troubles-about">What is 'Margo's Got Money Troubles' 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/AjI52haEerU" allowfullscreen></iframe></div></div><p>Pitched as a "bold, heartwarming and comedic family drama" by Apple TV, the series follows Margo (Elle Fanning), a recent college dropout and aspiring writer, the daughter of ex-Hooters waitress Shyanne (Michelle Pfeiffer) and former professional wrestler Jinx (Nick Offerman). When she finds herself with a new baby, a mounting pile of bills, and dwindling amounts of ways to pay for them, Margo decides to strike out on a new career path as an OnlyFans content creator. </p><p>In addition to Fanning, Pfeiffer, and Offerman, "Margo's Got Money Troubles" also stars Marcia Gay Harden, Greg Kinnear, Michael Angarano, Rico Nasty, and Lindsey Normington.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Odvvme"></div>                            </div>                            <script src="https://kwizly.com/embed/Odvvme.js" async></script><h2 id="margo-s-got-money-troubles-is-layered-and-laugh-out-loud-funny">'Margo's Got Money Troubles' is layered and laugh-out-loud funny</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5246px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CjbsGvDH3dtVckQRagoaY5" name="Margos_Got_Money_Trouble_Photo_0101" alt="Margo (Elle Fanning) lies with her head in Shyanne's (Michelle Pfeiffer) lap on the couch in a scene from Apple TV's "Margo's Got Money Troubles"" src="https://cdn.mos.cms.futurecdn.net/CjbsGvDH3dtVckQRagoaY5.jpg" mos="" align="middle" fullscreen="" width="5246" height="2951" 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>Whether you're looking for a funny or feel-good show, "Margo's Got Money Troubles" will fit the bill. I've not read the original novel, but left the full season feeling thoroughly satisfied; this quirky, eight-part series touches on a range of topics sensitively, and it juggles its emotional depth, ideas, antics, and plot well.  It's also frequently <em>hilarious.</em></p><p>I wouldn't want to spoil the ups and downs of Margo's journey, but this is a story of (among other things) survival, motherhood, respect, family, creative liberation, and yes, it does get raunchy, but it nevertheless feels sex-positive and open-minded about Margo's decision and the path it takes her down.</p><p>Fresh off her "Sentimental Value" Oscar nomination, Elle Fanning impresses here. Margo goes through a <em>lot </em>in this show, and she meets every setback, every emotion, and every one of her wins with aplomb. </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:2679px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="87bextqiGtfgncF6eoK2Dm" name="Margos_Got_Money_Troubles_Photo_010102" alt="L-R: Shyanne (Michelle Pfeiffer) and Margo (Elle Fanning) in a car park in a scene from Apple TV's "Margo's Got Money Troubles"" src="https://cdn.mos.cms.futurecdn.net/87bextqiGtfgncF6eoK2Dm.jpg" mos="" align="middle" fullscreen="" width="2679" height="1507" 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 wider cast all deliver, too. Michelle Pfeiffer and Elle Fanning make for a great mother-daughter pairing as Shyanne and Margo, while Nick Offerman's absent but now-supportive father is a welcome presence, too, offering stoicism, advice, and featuring in some downright <em>adorable</em> scenes with the baby at the heart of this story. All three are flawed and unconventional in their own way, and were all great characters to get to know.</p><p>Simply put, "Margo's Got Money Troubles" is a dramedy with real heart. It's off-beat and surprising, sure, but it never feels removed from the reality and stakes of the situation, either. It is comfortably one of the best new series I've streamed in 2026, and one that I'm more than happy to recommend. </p><p><a href="https://tv.apple.com/us/show/margos-got-money-troubles/umc.cmc.6wgw0u6vuwydp6obbzzccup3w" target="_blank" rel="nofollow"><em><strong>Stream "Margo's Got Money Troubles" on Apple TV now</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/entertainment/apple-tv/everything-new-on-apple-tv-in-april-2026">Everything new on Apple TV in April 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/beef-season-2-is-a-recipe-for-disaster-served-hotter-messier-and-more-unhinged-than-before">"BEEF" season 2 is hotter, messier, and more unhinged</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/best-prime-video-top-10-shows-heres-the-top-3-series-to-binge-watch-this-week-april-15-21">Best Prime Video top 10 shows: here's the top 3 series to binge-watch this week</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-new-comedy-drama-with-elle-fanning-is-one-of-the-best-new-shows-ive-streamed-so-far-this-year</link>
                                                                            <description>
                            <![CDATA[ "Margo's Got Money Troubles" is now streaming on Apple TV, and this new dramedy with Elle Fanning is one of the best new shows of 2026 (so far). ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">beKesBVJAyb5cjFGwiB4fM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Dbdg2YmUbAbPzYRkAhNvFZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Apr 2026 09:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 16 Apr 2026 15:46:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Martin Shore ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/a5UrfxWQGQmYiGZ9sXbKja.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/Dbdg2YmUbAbPzYRkAhNvFZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Margo (Elle Fanning) lying on her side in a scene from Apple TV&#039;s &quot;Margo&#039;s Got Money Troubles&quot;]]></media:description>                                                            <media:text><![CDATA[Margo (Elle Fanning) lying on her side in a scene from Apple TV&#039;s &quot;Margo&#039;s Got Money Troubles&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Margo (Elle Fanning) lying on her side in a scene from Apple TV&#039;s &quot;Margo&#039;s Got Money Troubles&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Dbdg2YmUbAbPzYRkAhNvFZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is home to a slew of top TV shows, and the streamer has just bolstered its winning roster of exclusives with a new comedy-drama that I'd rank as one of the best new shows I've streamed so far in 2026. </p><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: Margo's Got Money Troubles</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: </strong>4/5 stars</li><li><strong>Verdict: </strong>"Margo's Got Money Troubles" is a warm, funny comedy/drama boasting emotion, heart, real stakes, and a great set of characters (and an ensemble to match).</li><li><strong>Premiere date/time: </strong>Three episodes available to stream now, new episodes premiere Wednesdays</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/margos-got-money-troubles/umc.cmc.6wgw0u6vuwydp6obbzzccup3w" target="_blank" rel="nofollow">Apple TV</a></li></ul></p></div></div><p>This is "Margo's Got Money Troubles," a brand-new family dramedy from David E. Kelley ("Big Little Lies," "<a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-presumed-innocent-online">Presumed Innocent</a>"). Based on <a href="https://www.amazon.com/Margos-Got-Money-Troubles-Novel/dp/0063356597/" target="_blank" rel="nofollow">Rufi Thorpe's novel of the same name,</a> this is an emotional, very funny, and layered comedy-drama that approaches its many topics and themes with real warmth. </p><p>As of publication (April 15), the series just had its three-episode premiere on Apple TV, and having had the chance to stream the season in full ahead of release, I'd definitely recommend it. You can find a little more info about the show alongside my full "Margo's Got Money Troubles" review below, to help you decide whether to add it to your watchlist or not. </p><h2 id="what-is-margo-s-got-money-troubles-about">What is 'Margo's Got Money Troubles' 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/AjI52haEerU" allowfullscreen></iframe></div></div><p>Pitched as a "bold, heartwarming and comedic family drama" by Apple TV, the series follows Margo (Elle Fanning), a recent college dropout and aspiring writer, the daughter of ex-Hooters waitress Shyanne (Michelle Pfeiffer) and former professional wrestler Jinx (Nick Offerman). When she finds herself with a new baby, a mounting pile of bills, and dwindling amounts of ways to pay for them, Margo decides to strike out on a new career path as an OnlyFans content creator. </p><p>In addition to Fanning, Pfeiffer, and Offerman, "Margo's Got Money Troubles" also stars Marcia Gay Harden, Greg Kinnear, Michael Angarano, Rico Nasty, and Lindsey Normington.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Odvvme"></div>                            </div>                            <script src="https://kwizly.com/embed/Odvvme.js" async></script><h2 id="margo-s-got-money-troubles-is-layered-and-laugh-out-loud-funny">'Margo's Got Money Troubles' is layered and laugh-out-loud funny</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5246px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CjbsGvDH3dtVckQRagoaY5" name="Margos_Got_Money_Trouble_Photo_0101" alt="Margo (Elle Fanning) lies with her head in Shyanne's (Michelle Pfeiffer) lap on the couch in a scene from Apple TV's "Margo's Got Money Troubles"" src="https://cdn.mos.cms.futurecdn.net/CjbsGvDH3dtVckQRagoaY5.jpg" mos="" align="middle" fullscreen="" width="5246" height="2951" 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>Whether you're looking for a funny or feel-good show, "Margo's Got Money Troubles" will fit the bill. I've not read the original novel, but left the full season feeling thoroughly satisfied; this quirky, eight-part series touches on a range of topics sensitively, and it juggles its emotional depth, ideas, antics, and plot well.  It's also frequently <em>hilarious.</em></p><p>I wouldn't want to spoil the ups and downs of Margo's journey, but this is a story of (among other things) survival, motherhood, respect, family, creative liberation, and yes, it does get raunchy, but it nevertheless feels sex-positive and open-minded about Margo's decision and the path it takes her down.</p><p>Fresh off her "Sentimental Value" Oscar nomination, Elle Fanning impresses here. Margo goes through a <em>lot </em>in this show, and she meets every setback, every emotion, and every one of her wins with aplomb. </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:2679px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="87bextqiGtfgncF6eoK2Dm" name="Margos_Got_Money_Troubles_Photo_010102" alt="L-R: Shyanne (Michelle Pfeiffer) and Margo (Elle Fanning) in a car park in a scene from Apple TV's "Margo's Got Money Troubles"" src="https://cdn.mos.cms.futurecdn.net/87bextqiGtfgncF6eoK2Dm.jpg" mos="" align="middle" fullscreen="" width="2679" height="1507" 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 wider cast all deliver, too. Michelle Pfeiffer and Elle Fanning make for a great mother-daughter pairing as Shyanne and Margo, while Nick Offerman's absent but now-supportive father is a welcome presence, too, offering stoicism, advice, and featuring in some downright <em>adorable</em> scenes with the baby at the heart of this story. All three are flawed and unconventional in their own way, and were all great characters to get to know.</p><p>Simply put, "Margo's Got Money Troubles" is a dramedy with real heart. It's off-beat and surprising, sure, but it never feels removed from the reality and stakes of the situation, either. It is comfortably one of the best new series I've streamed in 2026, and one that I'm more than happy to recommend. </p><p><a href="https://tv.apple.com/us/show/margos-got-money-troubles/umc.cmc.6wgw0u6vuwydp6obbzzccup3w" target="_blank" rel="nofollow"><em><strong>Stream "Margo's Got Money Troubles" on Apple TV now</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/entertainment/apple-tv/everything-new-on-apple-tv-in-april-2026">Everything new on Apple TV in April 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/beef-season-2-is-a-recipe-for-disaster-served-hotter-messier-and-more-unhinged-than-before">"BEEF" season 2 is hotter, messier, and more unhinged</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/best-prime-video-top-10-shows-heres-the-top-3-series-to-binge-watch-this-week-april-15-21">Best Prime Video top 10 shows: here's the top 3 series to binge-watch this week</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Margo’s Got Money Troubles' online — stream hit novel adaptation from anywhere ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With nominations for Academy Awards ("Sentimental Value") and Emmys ("The Great"), Elle Fanning now leads Apple TV's latest original show, adapted from a popular Rufi Thorpe novel of the same name. Below is all the information you need to watch “Margo’s Got Money Troubles" online <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> — and potentially for free.</strong> </p><div  class="fancy-box"><div class="fancy_box-title">'Margo’s Got Money Troubles' streaming details, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">Episodes 1-3 of "Margo’s Got Money Troubles" premiere <strong>on Wednesday, April 15</strong>.<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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk-free</strong></a></p></div></div><p>She's got brains. She's got beauty. And she's got a baby. The one thing she doesn't have is money in the bank. Fortunately, there are ways that resourceful young women like Margo (Fanning) can do 'some work on the internet' these days. Let's just say it rhymes with LonelyPlans...</p><p>The other things Margo has are friends and family who are around to support her. Enter a starry cast with Michelle Pfeiffer ("<a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-the-madison-stream-taylor-sheridan-drama-online-from-anywhere" target="_blank">The Madison</a>") perfectly pitched as her former Hooters-hostess mom and Nick Offerman ("<a href="https://www.tomsguide.com/news/parks-and-rec-reunion-episode-2020-how-to-watch-live-stream-and-start-time" target="_blank">Parks and Recreation</a>") as her pro wrestler dad, among an ensemble that also includes Greg Kinnear and Oscar winners Nicole Kidman and Marcia Gay Harden.</p><p>Brought to the screen by David E. Kelley — the man behind the likes of "Chicago Hope", "Ally McBeal" and "Big Little Lies" — read on to discover how to watch "Margo’s Got Money Troubles" online and from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-margo-s-got-money-troubles-online-for-free"><span>How to watch 'Margo’s Got Money Troubles' online for free</span></h2><p>“Margo’s Got Money Troubles" 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 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (save 75%)</strong></a>.</p><h2 class="article-body__section" id="section-how-to-watch-margo-s-got-money-troubles-around-the-world"><span>How to watch 'Margo’s Got Money Troubles' around the world</span></h2><div class="product"><a data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" 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.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Margo’s Got Money Troubles" premieres globally on <a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> on <strong>Wednesday, April 15</strong> with its first three episodes. The remaining five 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help you to access your streams as if you were back home.<a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" 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-margo-s-got-money-troubles-from-anywhere-in-the-world"><span>Watch 'Margo’s Got Money Troubles' from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "Margo’s Got Money Troubles" 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a>. It's the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> on the market:</p><div class="product"><a data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN deal: 3 months extra FREE" data-dimension48="NordVPN deal: 3 months extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" 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 "Margo’s Got Money Troubles" now with this <em>exclusive </em>deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" 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-margo-s-got-money-troubles-episodes-schedule"><span>'Margo’s Got Money Troubles' episodes & schedule</span></h3><p>"Margo’s Got Money Troubles" will run for eight episodes, with the confirmed premiere dates below:<em> </em></p><ul><li><strong>Episode 1</strong> — Wednesday, April 15</li><li><strong>Episode 2</strong> — Wednesday, April 15</li><li><strong>Episode 3</strong> — Wednesday, April 15</li><li><strong>Episode 4</strong> — Wednesday, April 22</li><li><strong>Episode 5</strong> — <strong> </strong>Wednesday, April 29</li><li><strong>Episode 6</strong> — Wednesday, May 6</li><li><strong>Episode 7</strong> — Wednesday, May 13</li><li><strong>Episode 8</strong> — Wednesday, May 20</li></ul><h3 class="article-body__section" id="section-margo-s-got-money-troubles-trailer"><span>'Margo’s Got Money Troubles' 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/AjI52haEerU" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-margo-s-got-money-troubles-cast"><span>'Margo’s Got Money Troubles' cast</span></h3><ul><li><strong>Elle Fanning</strong> as Margo Millet</li><li><strong>Michelle Pfeiffer</strong> as Shyanne Millet</li><li><strong>Nick Offerman</strong> as Jinx Millet</li><li><strong>Nicole Kidman</strong> as Lace</li><li><strong>Thaddea Graham</strong> as Susie</li><li><strong>Marcia Gay Harden</strong> as Elizabeth</li><li><strong>Michael Angarano</strong> as Mark</li><li><strong>Greg Kinnear</strong> as Kenny</li><li><strong>Bagus Susilo</strong> as Morgan</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-april-2026" target="_blank">Everything new on Apple TV in April 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/streaming/watch-the-boys-season-5" target="_blank">How to watch ‘The Boys’ season 5 online — stream comic superhero series 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/streaming/how-to-watch-margos-got-money-troubles-online</link>
                                                                            <description>
                            <![CDATA[ Here's how to watch 'Margo’s Got Money Troubles' episodes online no matter where you are, with Elle Fanning, Michelle Pfeiffer and Nicole Kidman starring. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4zRarzdUQNNHhaLqLxLCdK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3s7uwUgTUFnk8rjbFDWhLG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 14 Apr 2026 22:30: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/3s7uwUgTUFnk8rjbFDWhLG-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A close up of Elle Fanning wearing bright red lipstick in a scene from Apple TV&#039;s &#039;Margo’s Got Money Trouble&#039;.]]></media:description>                                                            <media:text><![CDATA[A close up of Elle Fanning wearing bright red lipstick in a scene from Apple TV&#039;s &#039;Margo’s Got Money Trouble&#039;.]]></media:text>
                                <media:title type="plain"><![CDATA[A close up of Elle Fanning wearing bright red lipstick in a scene from Apple TV&#039;s &#039;Margo’s Got Money Trouble&#039;.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3s7uwUgTUFnk8rjbFDWhLG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With nominations for Academy Awards ("Sentimental Value") and Emmys ("The Great"), Elle Fanning now leads Apple TV's latest original show, adapted from a popular Rufi Thorpe novel of the same name. Below is all the information you need to watch “Margo’s Got Money Troubles" online <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> — and potentially for free.</strong> </p><div  class="fancy-box"><div class="fancy_box-title">'Margo’s Got Money Troubles' streaming details, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">Episodes 1-3 of "Margo’s Got Money Troubles" premiere <strong>on Wednesday, April 15</strong>.<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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk-free</strong></a></p></div></div><p>She's got brains. She's got beauty. And she's got a baby. The one thing she doesn't have is money in the bank. Fortunately, there are ways that resourceful young women like Margo (Fanning) can do 'some work on the internet' these days. Let's just say it rhymes with LonelyPlans...</p><p>The other things Margo has are friends and family who are around to support her. Enter a starry cast with Michelle Pfeiffer ("<a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-the-madison-stream-taylor-sheridan-drama-online-from-anywhere" target="_blank">The Madison</a>") perfectly pitched as her former Hooters-hostess mom and Nick Offerman ("<a href="https://www.tomsguide.com/news/parks-and-rec-reunion-episode-2020-how-to-watch-live-stream-and-start-time" target="_blank">Parks and Recreation</a>") as her pro wrestler dad, among an ensemble that also includes Greg Kinnear and Oscar winners Nicole Kidman and Marcia Gay Harden.</p><p>Brought to the screen by David E. Kelley — the man behind the likes of "Chicago Hope", "Ally McBeal" and "Big Little Lies" — read on to discover how to watch "Margo’s Got Money Troubles" online and from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-margo-s-got-money-troubles-online-for-free"><span>How to watch 'Margo’s Got Money Troubles' online for free</span></h2><p>“Margo’s Got Money Troubles" 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 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (save 75%)</strong></a>.</p><h2 class="article-body__section" id="section-how-to-watch-margo-s-got-money-troubles-around-the-world"><span>How to watch 'Margo’s Got Money Troubles' around the world</span></h2><div class="product"><a data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" 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.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Margo’s Got Money Troubles" premieres globally on <a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> on <strong>Wednesday, April 15</strong> with its first three episodes. The remaining five 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help you to access your streams as if you were back home.<a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" 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-margo-s-got-money-troubles-from-anywhere-in-the-world"><span>Watch 'Margo’s Got Money Troubles' from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "Margo’s Got Money Troubles" 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a>. It's the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> on the market:</p><div class="product"><a data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN deal: 3 months extra FREE" data-dimension48="NordVPN deal: 3 months extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" 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 "Margo’s Got Money Troubles" now with this <em>exclusive </em>deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" 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-margo-s-got-money-troubles-episodes-schedule"><span>'Margo’s Got Money Troubles' episodes & schedule</span></h3><p>"Margo’s Got Money Troubles" will run for eight episodes, with the confirmed premiere dates below:<em> </em></p><ul><li><strong>Episode 1</strong> — Wednesday, April 15</li><li><strong>Episode 2</strong> — Wednesday, April 15</li><li><strong>Episode 3</strong> — Wednesday, April 15</li><li><strong>Episode 4</strong> — Wednesday, April 22</li><li><strong>Episode 5</strong> — <strong> </strong>Wednesday, April 29</li><li><strong>Episode 6</strong> — Wednesday, May 6</li><li><strong>Episode 7</strong> — Wednesday, May 13</li><li><strong>Episode 8</strong> — Wednesday, May 20</li></ul><h3 class="article-body__section" id="section-margo-s-got-money-troubles-trailer"><span>'Margo’s Got Money Troubles' 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/AjI52haEerU" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-margo-s-got-money-troubles-cast"><span>'Margo’s Got Money Troubles' cast</span></h3><ul><li><strong>Elle Fanning</strong> as Margo Millet</li><li><strong>Michelle Pfeiffer</strong> as Shyanne Millet</li><li><strong>Nick Offerman</strong> as Jinx Millet</li><li><strong>Nicole Kidman</strong> as Lace</li><li><strong>Thaddea Graham</strong> as Susie</li><li><strong>Marcia Gay Harden</strong> as Elizabeth</li><li><strong>Michael Angarano</strong> as Mark</li><li><strong>Greg Kinnear</strong> as Kenny</li><li><strong>Bagus Susilo</strong> as Morgan</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-april-2026" target="_blank">Everything new on Apple TV in April 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/streaming/watch-the-boys-season-5" target="_blank">How to watch ‘The Boys’ season 5 online — stream comic superhero series 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[ 3 Apple TV shows trending this weekend — including a sleek, slow-burn mystery everyone is obsessed with (April 11-12) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Sure, Apple TV lacks the variety of some of <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> like <a href="https://www.tomsguide.com/reviews/netflix">Netflix</a> or <a href="https://www.tomsguide.com/reviews/prime-video">Prime Video</a>, but what its library lacks in depth it more than makes up for in quality. Apple TV's catalogue is packed with a solid lineup of movies and shows that deserve a spot on any watchlist, though there are three trending shows that everyone's talking about (including one that just kicked of its highly anticipated second season) that you should check out first. </p><p>To save you from endless scrolling through Apple TV, I've put together a list of must-see shows that'll hook you from the first episode but are short enough to binge over a weekend. That includes a darkly funny crime caper led by Jon Hamm, a multigenerational family drama that unfolds over decades, and a black comedy that's one of my personal favorites for it's satisfying twists and turns. So without further ado, here are the best Apple TV shows to binge-watch this weekend.</p><h2 id="your-friends-neighbors">'Your Friends & Neighbors'</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/iVRFMd6dEOE" allowfullscreen></iframe></div></div><p>Apple's so confident in "Your Friends & Neighbors," its Jon Hamm-led dark comedy crime drama, that it's already renewed the series for a third season after season 2 wraps up in June. Hamm stars as Andrew “Coop” Cooper, a disgraced hedge fund manager who finds himself divorced and jobless and resorts to stealing from his neighbors' homes in Westmont Village to maintain the glitzy lifestyle he's become accustomed to. In season two, which kicked off earlier this month with a two-episode premiere, he doubles down on pilfering his social circle, and it puts him in the crosshairs of a dangerous new neighbor, played by James Marsden. His arrival throws another wrench into Coop's plan, upsetting the delicate Westport ecosystem just as middle-age malaise catches up with the neighborhood's smoothest criminal. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><em><strong>"Your Friends & Neighbors" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="pachinko">'Pachinko'</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/O1r5XXJOYNA" allowfullscreen></iframe></div></div><p>"Pachinko" isn’t just aone of the <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">best Apple TV shows</a>—it ranks as one of the finest television dramas ever made. Celebrated by both critics and viewers, its first season earned a remarkable 97% on Rotten Tomatoes, while the second earned an even rarer perfect 100%. This adaptation of Min Jin Lee's bestselling novel is a sweeping, multi-generational saga of a Korean family led by matriarch Kim Sunja (Yuh-Jung Youn). A fling with wealthy businessman Koh Hansu (Lee Min-ho) upends her life when she becomes pregnant with his child, forcing her to make difficult choices to keep her family safe. The storyline jumps between decades as the family moves to Japan and navigates living as second-class citizens during and after World War II. Sunja's sons manage to carve out a place for themselves in the heavily stigmatized pachinko business, but remain shackled by deep-rooted prejudice surrounding their heritage even as their work pulls their family out of poverty.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/pachinko/umc.cmc.17vf6g68dy89kk1l1nnb6min4" target="_blank" rel="nofollow"><em><strong>"Pachinko" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="bad-sisters">'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>I'll admit, I'm biased when it comes to "Bad Sisters," as one of three sisters myself. It's by far the Apple TV show I recommend the most to people, both because its pitch black comedy is a riot and because its central mystery keeps you guessing until the very end who, if anyone, is going to come out of this mess unscathed. It follows the tight-knit Garvey sisters—Grace (Anne-Marie Duff), Eva (Sharon Horgan), Ursula (Eva Birthistle), Bibi (Sarah Greene), and Becka (Eve Hewson)—who vowed to always look out for one another after losing their parents young. However, when Grace’s husband, John Paul (Claes Bang), turns out to be far from the nice guy he pretends to be, their bond is put to the test. His funeral kicks off the show, but the real mystery is how he died, and dodgy insurance agent Tom Claffin (Brian Gleeson) is determined to find out which Garvey sister is the culprit. </p><p><em><strong>Watch </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><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-april-2026">Everything new on Apple TV in April 2026</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free</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></ul><div data-model-name="Disney Plus,Hulu,Max,Paramount Plus,Peacock TV" data-widget-type="multimodelreview" data-widget-title="Streaming service deals not to miss"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/3-apple-tv-shows-trending-this-weekend-including-a-sleek-slow-burn-mystery-everyone-is-obsessed-with-april-11-12</link>
                                                                            <description>
                            <![CDATA[ Looking for what to watch this weekend? These Apple TV shows are the perfect bite-sized binge-watch to wind down with. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7jURNUbtpJR4x9z2RcY3RV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 11 Apr 2026 18:53:45 +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.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/4VdQw8T8Xz9Cct4TixYkfc-1280-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-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Sure, Apple TV lacks the variety of some of <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> like <a href="https://www.tomsguide.com/reviews/netflix">Netflix</a> or <a href="https://www.tomsguide.com/reviews/prime-video">Prime Video</a>, but what its library lacks in depth it more than makes up for in quality. Apple TV's catalogue is packed with a solid lineup of movies and shows that deserve a spot on any watchlist, though there are three trending shows that everyone's talking about (including one that just kicked of its highly anticipated second season) that you should check out first. </p><p>To save you from endless scrolling through Apple TV, I've put together a list of must-see shows that'll hook you from the first episode but are short enough to binge over a weekend. That includes a darkly funny crime caper led by Jon Hamm, a multigenerational family drama that unfolds over decades, and a black comedy that's one of my personal favorites for it's satisfying twists and turns. So without further ado, here are the best Apple TV shows to binge-watch this weekend.</p><h2 id="your-friends-neighbors">'Your Friends & Neighbors'</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/iVRFMd6dEOE" allowfullscreen></iframe></div></div><p>Apple's so confident in "Your Friends & Neighbors," its Jon Hamm-led dark comedy crime drama, that it's already renewed the series for a third season after season 2 wraps up in June. Hamm stars as Andrew “Coop” Cooper, a disgraced hedge fund manager who finds himself divorced and jobless and resorts to stealing from his neighbors' homes in Westmont Village to maintain the glitzy lifestyle he's become accustomed to. In season two, which kicked off earlier this month with a two-episode premiere, he doubles down on pilfering his social circle, and it puts him in the crosshairs of a dangerous new neighbor, played by James Marsden. His arrival throws another wrench into Coop's plan, upsetting the delicate Westport ecosystem just as middle-age malaise catches up with the neighborhood's smoothest criminal. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><em><strong>"Your Friends & Neighbors" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="pachinko">'Pachinko'</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/O1r5XXJOYNA" allowfullscreen></iframe></div></div><p>"Pachinko" isn’t just aone of the <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">best Apple TV shows</a>—it ranks as one of the finest television dramas ever made. Celebrated by both critics and viewers, its first season earned a remarkable 97% on Rotten Tomatoes, while the second earned an even rarer perfect 100%. This adaptation of Min Jin Lee's bestselling novel is a sweeping, multi-generational saga of a Korean family led by matriarch Kim Sunja (Yuh-Jung Youn). A fling with wealthy businessman Koh Hansu (Lee Min-ho) upends her life when she becomes pregnant with his child, forcing her to make difficult choices to keep her family safe. The storyline jumps between decades as the family moves to Japan and navigates living as second-class citizens during and after World War II. Sunja's sons manage to carve out a place for themselves in the heavily stigmatized pachinko business, but remain shackled by deep-rooted prejudice surrounding their heritage even as their work pulls their family out of poverty.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/pachinko/umc.cmc.17vf6g68dy89kk1l1nnb6min4" target="_blank" rel="nofollow"><em><strong>"Pachinko" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="bad-sisters">'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>I'll admit, I'm biased when it comes to "Bad Sisters," as one of three sisters myself. It's by far the Apple TV show I recommend the most to people, both because its pitch black comedy is a riot and because its central mystery keeps you guessing until the very end who, if anyone, is going to come out of this mess unscathed. It follows the tight-knit Garvey sisters—Grace (Anne-Marie Duff), Eva (Sharon Horgan), Ursula (Eva Birthistle), Bibi (Sarah Greene), and Becka (Eve Hewson)—who vowed to always look out for one another after losing their parents young. However, when Grace’s husband, John Paul (Claes Bang), turns out to be far from the nice guy he pretends to be, their bond is put to the test. His funeral kicks off the show, but the real mystery is how he died, and dodgy insurance agent Tom Claffin (Brian Gleeson) is determined to find out which Garvey sister is the culprit. </p><p><em><strong>Watch </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><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-april-2026">Everything new on Apple TV in April 2026</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free</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></ul><div data-model-name="Disney Plus,Hulu,Max,Paramount Plus,Peacock TV" data-widget-type="multimodelreview" data-widget-title="Streaming service deals not to miss"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘The Testaments’ review: ‘The Handmaid’s Tale’ sequel is still timely and chilling, but feels a bit tired ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'The Testaments'</div><div class="fancy_box_body"><p class="fancy-box__body-text"><em><strong>Rating: </strong></em>3/5<strong> </strong>stars</p><p class="fancy-box__body-text"><em><strong>Verdict:</strong></em> "The Testaments" is polished, well-acted and still uncomfortably relevant, given today’s political climate. But for all its timely themes, it struggles to break free from "The Handmaid’s Tale’s" shadow, often feeling like a rehash rather than a reinvention. Worth watching for the performances, especially Chase Infiniti, but not exactly essential viewing.</p><p class="fancy-box__body-text"><em><strong>Release schedule: </strong></em>Episodes 1-3 streaming now, then once weekly every Wednesday at 12 a.m. ET.</p><p class="fancy-box__body-text"><em><strong>Where to watch: </strong></em><a data-analytics-id="inline-link" href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2aivFEQ&offerid=1589248.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" data-rewrite="keep">Hulu</a></p></div></div><p>To be honest, I wasn’t exactly clamoring to go back to Gilead.</p><p>By the time "The Handmaid’s Tale" wrapped, it already felt like a show that had said what it needed to say — and then kept saying it, again and again, just in case we missed it the first five times. The biggest problem facing the next chapter in Margaret Atwood’s dystopian universe might not be anything "The Testaments" does, but that its predecessor simply went on too long.</p><p>After watching the first three episodes, my reaction is less excitement and more exhaustion. This is a well-made show. It’s timely, polished and full of strong performances. But it also feels like slipping back into a story that’s running on muscle memory.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguideentertainment/video/7626444020192922893" data-video-id="7626444020192922893" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguideentertainment" href="https://www.tiktok.com/@tomsguideentertainment">@tomsguideentertainment</a>                            <p></p><a target="_blank" title="♬ original sound - Jwlpiano_🎹 - 🎹Jwlpiano_🕊️" href="https://www.tiktok.com/music/original-sound-Jwlpiano🎹-7293178723644230401">♬ original sound - Jwlpiano_🎹 - 🎹Jwlpiano_🕊️</a></section>                    </blockquote></div>                <h2 id="what-is-the-testaments-about">What is 'The Testaments' about?</h2><p>"The Testaments" shifts the focus to a younger generation — girls who didn’t just survive Gilead, but were raised in it. That’s a smart pivot on paper. Instead of June’s outsider perspective, we get Agnes (Chase Infiniti), the daughter of a high-ranking Commander, who’s grown up believing this is just how the world works.</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/KpWyxrPqkeA" allowfullscreen></iframe></div></div><p>Agnes is a “Plum,” which basically means she’s being prepped for marriage like it’s a debutante ball from hell. She wears purple, attends a finishing school run by Aunt Lydia (Ann Dowd, still unsettling), and is taught — explicitly and implicitly — that her entire purpose is to become someone’s wife and, ideally, a mother.</p><p>Then there’s Daisy (Lucy Halliday), a newcomer from Canada who’s been recruited into Gilead and doesn’t quite buy what they’re selling. When she’s paired with Agnes, you can see the show lining up its central dynamic: believer meets skeptic, system meets disruption, etc.</p><p>The problem is you already know where all of this is going. That slow unraveling of belief? The creeping realization that Gilead is rotten to its core? The small acts of rebellion that build toward something bigger? We've seen it. "The Handmaid’s Tale" already spent six seasons circling the same themes. Even when "The Testaments" tries to reframe things through a coming-of-age lens — friendships, crushes, giggles, mean-girl dynamics — it still lands in very familiar territory.</p><h2 id="verdict-still-relevant-maybe-too-much-but-frustratingly-familiar">Verdict: Still relevant (maybe too much) but frustratingly familiar</h2><p>If there’s a reason to stick with "The Testaments," it’s Chase Infiniti. She’s excellent here, proving that her star-making turn in "One Battle After Another" was not a one-hit wonder. </p><p>Agnes is a tricky character because so much of her arc is internal at this point. She’s not rebelling (yet), not breaking rules in any major way. She’s just starting to question, starting to feel that something is off. Infiniti plays that beautifully. It’s all in the eyes, the bit of hesitation, the tiny changes in how Agnes carries herself and approaches others. You can see the gears turning, even when she can’t say any of it out loud.</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="9xBmxfhVgLguEHpYBuneU4" name="testaments-infiniti" alt="Chase Infiniti in The Testaments" src="https://cdn.mos.cms.futurecdn.net/9xBmxfhVgLguEHpYBuneU4.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: Hulu)</span></figcaption></figure><p>The rest of the cast is great, too. Lucy Halliday brings edge and spark to Daisy, and Ann Dowd slips back into Aunt Lydia mode like she never left. And on a technical level, the show is exactly what you’d expect: It looks great, the production design is meticulous, everything is very presti­ge TV.</p><p>And to be clear, the story this show is telling still matters. Maybe more than ever. The themes of control, bodily autonomy, indoctrination — none of that has lost its bite, especially given the current political climate in the U.S. If anything, "The Testaments" feels a little too real at times.</p><p>But that’s also what makes its sense of repetition more frustrating. Because when a show is this relevant, I want it to push forward and say something sharper and dig deeper. I want it to be an "Andor." Instead, "The Testaments" often feels like it’s rehashing the same ideas "The Handmaid’s Tale" already explored, just from a slightly different vantage point. </p><p>I’ll keep watching. For Infiniti, mostly, and for the hope that it finds a fresher angle as it goes. But three episodes in, "The Testaments" feels less like a bold new chapter and more like a story we already know, told one more time.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/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><li><a href="https://www.tomsguide.com/entertainment/prime-video/im-not-a-binge-watcher-but-i-finished-all-3-seasons-of-this-mystery-thriller-on-prime-video-in-just-2-nights">I'm not a binge-watcher, but I finished all 3 seasons of 'Departure' on Prime Video in just 2 nights</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/the-testaments-review-the-handmaids-tale-sequel-is-still-timely-and-chilling-but-feels-a-bit-tired</link>
                                                                            <description>
                            <![CDATA[ Our "The Testaments" review explores why "The Handmaid's Tale" sequel is a chillingly timely mirror of our current political climate, yet struggles to find a fresh narrative voice beyond the shadow of the original show. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">44TcdEyaSA2QKiipJsFnQN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mja65pQWyUvjN8mzpC7X73-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 08 Apr 2026 05:45:00 +0000</pubDate>                                                                                                                                <updated>Wed, 08 Apr 2026 18:37:05 +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.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/mja65pQWyUvjN8mzpC7X73-1280-80.jpg">
                                                            <media:credit><![CDATA[Hulu]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lucy Halliday and Chase Infiniti in The Testaments]]></media:description>                                                            <media:text><![CDATA[Lucy Halliday and Chase Infiniti in The Testaments]]></media:text>
                                <media:title type="plain"><![CDATA[Lucy Halliday and Chase Infiniti in The Testaments]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mja65pQWyUvjN8mzpC7X73-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'The Testaments'</div><div class="fancy_box_body"><p class="fancy-box__body-text"><em><strong>Rating: </strong></em>3/5<strong> </strong>stars</p><p class="fancy-box__body-text"><em><strong>Verdict:</strong></em> "The Testaments" is polished, well-acted and still uncomfortably relevant, given today’s political climate. But for all its timely themes, it struggles to break free from "The Handmaid’s Tale’s" shadow, often feeling like a rehash rather than a reinvention. Worth watching for the performances, especially Chase Infiniti, but not exactly essential viewing.</p><p class="fancy-box__body-text"><em><strong>Release schedule: </strong></em>Episodes 1-3 streaming now, then once weekly every Wednesday at 12 a.m. ET.</p><p class="fancy-box__body-text"><em><strong>Where to watch: </strong></em><a data-analytics-id="inline-link" href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2aivFEQ&offerid=1589248.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" data-rewrite="keep">Hulu</a></p></div></div><p>To be honest, I wasn’t exactly clamoring to go back to Gilead.</p><p>By the time "The Handmaid’s Tale" wrapped, it already felt like a show that had said what it needed to say — and then kept saying it, again and again, just in case we missed it the first five times. The biggest problem facing the next chapter in Margaret Atwood’s dystopian universe might not be anything "The Testaments" does, but that its predecessor simply went on too long.</p><p>After watching the first three episodes, my reaction is less excitement and more exhaustion. This is a well-made show. It’s timely, polished and full of strong performances. But it also feels like slipping back into a story that’s running on muscle memory.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguideentertainment/video/7626444020192922893" data-video-id="7626444020192922893" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguideentertainment" href="https://www.tiktok.com/@tomsguideentertainment">@tomsguideentertainment</a>                            <p></p><a target="_blank" title="♬ original sound - Jwlpiano_🎹 - 🎹Jwlpiano_🕊️" href="https://www.tiktok.com/music/original-sound-Jwlpiano🎹-7293178723644230401">♬ original sound - Jwlpiano_🎹 - 🎹Jwlpiano_🕊️</a></section>                    </blockquote></div>                <h2 id="what-is-the-testaments-about">What is 'The Testaments' about?</h2><p>"The Testaments" shifts the focus to a younger generation — girls who didn’t just survive Gilead, but were raised in it. That’s a smart pivot on paper. Instead of June’s outsider perspective, we get Agnes (Chase Infiniti), the daughter of a high-ranking Commander, who’s grown up believing this is just how the world works.</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/KpWyxrPqkeA" allowfullscreen></iframe></div></div><p>Agnes is a “Plum,” which basically means she’s being prepped for marriage like it’s a debutante ball from hell. She wears purple, attends a finishing school run by Aunt Lydia (Ann Dowd, still unsettling), and is taught — explicitly and implicitly — that her entire purpose is to become someone’s wife and, ideally, a mother.</p><p>Then there’s Daisy (Lucy Halliday), a newcomer from Canada who’s been recruited into Gilead and doesn’t quite buy what they’re selling. When she’s paired with Agnes, you can see the show lining up its central dynamic: believer meets skeptic, system meets disruption, etc.</p><p>The problem is you already know where all of this is going. That slow unraveling of belief? The creeping realization that Gilead is rotten to its core? The small acts of rebellion that build toward something bigger? We've seen it. "The Handmaid’s Tale" already spent six seasons circling the same themes. Even when "The Testaments" tries to reframe things through a coming-of-age lens — friendships, crushes, giggles, mean-girl dynamics — it still lands in very familiar territory.</p><h2 id="verdict-still-relevant-maybe-too-much-but-frustratingly-familiar">Verdict: Still relevant (maybe too much) but frustratingly familiar</h2><p>If there’s a reason to stick with "The Testaments," it’s Chase Infiniti. She’s excellent here, proving that her star-making turn in "One Battle After Another" was not a one-hit wonder. </p><p>Agnes is a tricky character because so much of her arc is internal at this point. She’s not rebelling (yet), not breaking rules in any major way. She’s just starting to question, starting to feel that something is off. Infiniti plays that beautifully. It’s all in the eyes, the bit of hesitation, the tiny changes in how Agnes carries herself and approaches others. You can see the gears turning, even when she can’t say any of it out loud.</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="9xBmxfhVgLguEHpYBuneU4" name="testaments-infiniti" alt="Chase Infiniti in The Testaments" src="https://cdn.mos.cms.futurecdn.net/9xBmxfhVgLguEHpYBuneU4.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: Hulu)</span></figcaption></figure><p>The rest of the cast is great, too. Lucy Halliday brings edge and spark to Daisy, and Ann Dowd slips back into Aunt Lydia mode like she never left. And on a technical level, the show is exactly what you’d expect: It looks great, the production design is meticulous, everything is very presti­ge TV.</p><p>And to be clear, the story this show is telling still matters. Maybe more than ever. The themes of control, bodily autonomy, indoctrination — none of that has lost its bite, especially given the current political climate in the U.S. If anything, "The Testaments" feels a little too real at times.</p><p>But that’s also what makes its sense of repetition more frustrating. Because when a show is this relevant, I want it to push forward and say something sharper and dig deeper. I want it to be an "Andor." Instead, "The Testaments" often feels like it’s rehashing the same ideas "The Handmaid’s Tale" already explored, just from a slightly different vantage point. </p><p>I’ll keep watching. For Infiniti, mostly, and for the hope that it finds a fresher angle as it goes. But three episodes in, "The Testaments" feels less like a bold new chapter and more like a story we already know, told one more time.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/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><li><a href="https://www.tomsguide.com/entertainment/prime-video/im-not-a-binge-watcher-but-i-finished-all-3-seasons-of-this-mystery-thriller-on-prime-video-in-just-2-nights">I'm not a binge-watcher, but I finished all 3 seasons of 'Departure' on Prime Video in just 2 nights</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 'Your Friends & Neighbors' season 2 online from anywhere  ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Apple clearly has confidence in "Your Friends & Neighbors". Season 2 premieres on Friday, April 3, 2026, and the series has already been renewed for a third season.</p><p>Below, we’ll show you how to watch "Your Friends & Neighbors" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&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">'Your Friends & Neighbors' season 2 release date and time</div><div class="fancy_box_body"><p class="fancy-box__body-text">'Your Friends & Neighbors' season 2 premieres globally on Apple TV on <strong>Friday, April 3, 2026</strong>, with episode 1. New episodes then arrive weekly every Friday until the finale on June 5, 2026.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch from </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>anywhere with NordVPN</strong></a></p></div></div><p>The dark comedy crime drama follows disgraced hedge fund manager Andrew "Coop" Cooper, who turned to robbing his wealthy neighbors after his life fell apart. In the new season, he doubles down on that choice, only to find himself dealing with a dangerous new neighbor played by James Marsden.</p><p>If you missed season 1, this is a good moment to catch up. All nine episodes are already streaming on Apple TV, and season 2 will run for 10 episodes through June 5.</p><p>Below, you'll find the full rollout and the simplest way to watch "Your Friends & Neighbors" wherever you are.</p><h2 class="article-body__section" id="section-how-to-watch-your-friends-neighbors-season-2-on-apple-tv"><span>How to watch 'Your Friends & Neighbors' season 2 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.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Your Friends & Neighbors" premieres on <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" 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> in the U.S., U.K., Australia, and Canada on <strong>Friday, March 13, 2026</strong>.</p><p>An Apple TV+ subscription is what you will need with the cheapest available prices in each country listed below:<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-your-friends-neighbors-season-2-from-anywhere"><span>Watch 'Your Friends & Neighbors' season 2 from anywhere</span></h2><p>Traveling and locked out of your usual apps? A <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the streaming services 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best fit for most people. It offers fast, reliable connections, broad device support and a 30-day money-back guarantee, which makes it a practical choice if you just need something that works.</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: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 70% 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>✅  70% off usual price</strong><br><br>Use Nord to unblock your preferred coverage and watch <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-your-friends-neighbors-season-2-trailer"><span>'Your Friends & Neighbors' 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/Eo0StesaFNY" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-your-friends-neighbors-season-2-cast"><span>'Your Friends & Neighbors' season 2 cast</span></h2><ul><li>Anna Osceola as Maggie Haber</li><li>Jon Hamm as Andrew "Coop" Cooper</li><li>James Marsden as Owen Ashe </li><li>Amanda Peet as Mel Cooper </li><li>Olivia Munn as Samantha "Sam" Levitt </li><li>Aimee Carrero as Elena </li><li>Hoon Lee as Barney Choi </li></ul><h2 class="article-body__section" id="section-your-friends-neighbors-season-2-episode-guide"><span>'Your Friends & Neighbors' season 2 episode guide</span></h2><ul><li>Episode 1: April 3, 2026 </li><li>Episode 2: April 10, 2026 </li><li>Episode 3: April 17, 2026 </li><li>Episode 4: April 24, 2026 </li><li>Episode 5: May 1, 2026 </li><li>Episode 6: May 8, 2026 </li><li>Episode 7: May 15, 2026 </li><li>Episode 8: May 22, 2026 </li><li>Episode 9: May 29, 2026 </li><li>Episode 10: June 5, 2026 </li></ul><section class="article__schema-question"><h3>Is 'Your Friends & Neighbors' season 2 on Netflix?</h3><article class="article__schema-answer"><p>No. "Your Friends & Neighbors" season 2 is an <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> exclusive.</p></article></section><section class="article__schema-question"><h3>Can I binge 'Your Friends & Neighbors' season 2 on day one?</h3><article class="article__schema-answer"><p>No. <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> is releasing the season weekly, starting with episode 1 on April 3 and ending with episode 10 on June 5.</p></article></section><section class="article__schema-question"><h3>Do I need to watch season 1 first?</h3><article class="article__schema-answer"><p>You do not have to, but it will help. Season 1 sets up Coop's fall, the murder accusation he escaped, and the decision that pushes him further into crime at the end of the finale. All nine season 1 episodes are already on <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a>.</p></article></section><section class="article__schema-question"><h3>Where can I watch 'Your Friends & Neighbors' season 2?</h3><article class="article__schema-answer"><p>You can watch "Your Friends & Neighbors" season 2 in the <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> app on Apple devices, smart TVs, streaming sticks, games consoles and online at tv.apple.com.</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/round-up/best-apple-tv-apps">Best Apple TV apps and games</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">The best streaming VPN</a></li><li><a href="https://www.tomsguide.com/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-your-friends-and-neighbors-season-2</link>
                                                                            <description>
                            <![CDATA[ Here's how to watch 'Your Friends & Neighbors' season 2 from anywhere, including the release schedule, regional streaming details. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nJJg4UpSCFoMymtsVacnyQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cpmKnLRXaVNELUE4TrdLkB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Apr 2026 04:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Caroline Preece ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/s3Tee49LANgRMebYz2MZnF.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Caroline is a freelance writer and product tester for Tom’s Guide, translating hands-on testing into clear reviews, buying advice, and how-tos. Previously a writer and smart home editor across Future titles including Livingetc, Homes &amp; Gardens, and TechRadar, she brings 15 years’ experience covering consumer tech, appliances, and home gadgets. Her focus is real-world performance, usability, and value, with an eye for the details that matter in everyday life. Based in a cozy Suffolk apartment, Caroline tests products where they’re used most, at home, and helps readers cut through the noise to choose the right gear with confidence for their homes.&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/cpmKnLRXaVNELUE4TrdLkB-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Your Friends and Neighbors S2 on Apple TV]]></media:description>                                                            <media:text><![CDATA[Your Friends and Neighbors S2 on Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Your Friends and Neighbors S2 on Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cpmKnLRXaVNELUE4TrdLkB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple clearly has confidence in "Your Friends & Neighbors". Season 2 premieres on Friday, April 3, 2026, and the series has already been renewed for a third season.</p><p>Below, we’ll show you how to watch "Your Friends & Neighbors" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&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">'Your Friends & Neighbors' season 2 release date and time</div><div class="fancy_box_body"><p class="fancy-box__body-text">'Your Friends & Neighbors' season 2 premieres globally on Apple TV on <strong>Friday, April 3, 2026</strong>, with episode 1. New episodes then arrive weekly every Friday until the finale on June 5, 2026.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch from </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>anywhere with NordVPN</strong></a></p></div></div><p>The dark comedy crime drama follows disgraced hedge fund manager Andrew "Coop" Cooper, who turned to robbing his wealthy neighbors after his life fell apart. In the new season, he doubles down on that choice, only to find himself dealing with a dangerous new neighbor played by James Marsden.</p><p>If you missed season 1, this is a good moment to catch up. All nine episodes are already streaming on Apple TV, and season 2 will run for 10 episodes through June 5.</p><p>Below, you'll find the full rollout and the simplest way to watch "Your Friends & Neighbors" wherever you are.</p><h2 class="article-body__section" id="section-how-to-watch-your-friends-neighbors-season-2-on-apple-tv"><span>How to watch 'Your Friends & Neighbors' season 2 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.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Your Friends & Neighbors" premieres on <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" 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> in the U.S., U.K., Australia, and Canada on <strong>Friday, March 13, 2026</strong>.</p><p>An Apple TV+ subscription is what you will need with the cheapest available prices in each country listed below:<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-your-friends-neighbors-season-2-from-anywhere"><span>Watch 'Your Friends & Neighbors' season 2 from anywhere</span></h2><p>Traveling and locked out of your usual apps? A <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the streaming services 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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best fit for most people. It offers fast, reliable connections, broad device support and a 30-day money-back guarantee, which makes it a practical choice if you just need something that works.</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: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 70% 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>✅  70% off usual price</strong><br><br>Use Nord to unblock your preferred coverage and watch <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-your-friends-neighbors-season-2-trailer"><span>'Your Friends & Neighbors' 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/Eo0StesaFNY" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-your-friends-neighbors-season-2-cast"><span>'Your Friends & Neighbors' season 2 cast</span></h2><ul><li>Anna Osceola as Maggie Haber</li><li>Jon Hamm as Andrew "Coop" Cooper</li><li>James Marsden as Owen Ashe </li><li>Amanda Peet as Mel Cooper </li><li>Olivia Munn as Samantha "Sam" Levitt </li><li>Aimee Carrero as Elena </li><li>Hoon Lee as Barney Choi </li></ul><h2 class="article-body__section" id="section-your-friends-neighbors-season-2-episode-guide"><span>'Your Friends & Neighbors' season 2 episode guide</span></h2><ul><li>Episode 1: April 3, 2026 </li><li>Episode 2: April 10, 2026 </li><li>Episode 3: April 17, 2026 </li><li>Episode 4: April 24, 2026 </li><li>Episode 5: May 1, 2026 </li><li>Episode 6: May 8, 2026 </li><li>Episode 7: May 15, 2026 </li><li>Episode 8: May 22, 2026 </li><li>Episode 9: May 29, 2026 </li><li>Episode 10: June 5, 2026 </li></ul><section class="article__schema-question"><h3>Is 'Your Friends & Neighbors' season 2 on Netflix?</h3><article class="article__schema-answer"><p>No. "Your Friends & Neighbors" season 2 is an <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> exclusive.</p></article></section><section class="article__schema-question"><h3>Can I binge 'Your Friends & Neighbors' season 2 on day one?</h3><article class="article__schema-answer"><p>No. <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> is releasing the season weekly, starting with episode 1 on April 3 and ending with episode 10 on June 5.</p></article></section><section class="article__schema-question"><h3>Do I need to watch season 1 first?</h3><article class="article__schema-answer"><p>You do not have to, but it will help. Season 1 sets up Coop's fall, the murder accusation he escaped, and the decision that pushes him further into crime at the end of the finale. All nine season 1 episodes are already on <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a>.</p></article></section><section class="article__schema-question"><h3>Where can I watch 'Your Friends & Neighbors' season 2?</h3><article class="article__schema-answer"><p>You can watch "Your Friends & Neighbors" season 2 in the <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> app on Apple devices, smart TVs, streaming sticks, games consoles and online at tv.apple.com.</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/round-up/best-apple-tv-apps">Best Apple TV apps and games</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">The best streaming VPN</a></li><li><a href="https://www.tomsguide.com/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[ How to watch 'Your Friends and Neighbors' season 2 — stream John Hamm Apple TV drama from anywhere ]]></title>
                                                                                                <dc:content><![CDATA[ <p>"Your Friends and Neighbors" season 2 is the highly anticipated sophomore season following the life and crimes of Andrew "Coop" Cooper (played by Jon Hamm), an ex-financial titan who now has more than a cash flow problem and a twisted way of solving it...<br><br>Here’s how to <strong>watch "Your Friends and Neighbors" season 2 online </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with this VPN</strong></a> <strong>– and potentially for free!</strong></p><div  class="fancy-box"><div class="fancy_box-title">'Your Friends and Neighbors' - Release Dates & Streams</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Your Friends and Neighbors" premieres on <strong>Friday, April 3</strong> worldwide.<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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (Try risk-free; 75% Off)</strong></a></p></div></div><p>He is a disgraced hedge fund manager (of course he is) and his decision to deal with his immediate lack of finances is to simply steal off those around him. The associated moral issues do not trouble him unduly and, in fact, seem to give him some kind of perverse thrill. Until a new billionaire arrives.</p><p>Owen Ashe (James Marsden) is an agent of chaos and his arrival immediately threatens Cooper's schemes, promises to expose him and poses a danger to everything he holds dear, including his family. How does he react? He doubles down of course. Buckle up.</p><p>Read on to find out all you need to watch <strong>"Your Friends and Neighbors" season 2 </strong>online from anywhere.</p><h2 class="article-body__section" id="section-watch-your-friends-and-neighbors-s2-on-apple-tv"><span>Watch 'Your Friends and Neighbors' S2 on Apple TV</span></h2><div class="product"><a data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension48=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" 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.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>"Your Friends and Neighbors" season 2 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='"Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)' data-dimension48='"Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)' data-dimension25=""><strong>Apple TV (7-day FREE trial)</strong></a><strong> on Friday, April 3.</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>🇺🇸 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><strong>In many countries – such as the U.K – you can get Apple TV free for one week.</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=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension48=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-your-friends-and-neighbors-s2-anywhere"><span>Watch 'Your Friends and Neighbors' S2 anywhere</span></h2><p>Away from home at the moment and blocked from watching "Your Friends and Neighbors" season 2 (April 3) on your usual subscription?</p><p>Don't worry, you can still watch thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn" target="_blank">VPN</a> (Virtual Private Network). The software allows your devices to appear to be back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>. It's the best on the market:</p><div class="product"><a data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension25=""><strong>NordVPN Deal: 75% Off + 3 Extra 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>✅ 70% off usual price</strong><br><strong>✅ Unblocks streaming services</strong><br><strong>✅ Secure & Private</strong></p><p>Use Nord to unblock Apple TV and watch "Your Friends and Neighbors" season 2 online with our <em><strong>exclusive</strong></em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension25="">View Deal</a></p></div><p>It's really easy to use a VPN to watch "Your Friends and Neighbors" season 2.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you 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 "Your Friends and Neighbors" season 2 from any location.</p><h2 class="article-body__section" id="section-what-to-know-about-your-friends-and-neighbors-s2"><span>What to know about 'Your Friends and Neighbors' S2</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Eo0StesaFNY" allowfullscreen></iframe></div></div><h2 id="your-friends-and-neighbors-season-2-cast">'Your Friends and Neighbors' season 2 - Cast</h2><ul><li><strong>Jon Hamm</strong> as Andrew "Coop" Cooper</li><li><strong>James Marsden</strong> as Owen Ashe</li><li><strong>Amanda Peet</strong> as Mel Cooper</li><li><strong>Olivia Munn</strong> as Samantha Levitt</li><li><strong>Heather Lind</strong> as Grace Porter</li><li><strong>Hoon Lee</strong> as Barney Choi</li><li><strong>Mark Tallman</strong> as Nick Brandes</li><li><strong>Lena Hall</strong> as Alison "Ali" Cooper</li><li><strong>Aimee Carrero</strong> as Elena</li><li><strong>Isabel Gravitt</strong> as Tori Cooper</li><li><strong>Donovan Colan</strong> as Hunter Cooper</li></ul><h3 class="article-body__section" id="section-your-friends-and-neighbors-season-2-episode-guide"><span>'Your Friends and Neighbors' season 2 - Episode guide</span></h3><ul><li><strong>Season 02 Episode 01</strong> - Friday, April 3</li><li><strong>S02 E02 </strong>-<strong> </strong>Fri, Apr 10</li><li><strong>S02 E03 </strong>- Fri, Apr 17</li><li><strong>S02 E04 </strong>- Fri, Apr 24</li><li><strong>S02 E05 </strong>- Fri, May 1</li><li><strong>S02 E06 </strong>- Fri, May 8</li><li><strong>S02 E07 </strong>- Fri, May 15</li><li><strong>S02 E08 </strong>- Fri, May 22</li><li><strong>S02 E09</strong> - Fri, May 29</li><li><strong>S02 E10</strong> - Fri, June 5</li></ul><section class="article__schema-question"><h3>Where is 'Your Friends and Neighbors' s2 filmed?</h3><article class="article__schema-answer"><p>The bulk of filming takes place in the <strong>Hudson Valley region</strong>, which doubles as the show’s fictional <strong>Westmont Village</strong> — a wealthy suburban enclave inspired by Westchester County. Several real places are used on screen, including: <a href="https://sleepyhollowcc.org/" target="_blank" rel="nofollow"><strong>Sleepy Hollow Country Club </strong></a><strong>(Briarcliff Manor)</strong> for golf and social scenes and <strong>Rye, New York</strong> for coastal suburban backdrops.</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-april-2026"><strong>Everything new on Apple TV in April 2026</strong></a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn"><strong>Best streaming VPN</strong></a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-other-bennet-sister"><strong>How to watch The Other Bennet Sister</strong></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-your-friends-and-neighbors-season-2</link>
                                                                            <description>
                            <![CDATA[ Here's how to watch "Your Friends and Neighbors" season 2 on Apple TV from anywhere in the world as the 10 episode sophomore season promises too turn up the tension. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4aAjnKs9FDcQG8anhugtSY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/s2pn6Dww3nL5mSPzi4mTFN-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Apr 2026 22:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Bill Borrows ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xeK7rkjq8eWYnEFsoB9rka.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/s2pn6Dww3nL5mSPzi4mTFN-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sam Levitt (played by) Olivia Munn, Owen Ashe (James Marsden), Andrew &quot;Coop&quot; Cooper (Jon Hamm) and Grace Porter ( Heather Lind) are the... ahem... some of the &quot;Friends and Neighbors&quot; in season 2 of the hit show]]></media:description>                                                            <media:text><![CDATA[Sam Levitt (played by) Olivia Munn, Owen Ashe (James Marsden), Andrew &quot;Coop&quot; Cooper (Jon Hamm) and Grace Porter ( Heather Lind) are the... ahem... some of the &quot;Friends and Neighbors&quot; in season 2 of the hit show]]></media:text>
                                <media:title type="plain"><![CDATA[Sam Levitt (played by) Olivia Munn, Owen Ashe (James Marsden), Andrew &quot;Coop&quot; Cooper (Jon Hamm) and Grace Porter ( Heather Lind) are the... ahem... some of the &quot;Friends and Neighbors&quot; in season 2 of the hit show]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/s2pn6Dww3nL5mSPzi4mTFN-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Your Friends and Neighbors" season 2 is the highly anticipated sophomore season following the life and crimes of Andrew "Coop" Cooper (played by Jon Hamm), an ex-financial titan who now has more than a cash flow problem and a twisted way of solving it...<br><br>Here’s how to <strong>watch "Your Friends and Neighbors" season 2 online </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with this VPN</strong></a> <strong>– and potentially for free!</strong></p><div  class="fancy-box"><div class="fancy_box-title">'Your Friends and Neighbors' - Release Dates & Streams</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Your Friends and Neighbors" premieres on <strong>Friday, April 3</strong> worldwide.<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&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (Try risk-free; 75% Off)</strong></a></p></div></div><p>He is a disgraced hedge fund manager (of course he is) and his decision to deal with his immediate lack of finances is to simply steal off those around him. The associated moral issues do not trouble him unduly and, in fact, seem to give him some kind of perverse thrill. Until a new billionaire arrives.</p><p>Owen Ashe (James Marsden) is an agent of chaos and his arrival immediately threatens Cooper's schemes, promises to expose him and poses a danger to everything he holds dear, including his family. How does he react? He doubles down of course. Buckle up.</p><p>Read on to find out all you need to watch <strong>"Your Friends and Neighbors" season 2 </strong>online from anywhere.</p><h2 class="article-body__section" id="section-watch-your-friends-and-neighbors-s2-on-apple-tv"><span>Watch 'Your Friends and Neighbors' S2 on Apple TV</span></h2><div class="product"><a data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension48=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" 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.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>"Your Friends and Neighbors" season 2 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='"Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)' data-dimension48='"Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)' data-dimension25=""><strong>Apple TV (7-day FREE trial)</strong></a><strong> on Friday, April 3.</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>🇺🇸 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><strong>In many countries – such as the U.K – you can get Apple TV free for one week.</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=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension48=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-your-friends-and-neighbors-s2-anywhere"><span>Watch 'Your Friends and Neighbors' S2 anywhere</span></h2><p>Away from home at the moment and blocked from watching "Your Friends and Neighbors" season 2 (April 3) on your usual subscription?</p><p>Don't worry, you can still watch thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn" target="_blank">VPN</a> (Virtual Private Network). The software allows your devices to appear to be back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>. It's the best on the market:</p><div class="product"><a data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension25=""><strong>NordVPN Deal: 75% Off + 3 Extra 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>✅ 70% off usual price</strong><br><strong>✅ Unblocks streaming services</strong><br><strong>✅ Secure & Private</strong></p><p>Use Nord to unblock Apple TV and watch "Your Friends and Neighbors" season 2 online with our <em><strong>exclusive</strong></em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension25="">View Deal</a></p></div><p>It's really easy to use a VPN to watch "Your Friends and Neighbors" season 2.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you 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 "Your Friends and Neighbors" season 2 from any location.</p><h2 class="article-body__section" id="section-what-to-know-about-your-friends-and-neighbors-s2"><span>What to know about 'Your Friends and Neighbors' S2</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Eo0StesaFNY" allowfullscreen></iframe></div></div><h2 id="your-friends-and-neighbors-season-2-cast">'Your Friends and Neighbors' season 2 - Cast</h2><ul><li><strong>Jon Hamm</strong> as Andrew "Coop" Cooper</li><li><strong>James Marsden</strong> as Owen Ashe</li><li><strong>Amanda Peet</strong> as Mel Cooper</li><li><strong>Olivia Munn</strong> as Samantha Levitt</li><li><strong>Heather Lind</strong> as Grace Porter</li><li><strong>Hoon Lee</strong> as Barney Choi</li><li><strong>Mark Tallman</strong> as Nick Brandes</li><li><strong>Lena Hall</strong> as Alison "Ali" Cooper</li><li><strong>Aimee Carrero</strong> as Elena</li><li><strong>Isabel Gravitt</strong> as Tori Cooper</li><li><strong>Donovan Colan</strong> as Hunter Cooper</li></ul><h3 class="article-body__section" id="section-your-friends-and-neighbors-season-2-episode-guide"><span>'Your Friends and Neighbors' season 2 - Episode guide</span></h3><ul><li><strong>Season 02 Episode 01</strong> - Friday, April 3</li><li><strong>S02 E02 </strong>-<strong> </strong>Fri, Apr 10</li><li><strong>S02 E03 </strong>- Fri, Apr 17</li><li><strong>S02 E04 </strong>- Fri, Apr 24</li><li><strong>S02 E05 </strong>- Fri, May 1</li><li><strong>S02 E06 </strong>- Fri, May 8</li><li><strong>S02 E07 </strong>- Fri, May 15</li><li><strong>S02 E08 </strong>- Fri, May 22</li><li><strong>S02 E09</strong> - Fri, May 29</li><li><strong>S02 E10</strong> - Fri, June 5</li></ul><section class="article__schema-question"><h3>Where is 'Your Friends and Neighbors' s2 filmed?</h3><article class="article__schema-answer"><p>The bulk of filming takes place in the <strong>Hudson Valley region</strong>, which doubles as the show’s fictional <strong>Westmont Village</strong> — a wealthy suburban enclave inspired by Westchester County. Several real places are used on screen, including: <a href="https://sleepyhollowcc.org/" target="_blank" rel="nofollow"><strong>Sleepy Hollow Country Club </strong></a><strong>(Briarcliff Manor)</strong> for golf and social scenes and <strong>Rye, New York</strong> for coastal suburban backdrops.</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-april-2026"><strong>Everything new on Apple TV in April 2026</strong></a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn"><strong>Best streaming VPN</strong></a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-other-bennet-sister"><strong>How to watch The Other Bennet Sister</strong></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[ I would definitely cancel Netflix for April 2026 —here's why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As the weather warms up and the urge to declutter kicks in, it’s a natural moment to give your streaming subscriptions a little cleanup. Streaming services, with their ever-increasing prices, are often the easiest place to trim without feeling too much of a loss.</p><p>Americans now spend an average of $84 a month on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, according to <a href="https://www.depositaccounts.com/blog/digital-subscription-inflation-study.html" target="_blank">Lending Tree</a>,  and with so many platforms in the mix, staying subscribed to all of them year-round doesn't make a lot of sense. A smarter approach is to rotate — keep what you’re actually watching and pause the rest until something really worth your time arrives.</p><p>For April 2026, I recommend canceling Netflix. Even the biggest streamer isn’t immune to a quieter stretch, and right now it’s an easy one to drop from your lineup, at least temporarily. Here’s why Netflix is the service to skip this month.</p><h2 id="why-i-d-cancel-netflix">Why I'd cancel Netflix</h2><p>Netflix feels like a staple, but after <a href="https://www.tomsguide.com/entertainment/netflix/netflix-quietly-rolls-out-yet-another-price-hike-heres-how-much-more-youll-have-to-pay">yet another price hike</a>, it’s been harder to justify the cost. </p><p>That’s not to say there isn’t plenty to watch. The library is massive, and you could easily spend hours just browsing. But for me, a streaming service earns its keep with can’t-miss originals — and this month, Netflix is coming up a little short. April's lineup has just a handful of major releases, most of which are stacked up toward the end of the month.</p><p>The exception to that is the third and final season of "XO, Kitty," which drops April 3. Kitty's journey to attend school in Korea is coming to an end. As senior year throws all sorts of big questions at her, Kitty can at least turn to her big sister for advice. Yep, Lara Jean Covey is heading to Seoul!</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/vPMcEabBQEU" allowfullscreen></iframe></div></div><p>The back half of the month has more to offer. "Beef" returns on April 16 with a new tale of anger, bitterness and revenge. Oscar Isaac and Carey Mulligan star as a country club manager and his wife, who have an argument that could end their marriage — one that's witnessed by an employee (Cailee Spaeny) and her fiancé (Charles Melton).</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/weZ2ZAcvXrU" allowfullscreen></iframe></div></div><p>Then there's the first "Stranger Things" spinoff, the animated "Tales From '85" on April 23. It takes place between the events of the second and third seasons of the OG series, and the Duffer brothers have said it's meant to evoke a Saturday morning cartoon. On the same day, "Running Point" season 2 continues Kate Hudson's question to run the <del>Lakers</del> family's basketball franchise.</p><p>And the last few days of April bring an two action thrillers: the movie "Apex" starring Charlize Theron, Taron Egerton and Eric Bana; and the series "Man on Fire" (based on the novel previously adapted into the 2004 film with Denzel Washington).</p><p>While I'm personally looking forward to "Beef" and "Running Point," I can wait a couple of weeks to binge both — and save money in the process.</p><h2 id="how-much-you-ll-save-by-canceling-netflix">How much you'll save by canceling Netflix</h2><p>If you drop Netflix from your streaming lineup in April, the savings are a bit more noticeable than they used to be. Following its latest price increase, plans now cost $8.99/month with ads, $19.99 for Standard and $26.99 for Premium. </p><p>Taking a month off can put $9 to $27 back in your pocket. It’s not a huge sum on its own, but it adds up quickly if you make a habit of rotating your subscriptions. Canceling just one or two services each month can save you well over $100 across the year without really changing your viewing habits. It’s an easy way to keep your budget in check while still dipping back in whenever a true must-watch finally lands.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwzMAe"></div>                            </div>                            <script src="https://kwizly.com/embed/WwzMAe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/how-to-get-free-netflix">How to get Netflix for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/what-streaming-costs-in-2026-the-price-of-netflix-disney-plus-max-and-more">What streaming costs in 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/best-free-streaming-services">Best free streaming services</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express+,Roku Streambar,Roku Ultra" data-widget-type="multimodelreview" data-widget-title="Today's best Roku streaming device deals"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming/i-would-definitely-cancel-netflix-for-april-2026-heres-why</link>
                                                                            <description>
                            <![CDATA[ Here's why you should consider canceling Netflix in April 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">tSneM89xyrteDCxtQTHqeY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 31 Mar 2026 06:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 31 Mar 2026 13:56:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A TV with the Netflix logo sits behind a hand holding a remote]]></media:description>                                                            <media:text><![CDATA[A TV with the Netflix logo sits behind a hand holding a remote]]></media:text>
                                <media:title type="plain"><![CDATA[A TV with the Netflix logo sits behind a hand holding a remote]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As the weather warms up and the urge to declutter kicks in, it’s a natural moment to give your streaming subscriptions a little cleanup. Streaming services, with their ever-increasing prices, are often the easiest place to trim without feeling too much of a loss.</p><p>Americans now spend an average of $84 a month on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, according to <a href="https://www.depositaccounts.com/blog/digital-subscription-inflation-study.html" target="_blank">Lending Tree</a>,  and with so many platforms in the mix, staying subscribed to all of them year-round doesn't make a lot of sense. A smarter approach is to rotate — keep what you’re actually watching and pause the rest until something really worth your time arrives.</p><p>For April 2026, I recommend canceling Netflix. Even the biggest streamer isn’t immune to a quieter stretch, and right now it’s an easy one to drop from your lineup, at least temporarily. Here’s why Netflix is the service to skip this month.</p><h2 id="why-i-d-cancel-netflix">Why I'd cancel Netflix</h2><p>Netflix feels like a staple, but after <a href="https://www.tomsguide.com/entertainment/netflix/netflix-quietly-rolls-out-yet-another-price-hike-heres-how-much-more-youll-have-to-pay">yet another price hike</a>, it’s been harder to justify the cost. </p><p>That’s not to say there isn’t plenty to watch. The library is massive, and you could easily spend hours just browsing. But for me, a streaming service earns its keep with can’t-miss originals — and this month, Netflix is coming up a little short. April's lineup has just a handful of major releases, most of which are stacked up toward the end of the month.</p><p>The exception to that is the third and final season of "XO, Kitty," which drops April 3. Kitty's journey to attend school in Korea is coming to an end. As senior year throws all sorts of big questions at her, Kitty can at least turn to her big sister for advice. Yep, Lara Jean Covey is heading to Seoul!</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/vPMcEabBQEU" allowfullscreen></iframe></div></div><p>The back half of the month has more to offer. "Beef" returns on April 16 with a new tale of anger, bitterness and revenge. Oscar Isaac and Carey Mulligan star as a country club manager and his wife, who have an argument that could end their marriage — one that's witnessed by an employee (Cailee Spaeny) and her fiancé (Charles Melton).</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/weZ2ZAcvXrU" allowfullscreen></iframe></div></div><p>Then there's the first "Stranger Things" spinoff, the animated "Tales From '85" on April 23. It takes place between the events of the second and third seasons of the OG series, and the Duffer brothers have said it's meant to evoke a Saturday morning cartoon. On the same day, "Running Point" season 2 continues Kate Hudson's question to run the <del>Lakers</del> family's basketball franchise.</p><p>And the last few days of April bring an two action thrillers: the movie "Apex" starring Charlize Theron, Taron Egerton and Eric Bana; and the series "Man on Fire" (based on the novel previously adapted into the 2004 film with Denzel Washington).</p><p>While I'm personally looking forward to "Beef" and "Running Point," I can wait a couple of weeks to binge both — and save money in the process.</p><h2 id="how-much-you-ll-save-by-canceling-netflix">How much you'll save by canceling Netflix</h2><p>If you drop Netflix from your streaming lineup in April, the savings are a bit more noticeable than they used to be. Following its latest price increase, plans now cost $8.99/month with ads, $19.99 for Standard and $26.99 for Premium. </p><p>Taking a month off can put $9 to $27 back in your pocket. It’s not a huge sum on its own, but it adds up quickly if you make a habit of rotating your subscriptions. Canceling just one or two services each month can save you well over $100 across the year without really changing your viewing habits. It’s an easy way to keep your budget in check while still dipping back in whenever a true must-watch finally lands.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwzMAe"></div>                            </div>                            <script src="https://kwizly.com/embed/WwzMAe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/how-to-get-free-netflix">How to get Netflix for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/what-streaming-costs-in-2026-the-price-of-netflix-disney-plus-max-and-more">What streaming costs in 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/best-free-streaming-services">Best free streaming services</a></li></ul><div data-model-name="Roku Streaming Stick 4K (2021),Roku Express+,Roku Streambar,Roku Ultra" data-widget-type="multimodelreview" data-widget-title="Today's best Roku streaming device deals"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in April 2026  ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The winter's <em>finally </em>gone, folks, and with the start of spring comes a fresh blooming of streaming titles to pick from. As you already know, <a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV</a> does a bit of spring cleaning through its sprawling selection of films and TV series every month, and April 2026 will be no exception, with the return of fan favorites and the debut of buzzy new titles.</p><p>Kicking off this month is the second season of "<a href="https://www.tomsguide.com/entertainment/streaming/shows-like-your-friends-and-neighbors">Friends & Neighbors</a>" with Jon Hamm back as financial titan-turned-white collar criminal Coop Cooper. Then we've got the premiere of "Outcome," a star-studded new flick from Jonah Hill, featuring the likes of Keanu Reeves, Cameron Diaz and Matt Bomer. </p><p>Later in the month, Oscar nominee Elle Fanning will lead the new David E. Kelly comedic series "Margo's Got Money Problems," and Matthew Rhys will anchor Katie Lippold's new horror-comedy show "Widow's Bay." There's also a second installment of "<a href="https://www.tomsguide.com/news/watch-criminal-record-online">Criminal Record</a>" on the way. Looking for what to queue up next? Keep scrolling for a closer look at what’s new on Apple TV this April. </p><h2 id="friends-neighbors-season-2">'Friends & Neighbors' 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/Eo0StesaFNY" allowfullscreen></iframe></div></div><p>Who knows what viral memes Jon Hamm will cook up this time as Andrew "Coop" Cooper, a former hedge fund manager who, after being fired in disgrace, has turned to a life of suburban crime against his affluent neighbors to keep up his own wealthy facade in Westmont Village. </p><p>There will certainly be even more criminal hijinks in the second season, which drops on Apple TV on Friday, April 3. But things will get complicated for Coop when his secret is threatened by the arrival of a charming but mysterious billionaire (played by "Paradise" star James Marsden) who moves in next door. Along with that splashy cast newcomer, season 2 will see returning stars including Amanda Peet, Olivia Munn, Hoon Lee, Mark Tallman, Lena Hall, Aimee Carrero, Eunice Bae, Isabel Gravitt and Donovan Colan.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 3</strong></em></p><h2 id="outcome">'Outcome'</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/NQQqInahTAM" allowfullscreen></iframe></div></div><p>Directed and co-written by Jonah Hill, "Outcome" sees Hollywood icon Keanu Reeves playing — fittingly — a Hollywood icon named Reef Hawk, a sobered-up movie star who must confront his personal demons and past mistakes when he gets blackmailed with a mysterious video that could shatter his beloved image and end his acting career. Leaning on his lifelong best friends Kyle (Cameron Diaz) and Xander (Matt Bomer), as well as crisis lawyer Ira (Hill), Reef sets off to find out who's behind the damaging tape and make amends with those he's wronged in the past.</p><p>And just in case that cast isn't stacked enough for you, Hill has assembled a supporting ensemble that includes Drew Barrymore, Susan Lucci, Laverne Cox, David Spade, Atsuko Okatsuka, Roy Wood Jr., Kaia Gerber, Ivy Wolk and even Martin Scorsese. Catch the black comedy on Apple TV beginning Friday, April 10. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/outcome/umc.cmc.3uvjztuy2y8ve2rj6nvgyop89" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 10</strong></em></p><h2 id="margo-s-got-money-troubles">'Margo's Got Money Troubles'</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/AjI52haEerU" allowfullscreen></iframe></div></div><p>Fresh off her Oscar nom for 'Sentimental Value," Elle Fanning heads to the small screen with this Apple TV miniseries “Margo’s Got Money Troubles,” which is based on the bestselling Rufi Thorpe novel and created by David E. Kelley ("Big Little Lies," "Nine Perfect Strangers").</p><p>In the new family dramedy, Fanning (also an executive producer on the series) plays the titular Margo, a recent college dropout, an aspiring writer and the daughter of some unconventional parents: ex-Hooters waitress Shyanne (Michelle Pfeiffer) and ex-pro wrestler Jinx (Nick Offerman). After an unplanned pregnancy, and with single parenthood and piles of bills looming before her, Margot turns to OnlyFans to make ends meet.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> from April 15</strong></em></p><h2 id="criminal-record-season-2">‘Criminal Record' 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/G_sohSQWHvg" allowfullscreen></iframe></div></div><p>The character-driven British crime thriller is back for a second season, beginning its eight-episode run Wednesday, April 22, when we'll catch up with Detective Chief Inspector Daniel Hegarty (Oscar winner Peter Capaldi) and Detective Sergeant June Lenker (Olivier nominee Cush Jumbo) as they take on more cases in contemporary London. </p><p>Season 2 sees the investigative duo forced into an uneasy alliance after a young man is stabbed to death at a political rally. As they dig deeper into the murder, their efforts escalate into a high-stakes undercover operation to thwart a far-right bomb plot targeting the heart of London. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/criminal-record/umc.cmc.1sbjeoma6tvxgda6l0h4bb0x3" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 22</strong></em></p><h2 id="widow-s-bay">'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/41f4xRSQV_g" allowfullscreen></iframe></div></div><p>Our title setting is a quaint island town off the coast of New England, where we meet town mayor Tom Loftis ("The Beast in Me" star Matthew Rhys), who is desperate to turn the place into a tourist destination and revive the struggling community. However, the superstitious locals of Widow's Bay believe the island to be cursed, a belief not shared by skeptical Tom — that is, until those old ghost stories start playing out in real life. </p><p>Created by Katie Dippold ("Parks and Recreation"), with Hiro Murai ("Atlanta," "Barry") directing, the 10-episode horror-comedy series will premiere its first three episodes on Sunday, April 29. Along with Rhys, town inhabitants will include Kate O'Flynn, Stephen Root, Kingston Rumi Southwick, Kevin Caroll and Dale Dickey. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 29</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/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</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-april-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in April 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MJ2te5g5PbtdMLSekULUdW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 29 Mar 2026 07:45: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.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/4VdQw8T8Xz9Cct4TixYkfc-1280-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-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The winter's <em>finally </em>gone, folks, and with the start of spring comes a fresh blooming of streaming titles to pick from. As you already know, <a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV</a> does a bit of spring cleaning through its sprawling selection of films and TV series every month, and April 2026 will be no exception, with the return of fan favorites and the debut of buzzy new titles.</p><p>Kicking off this month is the second season of "<a href="https://www.tomsguide.com/entertainment/streaming/shows-like-your-friends-and-neighbors">Friends & Neighbors</a>" with Jon Hamm back as financial titan-turned-white collar criminal Coop Cooper. Then we've got the premiere of "Outcome," a star-studded new flick from Jonah Hill, featuring the likes of Keanu Reeves, Cameron Diaz and Matt Bomer. </p><p>Later in the month, Oscar nominee Elle Fanning will lead the new David E. Kelly comedic series "Margo's Got Money Problems," and Matthew Rhys will anchor Katie Lippold's new horror-comedy show "Widow's Bay." There's also a second installment of "<a href="https://www.tomsguide.com/news/watch-criminal-record-online">Criminal Record</a>" on the way. Looking for what to queue up next? Keep scrolling for a closer look at what’s new on Apple TV this April. </p><h2 id="friends-neighbors-season-2">'Friends & Neighbors' 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/Eo0StesaFNY" allowfullscreen></iframe></div></div><p>Who knows what viral memes Jon Hamm will cook up this time as Andrew "Coop" Cooper, a former hedge fund manager who, after being fired in disgrace, has turned to a life of suburban crime against his affluent neighbors to keep up his own wealthy facade in Westmont Village. </p><p>There will certainly be even more criminal hijinks in the second season, which drops on Apple TV on Friday, April 3. But things will get complicated for Coop when his secret is threatened by the arrival of a charming but mysterious billionaire (played by "Paradise" star James Marsden) who moves in next door. Along with that splashy cast newcomer, season 2 will see returning stars including Amanda Peet, Olivia Munn, Hoon Lee, Mark Tallman, Lena Hall, Aimee Carrero, Eunice Bae, Isabel Gravitt and Donovan Colan.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 3</strong></em></p><h2 id="outcome">'Outcome'</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/NQQqInahTAM" allowfullscreen></iframe></div></div><p>Directed and co-written by Jonah Hill, "Outcome" sees Hollywood icon Keanu Reeves playing — fittingly — a Hollywood icon named Reef Hawk, a sobered-up movie star who must confront his personal demons and past mistakes when he gets blackmailed with a mysterious video that could shatter his beloved image and end his acting career. Leaning on his lifelong best friends Kyle (Cameron Diaz) and Xander (Matt Bomer), as well as crisis lawyer Ira (Hill), Reef sets off to find out who's behind the damaging tape and make amends with those he's wronged in the past.</p><p>And just in case that cast isn't stacked enough for you, Hill has assembled a supporting ensemble that includes Drew Barrymore, Susan Lucci, Laverne Cox, David Spade, Atsuko Okatsuka, Roy Wood Jr., Kaia Gerber, Ivy Wolk and even Martin Scorsese. Catch the black comedy on Apple TV beginning Friday, April 10. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/outcome/umc.cmc.3uvjztuy2y8ve2rj6nvgyop89" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 10</strong></em></p><h2 id="margo-s-got-money-troubles">'Margo's Got Money Troubles'</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/AjI52haEerU" allowfullscreen></iframe></div></div><p>Fresh off her Oscar nom for 'Sentimental Value," Elle Fanning heads to the small screen with this Apple TV miniseries “Margo’s Got Money Troubles,” which is based on the bestselling Rufi Thorpe novel and created by David E. Kelley ("Big Little Lies," "Nine Perfect Strangers").</p><p>In the new family dramedy, Fanning (also an executive producer on the series) plays the titular Margo, a recent college dropout, an aspiring writer and the daughter of some unconventional parents: ex-Hooters waitress Shyanne (Michelle Pfeiffer) and ex-pro wrestler Jinx (Nick Offerman). After an unplanned pregnancy, and with single parenthood and piles of bills looming before her, Margot turns to OnlyFans to make ends meet.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> from April 15</strong></em></p><h2 id="criminal-record-season-2">‘Criminal Record' 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/G_sohSQWHvg" allowfullscreen></iframe></div></div><p>The character-driven British crime thriller is back for a second season, beginning its eight-episode run Wednesday, April 22, when we'll catch up with Detective Chief Inspector Daniel Hegarty (Oscar winner Peter Capaldi) and Detective Sergeant June Lenker (Olivier nominee Cush Jumbo) as they take on more cases in contemporary London. </p><p>Season 2 sees the investigative duo forced into an uneasy alliance after a young man is stabbed to death at a political rally. As they dig deeper into the murder, their efforts escalate into a high-stakes undercover operation to thwart a far-right bomb plot targeting the heart of London. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/criminal-record/umc.cmc.1sbjeoma6tvxgda6l0h4bb0x3" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 22</strong></em></p><h2 id="widow-s-bay">'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/41f4xRSQV_g" allowfullscreen></iframe></div></div><p>Our title setting is a quaint island town off the coast of New England, where we meet town mayor Tom Loftis ("The Beast in Me" star Matthew Rhys), who is desperate to turn the place into a tourist destination and revive the struggling community. However, the superstitious locals of Widow's Bay believe the island to be cursed, a belief not shared by skeptical Tom — that is, until those old ghost stories start playing out in real life. </p><p>Created by Katie Dippold ("Parks and Recreation"), with Hiro Murai ("Atlanta," "Barry") directing, the 10-episode horror-comedy series will premiere its first three episodes on Sunday, April 29. Along with Rhys, town inhabitants will include Kate O'Flynn, Stephen Root, Kingston Rumi Southwick, Kevin Caroll and Dale Dickey. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 29</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/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</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>
            </channel>
</rss>