<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link rel="alternate" hreflang="en-GB"
                       href="https://www.tomsguide.com/uk/feeds/tag/amazon"
                       type="application/rss+xml"/>
                            <title><![CDATA[ Latest from Tom's Guide UK in Amazon ]]></title>
                <link>https://www.tomsguide.com/uk/tag/amazon</link>
        <description><![CDATA[ All the latest amazon content from the Tom's Guide  UK team ]]></description>
                                    <lastBuildDate>Sat, 22 Aug 2026 18:50:18 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video shows to binge-watch this weekend (August 22-23) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>August is barreling on, and <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> are bursting with a fresh crop of new films and TV series for us to binge on our couches. <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> regularly updates its already extensive streaming library every month, and <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">August 2026</a> was no exception. </p><p>Given how many new shows have popped up, I'm rounding up the best of the bunch to help you skip the scrolling and get to streaming. Of everything added, there's only three worth adding to your watchlist: Alan Ritchson's high-octane return in <strong>"Reacher" season 4</strong>, the messy YA drama "<strong>Sterling Point"</strong> that everyone is talking about, and the crossover episode you never expected, <strong>"The Chosen in the Wild with Bear Grylls."</strong></p><p>So without further ado, here are the three best new to Prime Video shows to binge 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="39-reacher-39-season-4">'Reacher' season 4</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/PCbp1FfipPg" allowfullscreen></iframe></div></div><p><strong>What it's about:</strong> Jack Reacher (Alan Ritchson) is back in Philadelphia, where he witnesses a woman (Karen Kwong-Chip), kill herself on a subway car. He's hounded by police, federal agents and the CIA, who all think she slipped him something before she died. Our action hero gets drawn into a conspiracy that goes all the way to the very top. Season 4 adapts Lee Child’s "Gone Tomorrow," sending Reacher on a dangerous search for answers, and along the way, he’s forced to confront his guilt over the woman's fate that set everything in motion.</p><p><strong>Why you should watch it: </strong>This crime thriller delivers in all the ways you'd expect — and much of the credit goes to the perfectly cast Alan Ritchson, who kills it yet again.</p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/dp/B09ML1QV1S" target="_blank" rel="nofollow"><em><strong>"Reacher" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="39-sterling-point-39">'Sterling Point'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/bwwF3TuJQME" allowfullscreen></iframe></div></div><p><strong>What it's about: </strong>"Sterling Point" is a grounded YA mystery drama starring Ella Rubin as Annie Jacobson, a 17-year-old who inherits a remote island in Canada from her estranged grandfather. She secretly travels to the mysterious property to figure out why their grandfather chose her and learn more about her family history. While she's digging up long-buried secrets, she gets caught in a love triangle and discovers that a girl named Ramona (Amélie Hoeferle) is already staying there and appears to have a connection to her own family.</p><p><strong>Why you should watch it: </strong>"Sterling Point" debuted with a strong 92% critics score on Rotten Tomatoes and has been getting plenty of buzz on social media. It's a messy coming-of-age teen drama that's fun to lose yourself — and at only eight episodes, it's perfect for a weekend binge. </p><p><em><strong>Watch </strong></em><a href="https://www.primevideo.com/detail/0K94N2UBORZCLPIC46VTJQ093E" target="_blank" rel="nofollow"><em><strong>"Sterling Point" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="39-the-chosen-in-the-wild-with-bear-grylls-39">'The Chosen in the Wild with Bear Grylls'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wp4BuflDszk" allowfullscreen></iframe></div></div><p><strong>What it's about: </strong>The famous survivalist Bear Grylls takes Jesus and his followers on devilishly tough adventures in the deserts of Utah. Or rather, he takes the actors who play them in "The Chosen," the multi-season series about the life, death, and resurrection of Jesus of Nazareth, along with showrunner Dallas Jenkins as they discuss faith and nature's trials and tribulations. </p><p><strong>Why you should watch it: </strong>I'm not sure who exactly was clamoring for Bear Grylls content, but this seems made in a lab for men with religious trauma. </p><p><em><strong>Stream </strong></em><a href="https://www.primevideo.com/detail/0GOZ7CFS15K5QZI82RSB4MMZB9" target="_blank" rel="nofollow"><em><strong>"The Chosen in the Wild with Bear Grylls" 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/prime-video/prime-videos-upcoming-ai-makeover-could-completely-change-how-you-decide-what-to-watch-next">Prime Video's upcoming AI makeover could completely change how you decide what to watch next</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-shark-thriller-movie-has-one-big-problem-lurking-beneath-the-surface-and-its-not-the-shark">Prime Video’s new shark thriller movie has one big problem lurking beneath the surface, and it’s not the shark</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-5-gripping-movies-you-can-stream-for-free-and-one-is-an-action-packed-western-film">Prime Video just added 5 gripping movies you can stream for free — and one is an action-packed western film</a></li></ul><div data-model-name="Amazon Prime Video,Hulu,Netflix,Paramount Plus,Peacock TV,Disney+,Apple TV" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-shows-to-binge-watch-this-weekend-august-22-23</link>
                                                                            <description>
                            <![CDATA[ Planning to binge-watch something new this weekend? Here's our weekly guide to the best new to Prime Video series you should be streaming right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">urrFBA2vhF5wbu6UJCpD4A</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 22 Aug 2026 18:50:18 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on teal bubbles background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on teal bubbles background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on teal bubbles background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>August is barreling on, and <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> are bursting with a fresh crop of new films and TV series for us to binge on our couches. <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> regularly updates its already extensive streaming library every month, and <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">August 2026</a> was no exception. </p><p>Given how many new shows have popped up, I'm rounding up the best of the bunch to help you skip the scrolling and get to streaming. Of everything added, there's only three worth adding to your watchlist: Alan Ritchson's high-octane return in <strong>"Reacher" season 4</strong>, the messy YA drama "<strong>Sterling Point"</strong> that everyone is talking about, and the crossover episode you never expected, <strong>"The Chosen in the Wild with Bear Grylls."</strong></p><p>So without further ado, here are the three best new to Prime Video shows to binge 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="39-reacher-39-season-4">'Reacher' season 4</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/PCbp1FfipPg" allowfullscreen></iframe></div></div><p><strong>What it's about:</strong> Jack Reacher (Alan Ritchson) is back in Philadelphia, where he witnesses a woman (Karen Kwong-Chip), kill herself on a subway car. He's hounded by police, federal agents and the CIA, who all think she slipped him something before she died. Our action hero gets drawn into a conspiracy that goes all the way to the very top. Season 4 adapts Lee Child’s "Gone Tomorrow," sending Reacher on a dangerous search for answers, and along the way, he’s forced to confront his guilt over the woman's fate that set everything in motion.</p><p><strong>Why you should watch it: </strong>This crime thriller delivers in all the ways you'd expect — and much of the credit goes to the perfectly cast Alan Ritchson, who kills it yet again.</p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/dp/B09ML1QV1S" target="_blank" rel="nofollow"><em><strong>"Reacher" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="39-sterling-point-39">'Sterling Point'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/bwwF3TuJQME" allowfullscreen></iframe></div></div><p><strong>What it's about: </strong>"Sterling Point" is a grounded YA mystery drama starring Ella Rubin as Annie Jacobson, a 17-year-old who inherits a remote island in Canada from her estranged grandfather. She secretly travels to the mysterious property to figure out why their grandfather chose her and learn more about her family history. While she's digging up long-buried secrets, she gets caught in a love triangle and discovers that a girl named Ramona (Amélie Hoeferle) is already staying there and appears to have a connection to her own family.</p><p><strong>Why you should watch it: </strong>"Sterling Point" debuted with a strong 92% critics score on Rotten Tomatoes and has been getting plenty of buzz on social media. It's a messy coming-of-age teen drama that's fun to lose yourself — and at only eight episodes, it's perfect for a weekend binge. </p><p><em><strong>Watch </strong></em><a href="https://www.primevideo.com/detail/0K94N2UBORZCLPIC46VTJQ093E" target="_blank" rel="nofollow"><em><strong>"Sterling Point" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="39-the-chosen-in-the-wild-with-bear-grylls-39">'The Chosen in the Wild with Bear Grylls'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wp4BuflDszk" allowfullscreen></iframe></div></div><p><strong>What it's about: </strong>The famous survivalist Bear Grylls takes Jesus and his followers on devilishly tough adventures in the deserts of Utah. Or rather, he takes the actors who play them in "The Chosen," the multi-season series about the life, death, and resurrection of Jesus of Nazareth, along with showrunner Dallas Jenkins as they discuss faith and nature's trials and tribulations. </p><p><strong>Why you should watch it: </strong>I'm not sure who exactly was clamoring for Bear Grylls content, but this seems made in a lab for men with religious trauma. </p><p><em><strong>Stream </strong></em><a href="https://www.primevideo.com/detail/0GOZ7CFS15K5QZI82RSB4MMZB9" target="_blank" rel="nofollow"><em><strong>"The Chosen in the Wild with Bear Grylls" 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/prime-video/prime-videos-upcoming-ai-makeover-could-completely-change-how-you-decide-what-to-watch-next">Prime Video's upcoming AI makeover could completely change how you decide what to watch next</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-shark-thriller-movie-has-one-big-problem-lurking-beneath-the-surface-and-its-not-the-shark">Prime Video’s new shark thriller movie has one big problem lurking beneath the surface, and it’s not the shark</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-5-gripping-movies-you-can-stream-for-free-and-one-is-an-action-packed-western-film">Prime Video just added 5 gripping movies you can stream for free — and one is an action-packed western film</a></li></ul><div data-model-name="Amazon Prime Video,Hulu,Netflix,Paramount Plus,Peacock TV,Disney+,Apple TV" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Prime Video top 10 movies — here are the 3 worth watching this week (August 17-23) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you're not sure what to watch on Prime Video this week, you might turn to the streaming service's top 10 most-watched list for some guidance. After all, this rotating ranking gives you a quick look at the movies dominating the platform right now. However, it's no perfect recommendation tool. </p><p>Take it from me, somebody who tracks the Prime Video top 10 daily: Just because a movie ranks on the list doesn't necessarily mean it's a quality watch. But that's why I've combed through the current top 10 (as of Monday, August 17) and picked out a trio of movies worthy of your time.</p><h3 class="article-body__section" id="section-best-movies-in-the-prime-video-top-10"><span>Best movies in the Prime Video top 10</span></h3><h2 id="masters-of-the-universe-2026">‘Masters of the Universe' (2026)</h2><div 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>Amazon MGM Studios’ “Masters of the Universe” underwhelmed in theaters, failing to recoup its $170 million budget, but it’s been far from a disappointment on Prime Video, where it’s had the No. 1 spot on lockdown for more than a week. He-Man fans didn’t turn out in large numbers when it was in cinemas, but they’re paying attention on streaming. The fantasy blockbuster also holds a strong 86% viewer score on <a href="https://www.rottentomatoes.com/m/masters_of_the_universe_2026" target="_blank">Rotten Tomatoes</a>.</p><p>Based on the beloved Mattel toy range, which was originally created to compete with a rival’s lineup of popular “Star Wars” action figures, “Masters of the Universe” follows Prince Adam (Nicholas Galitzine), who is sent to Earth as a child when his home of Eternia is conquered by the ruthless Skeletor (Jared Leto). Years later, now a fully grown adult, he must return to the fantasy land to fulfil his destiny and save his people from his nemesis.  </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0GZHLSV86" target="_blank" rel="nofollow"><em><strong>"Masters of the Universe on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="project-hail-mary-2026">‘Project Hail Mary’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/m08TxIsFTRI" allowfullscreen></iframe></div></div><p>I’ve recommended “Project Hail Mary” dozens of times already this year, and I’m not stopping now. Put simply, this is one of the year’s most entertaining blockbusters, with plenty of heart and exciting moments. It’s adapted from Andy Weir’s novel and stars Ryan Gosling as an astronaut on a critical mission. But while Gosling is fantastic, the real star of the show is an alien creature named Rocky, brought to life by some phenomenal puppetry. </p><p>In “Project Hail Mary,” astronaut Ryland Grace (Gosling) awakes on an interstellar craft, millions of miles away from Earth. The problem is he can’t remember his mission, or even his own name. Piecing together his past, Grace must find a way to prevent Earth’s sun from dying, but fortunately, he’s got some help from a lovable alien, Rocky. “Project Hail Mary” is the complete sci-fi package; it’s funny, thrilling and packed with memorable moments.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GHXVBQLM" target="_blank" rel="nofollow"><em><strong>"Project Hail Mary" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OLKpkW"></div>                            </div>                            <script src="https://kwizly.com/embed/OLKpkW.js" async></script><h2 id="the-gates-2026">‘The Gates’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/rooCFaczeXQ" allowfullscreen></iframe></div></div><p>Similar to "Masters of the Universe," "The Gates" is a movie that didn't receive much attention on the big screen, but is getting a second win via Prime Video. This dark thriller marks the final movie appearance of James Van Der Beek, who passed away in February. While the reviews were lukewarm, Van Der Beek's villainous performance was highlighted as one of the movie's biggest strengths. I'm glad to see his final film role celebrated.</p><p>“The Gate” sees a trio of college friends (Mason Gooding, Algee Smith and Keith Powers) enjoying a road trip when they make what proves to be a potentially fatal mistake by taking a shortcut through a remote gated community. They witness a ritualistic murder and are then trapped within the community's walls. Hunted by the local residents who plan to frame them for the murder, the trio endures a desperate battle for survival.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0GKQ3G3BL" target="_blank" rel="nofollow"><em><strong>"The Gates" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"Masters of the Universe" (2026)</li><li>"The Amateur" (2025)</li><li>"Badh" (2025)</li><li>"Project Hail Mary" (2026)</li><li>"S4: The Bob Lazar Story' (2026)</li><li>"The Devil's Mouth" (2026)</li><li>"The Gate" (2026)</li><li>"Wrong Turn" (2021)</li><li>"Uncharted" (2022)</li><li>"Primate" (2026)</li></ol><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">New on Prime Video in August 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/how-well-do-you-really-know-80s-action-movies-this-quiz-will-put-your-memory-to-the-test-from-terminator-to-die-hard">How well do you really know 80s action movies? Take our quiz</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-new-to-prime-video-movies-in-august-2026-with-90-percent-or-higher-on-rotten-tomatoes">5 new to Prime Video movies with 90% or higher on Rotten Tomatoes</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-here-are-the-3-worth-watching-this-week-august-17-23</link>
                                                                            <description>
                            <![CDATA[ The Prime Video top 10 most-watched movies list has recently been updated, and I've picked out the three that are worth watching now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ugW5aEpCzqewHQqH426Wke</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KFAWy2ARKTf8LL9yy3E8y3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 17 Aug 2026 13:40:01 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/KFAWy2ARKTf8LL9yy3E8y3-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a orange film reel background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a orange film reel background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a orange film reel background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KFAWy2ARKTf8LL9yy3E8y3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you're not sure what to watch on Prime Video this week, you might turn to the streaming service's top 10 most-watched list for some guidance. After all, this rotating ranking gives you a quick look at the movies dominating the platform right now. However, it's no perfect recommendation tool. </p><p>Take it from me, somebody who tracks the Prime Video top 10 daily: Just because a movie ranks on the list doesn't necessarily mean it's a quality watch. But that's why I've combed through the current top 10 (as of Monday, August 17) and picked out a trio of movies worthy of your time.</p><h3 class="article-body__section" id="section-best-movies-in-the-prime-video-top-10"><span>Best movies in the Prime Video top 10</span></h3><h2 id="masters-of-the-universe-2026">‘Masters of the Universe' (2026)</h2><div 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>Amazon MGM Studios’ “Masters of the Universe” underwhelmed in theaters, failing to recoup its $170 million budget, but it’s been far from a disappointment on Prime Video, where it’s had the No. 1 spot on lockdown for more than a week. He-Man fans didn’t turn out in large numbers when it was in cinemas, but they’re paying attention on streaming. The fantasy blockbuster also holds a strong 86% viewer score on <a href="https://www.rottentomatoes.com/m/masters_of_the_universe_2026" target="_blank">Rotten Tomatoes</a>.</p><p>Based on the beloved Mattel toy range, which was originally created to compete with a rival’s lineup of popular “Star Wars” action figures, “Masters of the Universe” follows Prince Adam (Nicholas Galitzine), who is sent to Earth as a child when his home of Eternia is conquered by the ruthless Skeletor (Jared Leto). Years later, now a fully grown adult, he must return to the fantasy land to fulfil his destiny and save his people from his nemesis.  </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0GZHLSV86" target="_blank" rel="nofollow"><em><strong>"Masters of the Universe on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="project-hail-mary-2026">‘Project Hail Mary’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/m08TxIsFTRI" allowfullscreen></iframe></div></div><p>I’ve recommended “Project Hail Mary” dozens of times already this year, and I’m not stopping now. Put simply, this is one of the year’s most entertaining blockbusters, with plenty of heart and exciting moments. It’s adapted from Andy Weir’s novel and stars Ryan Gosling as an astronaut on a critical mission. But while Gosling is fantastic, the real star of the show is an alien creature named Rocky, brought to life by some phenomenal puppetry. </p><p>In “Project Hail Mary,” astronaut Ryland Grace (Gosling) awakes on an interstellar craft, millions of miles away from Earth. The problem is he can’t remember his mission, or even his own name. Piecing together his past, Grace must find a way to prevent Earth’s sun from dying, but fortunately, he’s got some help from a lovable alien, Rocky. “Project Hail Mary” is the complete sci-fi package; it’s funny, thrilling and packed with memorable moments.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GHXVBQLM" target="_blank" rel="nofollow"><em><strong>"Project Hail Mary" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OLKpkW"></div>                            </div>                            <script src="https://kwizly.com/embed/OLKpkW.js" async></script><h2 id="the-gates-2026">‘The Gates’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/rooCFaczeXQ" allowfullscreen></iframe></div></div><p>Similar to "Masters of the Universe," "The Gates" is a movie that didn't receive much attention on the big screen, but is getting a second win via Prime Video. This dark thriller marks the final movie appearance of James Van Der Beek, who passed away in February. While the reviews were lukewarm, Van Der Beek's villainous performance was highlighted as one of the movie's biggest strengths. I'm glad to see his final film role celebrated.</p><p>“The Gate” sees a trio of college friends (Mason Gooding, Algee Smith and Keith Powers) enjoying a road trip when they make what proves to be a potentially fatal mistake by taking a shortcut through a remote gated community. They witness a ritualistic murder and are then trapped within the community's walls. Hunted by the local residents who plan to frame them for the murder, the trio endures a desperate battle for survival.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0GKQ3G3BL" target="_blank" rel="nofollow"><em><strong>"The Gates" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"Masters of the Universe" (2026)</li><li>"The Amateur" (2025)</li><li>"Badh" (2025)</li><li>"Project Hail Mary" (2026)</li><li>"S4: The Bob Lazar Story' (2026)</li><li>"The Devil's Mouth" (2026)</li><li>"The Gate" (2026)</li><li>"Wrong Turn" (2021)</li><li>"Uncharted" (2022)</li><li>"Primate" (2026)</li></ol><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">New on Prime Video in August 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/how-well-do-you-really-know-80s-action-movies-this-quiz-will-put-your-memory-to-the-test-from-terminator-to-die-hard">How well do you really know 80s action movies? Take our quiz</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-new-to-prime-video-movies-in-august-2026-with-90-percent-or-higher-on-rotten-tomatoes">5 new to Prime Video movies with 90% or higher on Rotten Tomatoes</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘This feels much more like Amazon forcing the issue on them' — streamer sounds the alarm on Amazon using Twitch’s content to train its AI models ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Twitch’s community of streamers was none too pleased with the popular streaming service when it was revealed that it allowed their content to be used to train Amazon's AI models. </p><p>And what made that shocking bit of news even more upsetting was the fact that those same users were automatically opted into that practice and have unknowingly been a part of that process for years now. It seems like the growing discontent towards this decision forced Twitch to add an option for content creators to opt out of having their channel used as a training tool for Amazon’s generative AI.</p><p>Twitch’s <a href="https://help.twitch.tv/s/article/twitch-account-settings?language=en_US#FAQ" target="_blank">FAQ page</a> makes it clear that opting out means “streams, VODs, clips, stream chats, and pictures and text on your channel will not be used in future training of a model developed by Amazon whose purpose is to generate or synthesize text, audio, images, or video. And we’re sure the streaming service’s massive streamer community is flocking to this official Twitch <a href="http://twitch.tv/settings/security" target="_blank">settings page</a> to make good use of that opt-out option.</p><p>We reached out to <a href="https://www.twitch.tv/zachbussey" target="_blank">Zach Bussey</a>, TOS.gg a Twitch streamer who covers the streaming industry through his <a href="https://tos.gg/" target="_blank">weekly creator newsletter</a>, to get his thoughts on this surprising development.</p><h2 id="a-decision-that-may-be-out-of-twitch-s-hands">A decision that may be out of Twitch’s hands</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4096px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L96q9fjkYGgxgU9weaWCnG" name="shutterstock_2486109301-2" alt="twitch" src="https://cdn.mos.cms.futurecdn.net/L96q9fjkYGgxgU9weaWCnG.jpg" mos="" align="middle" fullscreen="" width="4096" height="2304" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>When asked about Twitch’s decision to let its content be used to train Amazon’s AI models, Bussey stated that he thinks Amazon made that decision for them.</p><p>“Twitch's decision here isn't really one I think they are making. Instead, this feels much more like Amazon forcing the issue on them,” he noted. “The CPO, Mikey Minty, pretty clearly expressed that without overtly saying it on a stream an hour ago. The problem for Twitch is they have never been profitable and are at the whims of Amazon if they want to continue to be a platform. So it feels like they may have been able to negotiate that Opt-out option, but there was never really a choice about whether it would be implemented.”</p><p>As for the broader trend of tech companies using user-generated content to improve AI models, here’s what else Bussey had to say:</p><p>“The broader trend isn't great for creators, nor is it good for platforms, largely because AI perpetually, at best, makes slop consumable content. There's nothing great about it; it's just stuck in the middle as being, at best, average. Platforms have historically benefitted from startup creators who eventually became great creators. But the process to go from just getting started to being great takes time, effort, and a lot of learning. If they get flooded in the middle of their creator career by all the slop AI content, they'll never be able to achieve greatness. Effectively, we're diluting all these platforms and leaving them stuck in mediocrity. Do you really want to spend your time consuming things when everything is 'okay enough'?”</p><p>Bussey recognizes Twitch’s AI training method as the norm for similar creator platforms. And what’s most interesting is that he says users on those platforms may not even be aware that it’s happening to them yet. “Unfortunately, it likely is the norm across creator platforms, whether we know it or not: maybe first-party or a third party taking the data,” he pointed out. “It's why I think it's incredibly important to have transparency and advocate for better regulation. At the very least, platforms should offer to pay creators for their data when they give creators the option to train on their content.”</p><h2 id="bottom-line">Bottom line</h2><p>Bussey left us with this comment as to what AI as a whole could mean for streamers and their profession going forward: </p><p>“For streamers, I don't think that AI is going to replace them if that's the question. In fact, I'd wager that live streaming will be the last holdout in the content creation space. In a world where you won't be able to trust that what you see in a YouTube video, a TikTok, or a Twitter post is real...a lot more people will be seeking out live content for the last reliable digital human experience.”</p><p>You can watch this <a href="https://www.twitch.tv/zachbussey/clip/BlitheUnsightlyMonitorKappaWealth--edSXXVMPiaFzhe-?range=7d">clip</a> from Bussey’s Twitch channel to hear him provide more insight on the matter.</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/openai-is-testing-a-pay-to-reset-limits-feature-heres-what-it-could-mean-for-your-chatgpt-usage-quota" target="_blank">OpenAI is testing a pay-to-reset limits feature — here’s what it could mean for your ChatGPT usage quota</a></li><li><a href="https://www.tomsguide.com/ai/raising-the-standard-inside-talkspaces-bold-new-ai-mental-health-support-tool" target="_blank">'Raising the standard': Inside Talkspace's bold new AI mental health support tool</a></li><li><a href="https://www.tomsguide.com/ai/google-health-gets-a-lot-of-hate-but-these-5-ai-coach-prompts-changed-my-mind" target="_blank">Google Health gets a lot of hate — but these 5 AI Coach prompts changed my mind</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/this-feels-much-more-like-amazon-forcing-the-issue-on-them-streamer-sounds-the-alarm-on-amazon-using-twitchs-content-to-train-its-ai-models</link>
                                                                            <description>
                            <![CDATA[ With such a major backlash against the reveal of Twitch allowing its users’ content to train Amazon’s AI models, one streamer we spoke to gave his opinion on the matter. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gXBnVVxQfhiWbB3urkdGo5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HkXoxmEQ5Fr2oNbaohftF8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Aug 2026 17:33:43 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HkXoxmEQ5Fr2oNbaohftF8-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[twitch]]></media:description>                                                            <media:text><![CDATA[twitch]]></media:text>
                                <media:title type="plain"><![CDATA[twitch]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HkXoxmEQ5Fr2oNbaohftF8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Twitch’s community of streamers was none too pleased with the popular streaming service when it was revealed that it allowed their content to be used to train Amazon's AI models. </p><p>And what made that shocking bit of news even more upsetting was the fact that those same users were automatically opted into that practice and have unknowingly been a part of that process for years now. It seems like the growing discontent towards this decision forced Twitch to add an option for content creators to opt out of having their channel used as a training tool for Amazon’s generative AI.</p><p>Twitch’s <a href="https://help.twitch.tv/s/article/twitch-account-settings?language=en_US#FAQ" target="_blank">FAQ page</a> makes it clear that opting out means “streams, VODs, clips, stream chats, and pictures and text on your channel will not be used in future training of a model developed by Amazon whose purpose is to generate or synthesize text, audio, images, or video. And we’re sure the streaming service’s massive streamer community is flocking to this official Twitch <a href="http://twitch.tv/settings/security" target="_blank">settings page</a> to make good use of that opt-out option.</p><p>We reached out to <a href="https://www.twitch.tv/zachbussey" target="_blank">Zach Bussey</a>, TOS.gg a Twitch streamer who covers the streaming industry through his <a href="https://tos.gg/" target="_blank">weekly creator newsletter</a>, to get his thoughts on this surprising development.</p><h2 id="a-decision-that-may-be-out-of-twitch-s-hands">A decision that may be out of Twitch’s hands</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4096px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L96q9fjkYGgxgU9weaWCnG" name="shutterstock_2486109301-2" alt="twitch" src="https://cdn.mos.cms.futurecdn.net/L96q9fjkYGgxgU9weaWCnG.jpg" mos="" align="middle" fullscreen="" width="4096" height="2304" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>When asked about Twitch’s decision to let its content be used to train Amazon’s AI models, Bussey stated that he thinks Amazon made that decision for them.</p><p>“Twitch's decision here isn't really one I think they are making. Instead, this feels much more like Amazon forcing the issue on them,” he noted. “The CPO, Mikey Minty, pretty clearly expressed that without overtly saying it on a stream an hour ago. The problem for Twitch is they have never been profitable and are at the whims of Amazon if they want to continue to be a platform. So it feels like they may have been able to negotiate that Opt-out option, but there was never really a choice about whether it would be implemented.”</p><p>As for the broader trend of tech companies using user-generated content to improve AI models, here’s what else Bussey had to say:</p><p>“The broader trend isn't great for creators, nor is it good for platforms, largely because AI perpetually, at best, makes slop consumable content. There's nothing great about it; it's just stuck in the middle as being, at best, average. Platforms have historically benefitted from startup creators who eventually became great creators. But the process to go from just getting started to being great takes time, effort, and a lot of learning. If they get flooded in the middle of their creator career by all the slop AI content, they'll never be able to achieve greatness. Effectively, we're diluting all these platforms and leaving them stuck in mediocrity. Do you really want to spend your time consuming things when everything is 'okay enough'?”</p><p>Bussey recognizes Twitch’s AI training method as the norm for similar creator platforms. And what’s most interesting is that he says users on those platforms may not even be aware that it’s happening to them yet. “Unfortunately, it likely is the norm across creator platforms, whether we know it or not: maybe first-party or a third party taking the data,” he pointed out. “It's why I think it's incredibly important to have transparency and advocate for better regulation. At the very least, platforms should offer to pay creators for their data when they give creators the option to train on their content.”</p><h2 id="bottom-line">Bottom line</h2><p>Bussey left us with this comment as to what AI as a whole could mean for streamers and their profession going forward: </p><p>“For streamers, I don't think that AI is going to replace them if that's the question. In fact, I'd wager that live streaming will be the last holdout in the content creation space. In a world where you won't be able to trust that what you see in a YouTube video, a TikTok, or a Twitter post is real...a lot more people will be seeking out live content for the last reliable digital human experience.”</p><p>You can watch this <a href="https://www.twitch.tv/zachbussey/clip/BlitheUnsightlyMonitorKappaWealth--edSXXVMPiaFzhe-?range=7d">clip</a> from Bussey’s Twitch channel to hear him provide more insight on the matter.</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/openai-is-testing-a-pay-to-reset-limits-feature-heres-what-it-could-mean-for-your-chatgpt-usage-quota" target="_blank">OpenAI is testing a pay-to-reset limits feature — here’s what it could mean for your ChatGPT usage quota</a></li><li><a href="https://www.tomsguide.com/ai/raising-the-standard-inside-talkspaces-bold-new-ai-mental-health-support-tool" target="_blank">'Raising the standard': Inside Talkspace's bold new AI mental health support tool</a></li><li><a href="https://www.tomsguide.com/ai/google-health-gets-a-lot-of-hate-but-these-5-ai-coach-prompts-changed-my-mind" target="_blank">Google Health gets a lot of hate — but these 5 AI Coach prompts changed my mind</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Prime Video top 10 movies — here are the 3 worth watching this week (Aug. 10-16) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Prime Video’s movie library can be pretty overwhelming, which makes the platform’s top 10 most-watched list a useful tool for getting a quick rundown of the films proving the most popular on the platform right now. But just because a movie ranks high doesn’t guarantee it’s worth your time; quite the opposite. I’ve seen many subpar flicks get into the top 10.</p><p>That’s why I’ve combed through the current Prime Video top 10 (as of Monday, August 10) and picked out a trio of movies that I believe deserve your attention. This week my picks range from a slick spy thriller to a dazzling sci-fi blockbuster to a chilling horror about a family pet turned feral. These are the best movies in today’s Prime Video top 10 ranking.</p><h3 class="article-body__section" id="section-best-movies-in-the-prime-video-top-10"><span>Best movies in the Prime Video top 10</span></h3><h2 id="the-amateur-2025">‘The Amateur’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DCWcK4c-F8Q" allowfullscreen></iframe></div></div><p>I’m happy to see “The Amateur” sticking around the Prime Video top 10. This spy thriller starring Oscar winner Rami Malek is based on the 1981 novel by Robert Littell and was one of last year’s slightly underappreciated gems in theaters. It’s great to see it getting a second wind via Amazon’s streaming service. If you like the “Bourne” movies, you need to watch it.</p><p>Malek plays a CIA analyst whose world is shattered when his wife is killed in a terrorist attack. Using his skills, he identifies those responsible for his wife's murder and blackmails his superiors into giving him a license to hunt them down and get revenge. A novice in the field, Charlie (Malek) is shown the ropes by a gruff mentor, Hendo (Laurence Fishburne). However, even with some training, he’s still a fish out of water. Quickly realizing he can’t outshoot his enemies, he outthinks them using his superior intellect.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0D4885S88" target="_blank" rel="nofollow"><em><strong>"The Amateur" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxxBO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxxBO.js" async></script><h2 id="project-hail-mary-2026-2">‘Project Hail Mary’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/m08TxIsFTRI" allowfullscreen></iframe></div></div><p>“Project Hail Mary” is one of the year’s most entertaining blockbusters, and even if it was clearly made to be enjoyed on the big screen, it’s still a worthwhile watch at home. Adapted from Andy Weir’s novel of the same name, it stars Ryan Gosling, and while the “La La Land” star is excellent as the protagonist, Ryland Grace, he’s totally upstaged by an extraterrestrial nicknamed Rocky, who is brought to life using some incredible puppetry.</p><p>Smartly using a non-linear structure that leaps between the present day and flashbacks, “Project Hail Mary” is the story of Ryland Grace (Gosling), an astronaut on a mission that is vital to humanity’s survival. There’s just the slight problem that he awakens on an interstellar craft without any memories of his mission or even his own name. Piecing together his past, Grace must find a way to prevent the sun from dying, with a little help. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GHXVBQLM" target="_blank" rel="nofollow"><em><strong>"Project Hail Mary" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="primate-2026">‘Primate’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wo87F-va410" allowfullscreen></iframe></div></div><p>“Primate” is a chilling horror-thriller about a family pet that goes from furry family member to a feral beast. It’s not the first movie of its ilk to use this core concept; Stephen King’s “Cujo” was unleashed on the screen back in 1983, but, running a tight 90 minutes, this chiller is effectively paced and concludes before the story's limitations are exposed. It’s a bloody creature feature that is a worthwhile watch for horror fans now it’s on Prime Video. </p><p>Lucy Pinborough (Johnny Sequoyah) returns to her family home in Hawai’i after several years away. Reunited with her father (Oscar-winning Troy Kotsur) and younger sister Erin (Gia Hunter), the homecoming quickly turns to a nightmare when the family’s pet chimpanzee, Ben, becomes violent after being infected with rabies. Now it’s a battle for survival against an aggressive animal that Lucy and Erin once considered part of the family.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G7643HC3" target="_blank" rel="nofollow"><em><strong>"Primate" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"Masters of the Universe" (2026)</li><li>"The Amateur" (2025)</li><li>"Project Hail Mary" (2026)</li><li>"The Devil's Mouth" (2026)</li><li>"Moonfall" (2022)</li><li>"Primate" (2026)</li><li>"Uncharted" (2022)</li><li>"Agent Zero" (2026)</li><li>"Do Not Enter" (2026)</li><li>"The Sheep Detectives" (2026)</li></ol><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">New on Prime Video in August 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/classic-movie-lovers-take-our-quiz-to-see-how-much-you-really-know-from-indiana-jones-to-star-wars">Take our classic movie quiz to see how much you really know</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-new-to-prime-video-movies-in-august-2026-with-90-percent-or-higher-on-rotten-tomatoes">5 new to Prime Video movies with 90% or higher on Rotten Tomatoes</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-here-are-the-3-worth-watching-this-week-aug-10-16</link>
                                                                            <description>
                            <![CDATA[ The Prime Video top 10 most-watched list has been updated for the week ahead, and I'm picking out the best entries in today's ranking. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">A2mi9oq2HVJvXpts2KgCRa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jkNJbHLaY7hb8gngkjaw9B-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 10 Aug 2026 11:55:44 +0000</pubDate>                                                                                                                                <updated>Mon, 10 Aug 2026 12:56:47 +0000</updated>
                                                                                                                                            <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/jkNJbHLaY7hb8gngkjaw9B-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on yellow blue background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on yellow blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on yellow blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jkNJbHLaY7hb8gngkjaw9B-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Video’s movie library can be pretty overwhelming, which makes the platform’s top 10 most-watched list a useful tool for getting a quick rundown of the films proving the most popular on the platform right now. But just because a movie ranks high doesn’t guarantee it’s worth your time; quite the opposite. I’ve seen many subpar flicks get into the top 10.</p><p>That’s why I’ve combed through the current Prime Video top 10 (as of Monday, August 10) and picked out a trio of movies that I believe deserve your attention. This week my picks range from a slick spy thriller to a dazzling sci-fi blockbuster to a chilling horror about a family pet turned feral. These are the best movies in today’s Prime Video top 10 ranking.</p><h3 class="article-body__section" id="section-best-movies-in-the-prime-video-top-10"><span>Best movies in the Prime Video top 10</span></h3><h2 id="the-amateur-2025">‘The Amateur’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DCWcK4c-F8Q" allowfullscreen></iframe></div></div><p>I’m happy to see “The Amateur” sticking around the Prime Video top 10. This spy thriller starring Oscar winner Rami Malek is based on the 1981 novel by Robert Littell and was one of last year’s slightly underappreciated gems in theaters. It’s great to see it getting a second wind via Amazon’s streaming service. If you like the “Bourne” movies, you need to watch it.</p><p>Malek plays a CIA analyst whose world is shattered when his wife is killed in a terrorist attack. Using his skills, he identifies those responsible for his wife's murder and blackmails his superiors into giving him a license to hunt them down and get revenge. A novice in the field, Charlie (Malek) is shown the ropes by a gruff mentor, Hendo (Laurence Fishburne). However, even with some training, he’s still a fish out of water. Quickly realizing he can’t outshoot his enemies, he outthinks them using his superior intellect.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0D4885S88" target="_blank" rel="nofollow"><em><strong>"The Amateur" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxxBO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxxBO.js" async></script><h2 id="project-hail-mary-2026-2">‘Project Hail Mary’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/m08TxIsFTRI" allowfullscreen></iframe></div></div><p>“Project Hail Mary” is one of the year’s most entertaining blockbusters, and even if it was clearly made to be enjoyed on the big screen, it’s still a worthwhile watch at home. Adapted from Andy Weir’s novel of the same name, it stars Ryan Gosling, and while the “La La Land” star is excellent as the protagonist, Ryland Grace, he’s totally upstaged by an extraterrestrial nicknamed Rocky, who is brought to life using some incredible puppetry.</p><p>Smartly using a non-linear structure that leaps between the present day and flashbacks, “Project Hail Mary” is the story of Ryland Grace (Gosling), an astronaut on a mission that is vital to humanity’s survival. There’s just the slight problem that he awakens on an interstellar craft without any memories of his mission or even his own name. Piecing together his past, Grace must find a way to prevent the sun from dying, with a little help. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GHXVBQLM" target="_blank" rel="nofollow"><em><strong>"Project Hail Mary" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="primate-2026">‘Primate’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wo87F-va410" allowfullscreen></iframe></div></div><p>“Primate” is a chilling horror-thriller about a family pet that goes from furry family member to a feral beast. It’s not the first movie of its ilk to use this core concept; Stephen King’s “Cujo” was unleashed on the screen back in 1983, but, running a tight 90 minutes, this chiller is effectively paced and concludes before the story's limitations are exposed. It’s a bloody creature feature that is a worthwhile watch for horror fans now it’s on Prime Video. </p><p>Lucy Pinborough (Johnny Sequoyah) returns to her family home in Hawai’i after several years away. Reunited with her father (Oscar-winning Troy Kotsur) and younger sister Erin (Gia Hunter), the homecoming quickly turns to a nightmare when the family’s pet chimpanzee, Ben, becomes violent after being infected with rabies. Now it’s a battle for survival against an aggressive animal that Lucy and Erin once considered part of the family.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G7643HC3" target="_blank" rel="nofollow"><em><strong>"Primate" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"Masters of the Universe" (2026)</li><li>"The Amateur" (2025)</li><li>"Project Hail Mary" (2026)</li><li>"The Devil's Mouth" (2026)</li><li>"Moonfall" (2022)</li><li>"Primate" (2026)</li><li>"Uncharted" (2022)</li><li>"Agent Zero" (2026)</li><li>"Do Not Enter" (2026)</li><li>"The Sheep Detectives" (2026)</li></ol><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">New on Prime Video in August 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/classic-movie-lovers-take-our-quiz-to-see-how-much-you-really-know-from-indiana-jones-to-star-wars">Take our classic movie quiz to see how much you really know</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-new-to-prime-video-movies-in-august-2026-with-90-percent-or-higher-on-rotten-tomatoes">5 new to Prime Video movies with 90% or higher on Rotten Tomatoes</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I gave ChatGPT, Gemini, and Alexa the same school supply list — one cost 3X as much ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When I was a kid, <a href="https://www.tomsguide.com/sales-events/best-back-to-school-sales-2024">back-to-school shopping</a> was my favorite. But as a mom with three kids and three different lists — kindergarten, fourth grade and sixth grade — going to the store to get everything is daunting. Plus, shopping with three kids in tow means there will be inevitable meltdowns over extras and nice-to-haves. <br><br>That's why this year, I decided to lean on three AI assistants to do the job for me. I gave ChatGPT, Gemini and<a href="https://www.tomsguide.com/ai/ive-been-using-alexa-for-3-months-here-are-my-5-favorite-features-and-one-im-not-a-fan-of"> Alexa+</a> the exact same school supply list and asked each one to shop for me. My instructions were simple: follow the teacher's list, stick to the required quantities, choose reasonably priced products and skip anything marked optional.</p><p>The results weren't even close.</p><h2 id="chatgpt-was-the-most-accurate">ChatGPT was the most accurate </h2><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="cFWuhuePMHeUVnidAKHtfJ" name="ChatGPT walmart" alt="Walmart haul" src="https://cdn.mos.cms.futurecdn.net/cFWuhuePMHeUVnidAKHtfJ.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>Once I uploaded the list, ChatGPT asked me to log into my Walmart account so it could do the shopping for me. I sat and watched as it took charge. <br><br>It followed the required brands and quantities, chose reasonably priced products and skipped every optional item exactly as I requested. Where the list allowed flexibility, it selected neutral colors instead of stopping to ask me to make decisions.</p><p>The tradeoff was speed. ChatGPT took the longest to finish, but it spent that time checking the list carefully rather than rushing through it. The total came to<strong> $92.55</strong> for my daughter's fourth grade school supplies. That seemed like a lot for just one kid. </p><h2 id="gemini-was-careful-but-slightly-more-thoughtful">Gemini was careful, but slightly more thoughtful</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/pCYKx5U9H2QcQBHdHVPjD4.jpg" alt="Gemini school shopping" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GNBwFQm56RZz2tYn8CrsL.jpg" alt="Gemini school shopping" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>After uploading the school supply list, Gemini created my cart through Instacart. Once I logged into the Instacart app, Gemini took control. </p><p>Like ChatGPT, it avoided buying optional supplies. It also paused several times to ask me to approve colors for certain products instead of making the decision itself. This is something ChatGPT didn't do. I wasn't picky about colors, but it was a nice option as I know some kids are very particular. As a family that went through an entire year of "yellow" with my youngest, I get it. </p><p>That approach may appeal to shoppers who want more control, but it also meant the experience required more back-and-forth. ultimately bringing the total to about <strong>$60-$90</strong>. It would have been $105 with the optional water bottle. </p><p>I was really surprised how low the price was, especially compared to Walmart. Gemini seemed to do a better job scanning the entire internet for the best deals from Instacart. Those unexpected results were interesting to see.  </p><h2 id="alexa-was-lightning-fast-but-incredibly-expensive">Alexa was lightning fast — but incredibly expensive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="p2yPvdQptcZzfjkRLzdJKW" name="8 - 2026-08-07T171845.896" alt="Alexa" src="https://cdn.mos.cms.futurecdn.net/p2yPvdQptcZzfjkRLzdJKW.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>We are very much an <a href="https://www.tomsguide.com/ai/i-put-alexa-to-the-test-with-my-chaotic-family-heres-5-things-i-liked-and-2-that-could-use-work">Alexa+ family</a>. I figured, why not use Alexa+ to shop for all our back-to-school needs. And while Alexa+ made the shopping experience a breeze, that convenience came with a hefty price tag.</p><p>Alexa built a cart totaling <strong>$251.48 </strong>— nearly three times what ChatGPT and Gemini found — and that was for just one kid! I'm going to have to get an <a href="https://www.tomsguide.com/ai/i-used-chatgpt-to-start-a-side-hustle-heres-the-hard-truth">extra side hustle at that rate</a>. </p><p>Unlike the other assistants, Alexa added <em>everything</em> it found, including optional items like headphones and a computer mouse that I had specifically asked it to skip. It also asked me to approve colors for several products instead of making those choices automatically.</p><p>If my goal had simply been to get everything into an Amazon cart as quickly as possible, Alexa succeeded. But if I had clicked "Buy Now" without checking the order, I would have spent well over $150 more than necessary. To be honest, I really wanted Alexa+ to win because shopping on Amazon is just so easy, but it was definitely a wake-up call. </p><h2 id="overall-winner-gemini">Overall winner: Gemini</h2><p>For this test, Gemini was the clear winner. It was more hands-on than ChatGPT and slower than Alexa, but the least expensive. It understood the assignment, followed the school supply list most closely, skipped optional purchases, but gave me the total with them in case I wanted to add them at the end. It also delivered the lowest total by a comfortable margin and was ready to deliver them. </p><p>The biggest takeaway was that AI shopping assistants are getting remarkably good, but they aren't interchangeable. The service they're connected to matters just as much as the AI itself. In this case, Gemini paired with Instacart proved to be the smartest — and cheapest — way to tackle my kids' back-to-school shopping.</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/the-smartest-ai-trick-isnt-a-prompt-its-your-google-drive">The smartest AI trick isn't a prompt — it's your Google Drive</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/i-found-a-secret-menu-of-chatgpt-features-here-are-my-9-favorites">I found ChatGPT's secret menu — these 9 features change everything</a></li><li><a href="https://www.tomsguide.com/ai/claude-has-4-built-in-skills-i-use-constantly-heres-how-to-find-them">Claude has 4 built-in skills I use constantly — here’s how to find them</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-let-chatgpt-gemini-and-alexa-shop-my-kids-back-to-school-supplies-only-one-got-it-right</link>
                                                                            <description>
                            <![CDATA[ I asked ChatGPT, Gemini and Alexa to shop my kids' school supply lists. One AI found the best deals, while another nearly tripled my total. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TAdH2SCkATi9Hh7jR2svCE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/spWVVZu9iMtEswcy4ZcQkf-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Sat, 08 Aug 2026 05:00:00 +0000</pubDate>                                                                                                                                <updated>Sat, 08 Aug 2026 12:47:34 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/spWVVZu9iMtEswcy4ZcQkf-1280-80.png">
                                                            <media:credit><![CDATA[Future/Gemini edit]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[back to school assistants]]></media:description>                                                            <media:text><![CDATA[back to school assistants]]></media:text>
                                <media:title type="plain"><![CDATA[back to school assistants]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/spWVVZu9iMtEswcy4ZcQkf-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When I was a kid, <a href="https://www.tomsguide.com/sales-events/best-back-to-school-sales-2024">back-to-school shopping</a> was my favorite. But as a mom with three kids and three different lists — kindergarten, fourth grade and sixth grade — going to the store to get everything is daunting. Plus, shopping with three kids in tow means there will be inevitable meltdowns over extras and nice-to-haves. <br><br>That's why this year, I decided to lean on three AI assistants to do the job for me. I gave ChatGPT, Gemini and<a href="https://www.tomsguide.com/ai/ive-been-using-alexa-for-3-months-here-are-my-5-favorite-features-and-one-im-not-a-fan-of"> Alexa+</a> the exact same school supply list and asked each one to shop for me. My instructions were simple: follow the teacher's list, stick to the required quantities, choose reasonably priced products and skip anything marked optional.</p><p>The results weren't even close.</p><h2 id="chatgpt-was-the-most-accurate">ChatGPT was the most accurate </h2><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="cFWuhuePMHeUVnidAKHtfJ" name="ChatGPT walmart" alt="Walmart haul" src="https://cdn.mos.cms.futurecdn.net/cFWuhuePMHeUVnidAKHtfJ.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>Once I uploaded the list, ChatGPT asked me to log into my Walmart account so it could do the shopping for me. I sat and watched as it took charge. <br><br>It followed the required brands and quantities, chose reasonably priced products and skipped every optional item exactly as I requested. Where the list allowed flexibility, it selected neutral colors instead of stopping to ask me to make decisions.</p><p>The tradeoff was speed. ChatGPT took the longest to finish, but it spent that time checking the list carefully rather than rushing through it. The total came to<strong> $92.55</strong> for my daughter's fourth grade school supplies. That seemed like a lot for just one kid. </p><h2 id="gemini-was-careful-but-slightly-more-thoughtful">Gemini was careful, but slightly more thoughtful</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/pCYKx5U9H2QcQBHdHVPjD4.jpg" alt="Gemini school shopping" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GNBwFQm56RZz2tYn8CrsL.jpg" alt="Gemini school shopping" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>After uploading the school supply list, Gemini created my cart through Instacart. Once I logged into the Instacart app, Gemini took control. </p><p>Like ChatGPT, it avoided buying optional supplies. It also paused several times to ask me to approve colors for certain products instead of making the decision itself. This is something ChatGPT didn't do. I wasn't picky about colors, but it was a nice option as I know some kids are very particular. As a family that went through an entire year of "yellow" with my youngest, I get it. </p><p>That approach may appeal to shoppers who want more control, but it also meant the experience required more back-and-forth. ultimately bringing the total to about <strong>$60-$90</strong>. It would have been $105 with the optional water bottle. </p><p>I was really surprised how low the price was, especially compared to Walmart. Gemini seemed to do a better job scanning the entire internet for the best deals from Instacart. Those unexpected results were interesting to see.  </p><h2 id="alexa-was-lightning-fast-but-incredibly-expensive">Alexa was lightning fast — but incredibly expensive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="p2yPvdQptcZzfjkRLzdJKW" name="8 - 2026-08-07T171845.896" alt="Alexa" src="https://cdn.mos.cms.futurecdn.net/p2yPvdQptcZzfjkRLzdJKW.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>We are very much an <a href="https://www.tomsguide.com/ai/i-put-alexa-to-the-test-with-my-chaotic-family-heres-5-things-i-liked-and-2-that-could-use-work">Alexa+ family</a>. I figured, why not use Alexa+ to shop for all our back-to-school needs. And while Alexa+ made the shopping experience a breeze, that convenience came with a hefty price tag.</p><p>Alexa built a cart totaling <strong>$251.48 </strong>— nearly three times what ChatGPT and Gemini found — and that was for just one kid! I'm going to have to get an <a href="https://www.tomsguide.com/ai/i-used-chatgpt-to-start-a-side-hustle-heres-the-hard-truth">extra side hustle at that rate</a>. </p><p>Unlike the other assistants, Alexa added <em>everything</em> it found, including optional items like headphones and a computer mouse that I had specifically asked it to skip. It also asked me to approve colors for several products instead of making those choices automatically.</p><p>If my goal had simply been to get everything into an Amazon cart as quickly as possible, Alexa succeeded. But if I had clicked "Buy Now" without checking the order, I would have spent well over $150 more than necessary. To be honest, I really wanted Alexa+ to win because shopping on Amazon is just so easy, but it was definitely a wake-up call. </p><h2 id="overall-winner-gemini">Overall winner: Gemini</h2><p>For this test, Gemini was the clear winner. It was more hands-on than ChatGPT and slower than Alexa, but the least expensive. It understood the assignment, followed the school supply list most closely, skipped optional purchases, but gave me the total with them in case I wanted to add them at the end. It also delivered the lowest total by a comfortable margin and was ready to deliver them. </p><p>The biggest takeaway was that AI shopping assistants are getting remarkably good, but they aren't interchangeable. The service they're connected to matters just as much as the AI itself. In this case, Gemini paired with Instacart proved to be the smartest — and cheapest — way to tackle my kids' back-to-school shopping.</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/the-smartest-ai-trick-isnt-a-prompt-its-your-google-drive">The smartest AI trick isn't a prompt — it's your Google Drive</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/i-found-a-secret-menu-of-chatgpt-features-here-are-my-9-favorites">I found ChatGPT's secret menu — these 9 features change everything</a></li><li><a href="https://www.tomsguide.com/ai/claude-has-4-built-in-skills-i-use-constantly-heres-how-to-find-them">Claude has 4 built-in skills I use constantly — here’s how to find them</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 new to Prime Video thriller movies to watch this week — including a ‘90s crime classic with one of the most shocking twists in film history (August 4-10) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’m combing through the latest movies on Prime Video and picking out a selection of gripping thrillers you should watch this week to add some excitement to your mid-week streaming. </p><p>Prime Video just added more than 50 movies to kick off its <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">August 2026 slate</a>, so there are plenty of options. These include a classic crime thriller with a jaw-dropping twist, a tense spy-thriller based on real history, and a surreal neo-noir mystery from legendary director David Lynch. </p><p>Don’t waste your precious movie-watching time scrolling through all the new arrivals on Prime Video; I’ve already done the legwork for you and picked out a selection of highlights. Here are the best new to Prime Video thriller movies you need to add to your watchlist this week. </p><h3 class="article-body__section" id="section-3-best-new-to-prime-video-thriller-movies-this-week"><span>3 best new to Prime Video thriller movies this week</span></h3><h2 id="the-usual-suspects-1995">‘The Usual Suspects’ (1995)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/x3t0Nc6fg7w" allowfullscreen></iframe></div></div><p>Earlier this year, <a href="https://www.tomsguide.com/entertainment/movies/i-got-2-000-readers-to-pick-the-best-movie-twist-of-all-time-and-this-90s-classic-was-the-clear-winner">I polled more than 2,000 Tom’s Guide readers</a> to determine the best movie twist of all time. While “The Sixth Sense” took home the gold, 1995’s “The Usual Suspects” secured second place with almost 20% of the vote. If you somehow haven’t seen this Bryan Singer crime thriller, and more importantly, don’t know the devilishly brilliant twists, then stop reading this article and watch this genre classic ASAP before you have the shocking reveal ruined.</p><p>This thriller revolves around a single question: Who is Keyser Söze? After a job gone wrong at the San Pedro Harbor, a timid small-time crook, Roger “Verbal” Kint (Kevin Spacey), is taken into police custody for interrogation. Through a series of flashbacks, he explains how the ill-fated heist came to be and, more importantly, how he made contact with the enigmatic crimelord, Keyser Söze. The police hope to identify Söze using Verbal’s testimony, but there is trickery afoot, and the elusive criminal mastermind is already one step ahead of the authorities.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0DPND4ZVW" target="_blank" rel="nofollow"><em><strong>"The Usual Suspects" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O6p3Ae"></div>                            </div>                            <script src="https://kwizly.com/embed/O6p3Ae.js" async></script><h2 id="operation-finale-2018">'Operation Finale' (2018)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/07Y4_6PD0Z4" allowfullscreen></iframe></div></div><p>“Operation Finale” is an intense and powerful spy-thriller rooted in real history. Directed by Chris Weitz, this movie chronicles a 1960s operation to capture an SS officer, Adolf Eichmann (played by Ben Kingsley), and bring him to trial in Jerusalem for his abhorrent crimes during World War II. That mission is easy to get invested in, and while the 2018 movie does run a little long at two hours, it’s still a compelling watch with a strong cast.</p><p>In 1960s Argentina, a group of Israeli agents believes they may have identified German officer Adolf Eichmann, one of the key figures behind Hitler’s “Final Solution.” Determined to bring him to justice at any cost, these Mossad agents must infiltrate his inner circle and then find a way to capture him so they can bring him to justice and face the consequences of his war crimes. Their leader is Peter Malkin (Oscar Isaac), a man deeply haunted by the past.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B07GVQZ9H2" target="_blank" rel="nofollow"><em><strong>"Operation Finale" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="blue-velvet-1986">‘Blue Velvet’ (1986)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/rAA6imfqMYQ" allowfullscreen></iframe></div></div><p>Visionary director David Lynch passed away in January 2025, so why not celebrate a remarkable career by watching one of his most beloved movies, “Blue Velvet.” This influential neo-noir mystery-thriller explores the darker side of suburbia and earned Lynch his second Oscar nomination for Best Director. Curiously, it was very divisive upon release in 1986, but over the decades since, it has been reevaluated by contemporary critics. </p><p>Frequent Lynch collaborator Kyle MacLachlan plays Jeffrey, a college student who returns home to Lumberton, North Carolina, after his father suffers a stroke. Back in the suffocating mundanity of suburban existence, Jeffrey begins to unravel a twisting mystery when he finds a severed human ear near his home; this leads to a fascination with a troubled nightclub singer, Dorothy (Isabella Rossellini), and things get darker (and more disturbing) from there.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0H9ZK3ZKW" target="_blank" rel="nofollow"><em><strong>"Blue Velvet" 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/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch#section-new-movies-on-prime-video-in-august-2026">New on Prime Video in August 2026</a></li><li><a href="https://www.tomsguide.com/news/how-to-get-prime-video-for-free">How to get Prime Video for free</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-5-movies-you-can-stream-for-free-including-a-claustrophobic-sci-fi-thriller-set-in-a-frozen-future">Prime Video just added 5 movies you can stream for free</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-90s-crime-classic-with-one-of-the-most-shocking-twists-in-film-history-august-4-10</link>
                                                                            <description>
                            <![CDATA[ Prime Video just added more than 50 movies to its library, including a trio of intense, twist-fueled thriller flicks worthy of your watchlist. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LBfnuDLSmiVajdUkXoTydS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 04 Aug 2026 11:11:44 +0000</pubDate>                                                                                                                                <updated>Wed, 05 Aug 2026 11:05:54 +0000</updated>
                                                                                                                                            <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo ]]></media:description>                                                            <media:text><![CDATA[Prime Video logo ]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’m combing through the latest movies on Prime Video and picking out a selection of gripping thrillers you should watch this week to add some excitement to your mid-week streaming. </p><p>Prime Video just added more than 50 movies to kick off its <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">August 2026 slate</a>, so there are plenty of options. These include a classic crime thriller with a jaw-dropping twist, a tense spy-thriller based on real history, and a surreal neo-noir mystery from legendary director David Lynch. </p><p>Don’t waste your precious movie-watching time scrolling through all the new arrivals on Prime Video; I’ve already done the legwork for you and picked out a selection of highlights. Here are the best new to Prime Video thriller movies you need to add to your watchlist this week. </p><h3 class="article-body__section" id="section-3-best-new-to-prime-video-thriller-movies-this-week"><span>3 best new to Prime Video thriller movies this week</span></h3><h2 id="the-usual-suspects-1995">‘The Usual Suspects’ (1995)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/x3t0Nc6fg7w" allowfullscreen></iframe></div></div><p>Earlier this year, <a href="https://www.tomsguide.com/entertainment/movies/i-got-2-000-readers-to-pick-the-best-movie-twist-of-all-time-and-this-90s-classic-was-the-clear-winner">I polled more than 2,000 Tom’s Guide readers</a> to determine the best movie twist of all time. While “The Sixth Sense” took home the gold, 1995’s “The Usual Suspects” secured second place with almost 20% of the vote. If you somehow haven’t seen this Bryan Singer crime thriller, and more importantly, don’t know the devilishly brilliant twists, then stop reading this article and watch this genre classic ASAP before you have the shocking reveal ruined.</p><p>This thriller revolves around a single question: Who is Keyser Söze? After a job gone wrong at the San Pedro Harbor, a timid small-time crook, Roger “Verbal” Kint (Kevin Spacey), is taken into police custody for interrogation. Through a series of flashbacks, he explains how the ill-fated heist came to be and, more importantly, how he made contact with the enigmatic crimelord, Keyser Söze. The police hope to identify Söze using Verbal’s testimony, but there is trickery afoot, and the elusive criminal mastermind is already one step ahead of the authorities.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0DPND4ZVW" target="_blank" rel="nofollow"><em><strong>"The Usual Suspects" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O6p3Ae"></div>                            </div>                            <script src="https://kwizly.com/embed/O6p3Ae.js" async></script><h2 id="operation-finale-2018">'Operation Finale' (2018)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/07Y4_6PD0Z4" allowfullscreen></iframe></div></div><p>“Operation Finale” is an intense and powerful spy-thriller rooted in real history. Directed by Chris Weitz, this movie chronicles a 1960s operation to capture an SS officer, Adolf Eichmann (played by Ben Kingsley), and bring him to trial in Jerusalem for his abhorrent crimes during World War II. That mission is easy to get invested in, and while the 2018 movie does run a little long at two hours, it’s still a compelling watch with a strong cast.</p><p>In 1960s Argentina, a group of Israeli agents believes they may have identified German officer Adolf Eichmann, one of the key figures behind Hitler’s “Final Solution.” Determined to bring him to justice at any cost, these Mossad agents must infiltrate his inner circle and then find a way to capture him so they can bring him to justice and face the consequences of his war crimes. Their leader is Peter Malkin (Oscar Isaac), a man deeply haunted by the past.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B07GVQZ9H2" target="_blank" rel="nofollow"><em><strong>"Operation Finale" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="blue-velvet-1986">‘Blue Velvet’ (1986)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/rAA6imfqMYQ" allowfullscreen></iframe></div></div><p>Visionary director David Lynch passed away in January 2025, so why not celebrate a remarkable career by watching one of his most beloved movies, “Blue Velvet.” This influential neo-noir mystery-thriller explores the darker side of suburbia and earned Lynch his second Oscar nomination for Best Director. Curiously, it was very divisive upon release in 1986, but over the decades since, it has been reevaluated by contemporary critics. </p><p>Frequent Lynch collaborator Kyle MacLachlan plays Jeffrey, a college student who returns home to Lumberton, North Carolina, after his father suffers a stroke. Back in the suffocating mundanity of suburban existence, Jeffrey begins to unravel a twisting mystery when he finds a severed human ear near his home; this leads to a fascination with a troubled nightclub singer, Dorothy (Isabella Rossellini), and things get darker (and more disturbing) from there.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0H9ZK3ZKW" target="_blank" rel="nofollow"><em><strong>"Blue Velvet" 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/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch#section-new-movies-on-prime-video-in-august-2026">New on Prime Video in August 2026</a></li><li><a href="https://www.tomsguide.com/news/how-to-get-prime-video-for-free">How to get Prime Video for free</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-5-movies-you-can-stream-for-free-including-a-claustrophobic-sci-fi-thriller-set-in-a-frozen-future">Prime Video just added 5 movies you can stream for free</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Prime Video top 10 movies — here’s the 3 worth watching right now (August 1-2) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It's the start of a new month, and <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> is heating up with great new movies to curl up on the couch in the glorious AC this weekend. <a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-52-new-movies-here-are-the-5-im-streaming-first" target="_blank" rel="nofollow">Prime Video just added over 50 movies</a> in August, but not all of them are worth your precious streaming time. </p><p>To narrow down what to watch next, I make a beeline to the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>'s list of the top 10 most-watched movies. Sure, it cuts through the noise, but how do you separate the movie night hits from the overhyped duds? Because let's be real, just because it's trending doesn't mean it merits a watch. Just look at Prime Video's lukewarm shark thriller at the #1 spot, which has an 18% audience score on Rotten Tomatoes. </p><p>To help you skip the scrolling and get to streaming, I've rounded up the standout picks from Prime Video's current top 10. That includes a slice of fantasy comfort food, a slept-on horror thriller, and Ryan Gosling's crowd-pleasing sci-fi adventure. So without further ado, let's dive into the best movies in Prime Video's top 10 that are worth adding to your watchlist.</p><p><em>This article is based on the global Prime Video top 10 list as of Sunday, August 2, 2026.</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxxBO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxxBO.js" async></script><h3 class="article-body__section" id="section-best-movies-in-the-prime-video-top-10"><span>Best movies in the Prime Video top 10</span></h3><h2 id="project-hail-mary">'Project Hail Mary'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/m08TxIsFTRI" allowfullscreen></iframe></div></div><p>Amaze! Amaze! Amaze! The sci-fi sensation "Project Hail Mary" is just as phenomenal as everyone says. Ryan Gosling is in top form as the charming yet woefully out of his league Ryland Grace, a disgraced scientist now teaching middle school. He, like everyone else, is quietly ignoring the end of the world getting closer now that a star-eating microbe is chowing down on our sun.  </p><p>He wakes up on a spaceship with no memory of his identity or how he got there. As the pieces come together, he realizes he's been roped into a suicide mission to save Earth from annihilation. Thankfully, he's got a buddy to help: Rocky, the lovable alien brought to life through voice and puppetry by James Ortiz. Their friendship becomes the emotional core of the movie, fueling a story packed with heartfelt humor, high-stakes disaster drama, and tense spacewalk sequences that had me watching through my fingers in theaters. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0GHXTWRV2" target="_blank" rel="nofollow"><em><strong>"Project Hail Mary" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="masters-of-the-universe">'Masters of the Universe'</h2><div 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>As far as scraping the bottom of the IP barrel goes, audiences at least seem to get a kick out of this latest unnecessary reboot. It's sitting at an 86% audience score on Rotten Tomatoes, warmer than its middling 67% from critics. I was a '90s kid and never watched He-man or She-ra — well, unless you count ND Stevenson's hella gay reboot — but I'm not above some popcorn fodder full of hunky actors to help a Sunday afternoon along. </p><p>Prince Adam (Nicholas Galitzine) is a young man who grew up on Earth and, after discovering the Sword of Power, learns of his true lineage: He's a prince on the distant planet of Eternia. When he returns, he finds his home has fallen under the control of the ruthless Skeletor (Jared Leto). Joined by allies Teela (Camila Mendes) and Duncan (Idris Elba), Adam sets out to reclaim the throne and harness his powers as He-Man, the legendary warrior destined to protect Eternia. Check out our <a href="https://www.tomsguide.com/entertainment/movies/masters-of-the-universe-review-has-the-power-to-scratch-that-fantasy-itch-but-little-else">“Masters of the Universe” review</a> for more.</p><p><em><strong>Watch </strong></em><a href="https://www.primevideo.com/detail/0PN0QUSC4GJ66QGSQWBE70ERPU" target="_blank" rel="nofollow"><em><strong>"Masters of the Universe" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-map-that-leads-to-you-2025">'The Map That Leads to You' (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/FK9BQm471c0" allowfullscreen></iframe></div></div><p>"Obsession" and "Backrooms" may be hogging the headlines, but they're not the only stellar horror movies we've seen this year. Johannes Roberts’ "Primate" is a blood-soaked horror film aimed squarely at genre fans, and it's well worth a watch for some tense scares this weekend.</p><p>Set in a vacation home in Hawaii, Lucy (Johnny Sequoyah) and her friends plan to enjoy the empty house while her father is away on business. But their sunny getaway turns into a nightmare when an adopted pet chimpanzee gets bitten by a rabid mongoose and turns bloodthirsty. Trapped and outmatched, they’re forced to rely on their wits to survive the chimp's savage frenzy.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0G75D8R6R?lv=shuf&channelId=500&plpRedirect=mhFallback" target="_blank" rel="nofollow"><em><strong>"Primate" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"The Devil's Mouth" (2026)</li><li>"Masters of the Universe" (2026)</li><li>"Project Hail Mary" (2026)</li><li>"The Amateur" (2025)</li><li>"Moonfall" (2022)</li><li>"The Sheep Detectives" (2026)</li><li>"Primate" (2026)</li><li>"Ruthless" (2024)</li><li>"World War Z" (2013)</li><li>"Do Not Enter" (2026)</li></ol><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/3-best-tom-holland-movies-to-watch-after-spider-man-brand-new-day">3 best Tom Holland movies to watch after ‘Spider-Man: Brand New Day’</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/9-must-watch-shows-and-movies-to-stream-in-august-2026-ted-lasso-reacher-dcs-lanterns-and-more">9 must-watch shows and movies to stream in August 2026: ‘Ted Lasso,’ ‘Reacher,’ DC’s ‘Lanterns’ and more</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-just-added-39-new-movies-here-are-the-five-you-need-to-stream-right-now-august-1-2026">Netflix just added 39 new movies — here are the 5 you need to stream right 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" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-right-now-august-1-2</link>
                                                                            <description>
                            <![CDATA[ These are the best movies on Prime Video's top 10 list that are actually worth adding to your watchlist. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">RWUwQgQiGDu4kK47YTccYU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KFAWy2ARKTf8LL9yy3E8y3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 02 Aug 2026 19:04:55 +0000</pubDate>                                                                                                                                <updated>Sun, 02 Aug 2026 19:06:43 +0000</updated>
                                                                                                                                            <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/KFAWy2ARKTf8LL9yy3E8y3-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a orange film reel background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a orange film reel background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a orange film reel background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KFAWy2ARKTf8LL9yy3E8y3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's the start of a new month, and <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> is heating up with great new movies to curl up on the couch in the glorious AC this weekend. <a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-52-new-movies-here-are-the-5-im-streaming-first" target="_blank" rel="nofollow">Prime Video just added over 50 movies</a> in August, but not all of them are worth your precious streaming time. </p><p>To narrow down what to watch next, I make a beeline to the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>'s list of the top 10 most-watched movies. Sure, it cuts through the noise, but how do you separate the movie night hits from the overhyped duds? Because let's be real, just because it's trending doesn't mean it merits a watch. Just look at Prime Video's lukewarm shark thriller at the #1 spot, which has an 18% audience score on Rotten Tomatoes. </p><p>To help you skip the scrolling and get to streaming, I've rounded up the standout picks from Prime Video's current top 10. That includes a slice of fantasy comfort food, a slept-on horror thriller, and Ryan Gosling's crowd-pleasing sci-fi adventure. So without further ado, let's dive into the best movies in Prime Video's top 10 that are worth adding to your watchlist.</p><p><em>This article is based on the global Prime Video top 10 list as of Sunday, August 2, 2026.</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxxBO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxxBO.js" async></script><h3 class="article-body__section" id="section-best-movies-in-the-prime-video-top-10"><span>Best movies in the Prime Video top 10</span></h3><h2 id="project-hail-mary">'Project Hail Mary'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/m08TxIsFTRI" allowfullscreen></iframe></div></div><p>Amaze! Amaze! Amaze! The sci-fi sensation "Project Hail Mary" is just as phenomenal as everyone says. Ryan Gosling is in top form as the charming yet woefully out of his league Ryland Grace, a disgraced scientist now teaching middle school. He, like everyone else, is quietly ignoring the end of the world getting closer now that a star-eating microbe is chowing down on our sun.  </p><p>He wakes up on a spaceship with no memory of his identity or how he got there. As the pieces come together, he realizes he's been roped into a suicide mission to save Earth from annihilation. Thankfully, he's got a buddy to help: Rocky, the lovable alien brought to life through voice and puppetry by James Ortiz. Their friendship becomes the emotional core of the movie, fueling a story packed with heartfelt humor, high-stakes disaster drama, and tense spacewalk sequences that had me watching through my fingers in theaters. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0GHXTWRV2" target="_blank" rel="nofollow"><em><strong>"Project Hail Mary" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="masters-of-the-universe">'Masters of the Universe'</h2><div 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>As far as scraping the bottom of the IP barrel goes, audiences at least seem to get a kick out of this latest unnecessary reboot. It's sitting at an 86% audience score on Rotten Tomatoes, warmer than its middling 67% from critics. I was a '90s kid and never watched He-man or She-ra — well, unless you count ND Stevenson's hella gay reboot — but I'm not above some popcorn fodder full of hunky actors to help a Sunday afternoon along. </p><p>Prince Adam (Nicholas Galitzine) is a young man who grew up on Earth and, after discovering the Sword of Power, learns of his true lineage: He's a prince on the distant planet of Eternia. When he returns, he finds his home has fallen under the control of the ruthless Skeletor (Jared Leto). Joined by allies Teela (Camila Mendes) and Duncan (Idris Elba), Adam sets out to reclaim the throne and harness his powers as He-Man, the legendary warrior destined to protect Eternia. Check out our <a href="https://www.tomsguide.com/entertainment/movies/masters-of-the-universe-review-has-the-power-to-scratch-that-fantasy-itch-but-little-else">“Masters of the Universe” review</a> for more.</p><p><em><strong>Watch </strong></em><a href="https://www.primevideo.com/detail/0PN0QUSC4GJ66QGSQWBE70ERPU" target="_blank" rel="nofollow"><em><strong>"Masters of the Universe" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-map-that-leads-to-you-2025">'The Map That Leads to You' (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/FK9BQm471c0" allowfullscreen></iframe></div></div><p>"Obsession" and "Backrooms" may be hogging the headlines, but they're not the only stellar horror movies we've seen this year. Johannes Roberts’ "Primate" is a blood-soaked horror film aimed squarely at genre fans, and it's well worth a watch for some tense scares this weekend.</p><p>Set in a vacation home in Hawaii, Lucy (Johnny Sequoyah) and her friends plan to enjoy the empty house while her father is away on business. But their sunny getaway turns into a nightmare when an adopted pet chimpanzee gets bitten by a rabid mongoose and turns bloodthirsty. Trapped and outmatched, they’re forced to rely on their wits to survive the chimp's savage frenzy.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0G75D8R6R?lv=shuf&channelId=500&plpRedirect=mhFallback" target="_blank" rel="nofollow"><em><strong>"Primate" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"The Devil's Mouth" (2026)</li><li>"Masters of the Universe" (2026)</li><li>"Project Hail Mary" (2026)</li><li>"The Amateur" (2025)</li><li>"Moonfall" (2022)</li><li>"The Sheep Detectives" (2026)</li><li>"Primate" (2026)</li><li>"Ruthless" (2024)</li><li>"World War Z" (2013)</li><li>"Do Not Enter" (2026)</li></ol><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/3-best-tom-holland-movies-to-watch-after-spider-man-brand-new-day">3 best Tom Holland movies to watch after ‘Spider-Man: Brand New Day’</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/9-must-watch-shows-and-movies-to-stream-in-august-2026-ted-lasso-reacher-dcs-lanterns-and-more">9 must-watch shows and movies to stream in August 2026: ‘Ted Lasso,’ ‘Reacher,’ DC’s ‘Lanterns’ and more</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-just-added-39-new-movies-here-are-the-five-you-need-to-stream-right-now-august-1-2026">Netflix just added 39 new movies — here are the 5 you need to stream right 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" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video shows to binge-watch this weekend (July 31-Aug. 2) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We've officially come to the end of July but luckily, in streaming as in life, the finish of one month brings the start of another and with it a fresh crop of new films and TV series for us to binge on our couches. (Because, really, what more do we need?) </p><p>One of the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">top streaming services</a> around, <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> regularly updates its already extensive streaming library every month and <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">August 2026</a> will be no exception, with buzzy shows and movies joining the platform in the weeks ahead. But before we say hello to all of those additions, let's use this weekend to catch up on some of the great titles that premiered in July. </p><p>Given the breadth of the Prime Video platform, we here at Tom's Guide have decided to make things easy and narrowed the list down to a trio of shows that we think you should check out next. They include action-adventure comedy "<a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-ride-or-die"><strong>Ride or Die</strong></a>," animated superhero noir "<a href="https://www.tomsguide.com/entertainment/prime-video/batman-caped-crusader-season-2-review-my-favorite-current-onscreen-batman-is-back-with-another-stylish-set-of-adventures"><strong>Batman: Caped Crusader</strong>"</a> and a beloved mother-daughter series that moved to Prime Video earlier in the month. (Hint: Friday night dinner!) Here are the 3 best new to Prime Video shows to binge 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="ride-or-die">'Ride or Die'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/QFGAxkTRAG8" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Buddy comedy/action-adventure</p><p><strong>What it's about:</strong> Besties Debbie (Octavia Spencer) and Judith (Hannah Waddingham) have the type of friendship that can withstand anything—but that trust gets majorly tested when it's revealed that the latter isn't actually a forensic accountant as Debbie always thought, but a highly trained, guns-blazing assassin. When Debbie and her MP husband David (Jamie Parker) get unwittingly roped into a scheme involving mob money and corrupt politics, the gal pals are forced on the run.</p><p><strong>Why you should watch it: </strong>Who doesn't want to hang out with Hannah Waddingham and Octavia Spencer — two of Hollywood's most talented and likeable stars — for eight hourlong episodes? Beyond the actresses' excellent onscreen chemistry, "Ride or Die" is a winning watch because it "maximizes its entertainment, humor, and fun through genuine performances and breezy writing," per the critics' consensus on Rotten Tomatoes, where the spy caper has a solid 96% approval rating. </p><p><em><strong>Stream "</strong></em><a href="https://www.amazon.com/gp/video/detail/B0H1MBNDTL?ref=dvm_us_dl_sl_go_t_rod26_mkw_p401-kw2855875-cr2855896-c&mrntrk=go_cmp-24033866851_adg-204000242288_ad-816707945232_kwd-2520170144084_dev-c_ext-" target="_blank" rel="nofollow"><em><strong>Ride or Die" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="batman-caped-crusader">'Batman: Caped Crusader'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/pNhijtUqyeg" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Superhero noir/animated series</p><p><strong>What it's about: </strong>Season 2 of this moody, film noir-inspired reimagining of the Batman mythos sees plenty more danger and drama ahead for our Bruce Wayne (voiced by Hamish Linklater as an adult and Santino Barnard as young Bruce). As Batman and his allies rally together to dismantle the criminal enterprise of reigning mob boss Rupert Thorne (Cedric Yarbrough), the masked vigilante will also have to contend with a whole host of iconic villains, including the Riddler, the Scarecrow and the Joker. </p><p><strong>Why you should watch it: </strong>If you like a broodingly stylized take on the superhero genre—think "<a href="https://www.tomsguide.com/entertainment/prime-video/spider-noir-review-nicolas-cage-excels-in-prime-videos-binge-worthy-new-superhero-show">Spider-Noir</a>," another Prime Video project—then you'll no doubt enjoy this Bruce Timm-developed drama, which earned a Critics' Choice nomination last year for Best Animated Series. </p><p><em><strong>Watch </strong></em><a href="https://www.primevideo.com/detail/0M8A366P4I025R61REB4E3FVRE" target="_blank" rel="nofollow"><em><strong>"Batman: Caped Crusader" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="gilmore-girls">'Gilmore Girls' </h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/RkX-99jZAxc" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Family dramedy</p><p><strong>What it's about: </strong>At this point, we probably don't need to tell you what "Gilmore Girls" is about, but in case you haven't yet tuned into the classic mother-daughter dramedy, the WB throwback stars Lauren Graham as thirtysomething single mom Lorelai Gilmore and Alexis Bledel as her precociously smart teenage daughter Rory. Over seven seasons, the series chronicles their preternaturally close bond as they both grow and change in the charming New England town of Stars Hollow. </p><p><strong>Why you should watch it: </strong>If you've been missing the Gilmores' quick-witted repartee and Stars Hollow's small-town quirkiness ever since the series <a href="https://www.tomsguide.com/entertainment/netflix/gilmore-girls-leaves-netflix-in-just-2-weeks-so-start-your-binge-and-cry-now">shockingly departed Netflix</a>, don't fret: Prime Video picked up all seven seasons beginning on July 1. Because where the Gilmores lead, we will follow. </p><p><em><strong>Stream </strong></em><a href="https://www.primevideo.com/detail/0GQFRLSM1ARF3VTRFKWMBPJTQS" target="_blank" rel="nofollow"><em><strong>"Gilmore Girls" on Prime Video 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/prime-video/prime-videos-upcoming-ai-makeover-could-completely-change-how-you-decide-what-to-watch-next">Prime Video's upcoming AI makeover could completely change how you decide what to watch next</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-shark-thriller-movie-has-one-big-problem-lurking-beneath-the-surface-and-its-not-the-shark">Prime Video’s new shark thriller movie has one big problem lurking beneath the surface, and it’s not the shark</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-5-gripping-movies-you-can-stream-for-free-and-one-is-an-action-packed-western-film">Prime Video just added 5 gripping movies you can stream for free — and one is an action-packed western film</a></li></ul><div data-model-name="Amazon Prime Video,Hulu,Netflix,Paramount Plus,Peacock TV,Disney+,Apple TV" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-shows-to-binge-watch-this-weekend-july-31-aug-2</link>
                                                                            <description>
                            <![CDATA[ Planning to binge-watch something new this weekend? Here's our weekly guide to the best new to Prime Video series you should be streaming right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">sSkZPT7TUEnYFFZkbzeNsR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 31 Jul 2026 17:47:06 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></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/aozP98atByMPCDdiMyJSPC-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on teal bubbles background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on teal bubbles background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on teal bubbles background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We've officially come to the end of July but luckily, in streaming as in life, the finish of one month brings the start of another and with it a fresh crop of new films and TV series for us to binge on our couches. (Because, really, what more do we need?) </p><p>One of the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">top streaming services</a> around, <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> regularly updates its already extensive streaming library every month and <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">August 2026</a> will be no exception, with buzzy shows and movies joining the platform in the weeks ahead. But before we say hello to all of those additions, let's use this weekend to catch up on some of the great titles that premiered in July. </p><p>Given the breadth of the Prime Video platform, we here at Tom's Guide have decided to make things easy and narrowed the list down to a trio of shows that we think you should check out next. They include action-adventure comedy "<a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-ride-or-die"><strong>Ride or Die</strong></a>," animated superhero noir "<a href="https://www.tomsguide.com/entertainment/prime-video/batman-caped-crusader-season-2-review-my-favorite-current-onscreen-batman-is-back-with-another-stylish-set-of-adventures"><strong>Batman: Caped Crusader</strong>"</a> and a beloved mother-daughter series that moved to Prime Video earlier in the month. (Hint: Friday night dinner!) Here are the 3 best new to Prime Video shows to binge 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="ride-or-die">'Ride or Die'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/QFGAxkTRAG8" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Buddy comedy/action-adventure</p><p><strong>What it's about:</strong> Besties Debbie (Octavia Spencer) and Judith (Hannah Waddingham) have the type of friendship that can withstand anything—but that trust gets majorly tested when it's revealed that the latter isn't actually a forensic accountant as Debbie always thought, but a highly trained, guns-blazing assassin. When Debbie and her MP husband David (Jamie Parker) get unwittingly roped into a scheme involving mob money and corrupt politics, the gal pals are forced on the run.</p><p><strong>Why you should watch it: </strong>Who doesn't want to hang out with Hannah Waddingham and Octavia Spencer — two of Hollywood's most talented and likeable stars — for eight hourlong episodes? Beyond the actresses' excellent onscreen chemistry, "Ride or Die" is a winning watch because it "maximizes its entertainment, humor, and fun through genuine performances and breezy writing," per the critics' consensus on Rotten Tomatoes, where the spy caper has a solid 96% approval rating. </p><p><em><strong>Stream "</strong></em><a href="https://www.amazon.com/gp/video/detail/B0H1MBNDTL?ref=dvm_us_dl_sl_go_t_rod26_mkw_p401-kw2855875-cr2855896-c&mrntrk=go_cmp-24033866851_adg-204000242288_ad-816707945232_kwd-2520170144084_dev-c_ext-" target="_blank" rel="nofollow"><em><strong>Ride or Die" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="batman-caped-crusader">'Batman: Caped Crusader'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/pNhijtUqyeg" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Superhero noir/animated series</p><p><strong>What it's about: </strong>Season 2 of this moody, film noir-inspired reimagining of the Batman mythos sees plenty more danger and drama ahead for our Bruce Wayne (voiced by Hamish Linklater as an adult and Santino Barnard as young Bruce). As Batman and his allies rally together to dismantle the criminal enterprise of reigning mob boss Rupert Thorne (Cedric Yarbrough), the masked vigilante will also have to contend with a whole host of iconic villains, including the Riddler, the Scarecrow and the Joker. </p><p><strong>Why you should watch it: </strong>If you like a broodingly stylized take on the superhero genre—think "<a href="https://www.tomsguide.com/entertainment/prime-video/spider-noir-review-nicolas-cage-excels-in-prime-videos-binge-worthy-new-superhero-show">Spider-Noir</a>," another Prime Video project—then you'll no doubt enjoy this Bruce Timm-developed drama, which earned a Critics' Choice nomination last year for Best Animated Series. </p><p><em><strong>Watch </strong></em><a href="https://www.primevideo.com/detail/0M8A366P4I025R61REB4E3FVRE" target="_blank" rel="nofollow"><em><strong>"Batman: Caped Crusader" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="gilmore-girls">'Gilmore Girls' </h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/RkX-99jZAxc" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Family dramedy</p><p><strong>What it's about: </strong>At this point, we probably don't need to tell you what "Gilmore Girls" is about, but in case you haven't yet tuned into the classic mother-daughter dramedy, the WB throwback stars Lauren Graham as thirtysomething single mom Lorelai Gilmore and Alexis Bledel as her precociously smart teenage daughter Rory. Over seven seasons, the series chronicles their preternaturally close bond as they both grow and change in the charming New England town of Stars Hollow. </p><p><strong>Why you should watch it: </strong>If you've been missing the Gilmores' quick-witted repartee and Stars Hollow's small-town quirkiness ever since the series <a href="https://www.tomsguide.com/entertainment/netflix/gilmore-girls-leaves-netflix-in-just-2-weeks-so-start-your-binge-and-cry-now">shockingly departed Netflix</a>, don't fret: Prime Video picked up all seven seasons beginning on July 1. Because where the Gilmores lead, we will follow. </p><p><em><strong>Stream </strong></em><a href="https://www.primevideo.com/detail/0GQFRLSM1ARF3VTRFKWMBPJTQS" target="_blank" rel="nofollow"><em><strong>"Gilmore Girls" on Prime Video 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/prime-video/prime-videos-upcoming-ai-makeover-could-completely-change-how-you-decide-what-to-watch-next">Prime Video's upcoming AI makeover could completely change how you decide what to watch next</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-shark-thriller-movie-has-one-big-problem-lurking-beneath-the-surface-and-its-not-the-shark">Prime Video’s new shark thriller movie has one big problem lurking beneath the surface, and it’s not the shark</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-5-gripping-movies-you-can-stream-for-free-and-one-is-an-action-packed-western-film">Prime Video just added 5 gripping movies you can stream for free — and one is an action-packed western film</a></li></ul><div data-model-name="Amazon Prime Video,Hulu,Netflix,Paramount Plus,Peacock TV,Disney+,Apple TV" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Shopping on Amazon or Walmart? Why you shouldn't rely on their AI assistants just yet ]]></title>
                                                                                                <dc:content><![CDATA[ <p>AI is rapidly becoming the new storefront. Instead of scrolling through pages of search results, more shoppers are asking AI assistants to recommend products, compare prices and narrow down options. But a new report argues that those same AI systems may also be quietly shaping what consumers never see.</p><p>Researchers at Columbia Law School's Center for Law and the Economy have published a report accusing Amazon and Walmart of using their<a href="https://www.tomsguide.com/ai/meet-rufus-amazons-new-ai-assistant-designed-to-help-you-shop"> AI shopping assistants</a> in ways that make American-made products harder to find, despite the systems appearing capable of identifying them.</p><p>The report, <a href="https://law-and-economy.law.columbia.edu/sites/law-and-economy.law.columbia.edu/files/content/Made%20in%20America%2C%20Hidden%20by%20AI.pdf" target="_blank">Made in America, Hidden by AI,</a> examined how Amazon's and Walmart's AI shopping tools responded to questions about products made in the United States. According to the researchers, <a href="https://www.tomsguide.com/ai/amazons-ai-chatbot-is-here-to-make-prime-day-shopping-easier">Amazon's chatbot</a> often declined to answer straightforward questions about American-made products while readily answering equivalent questions about products manufactured in China. After rephrasing the same request, however, the chatbot returned American-made products using information that had been available all along.</p><p>"We tested these systems the way an engineer would, and the refusals fell apart under basic testing," Erie Meyer, senior fellow at the Center for Law and the Economy and one of the report's authors, said. "The data was there, but the design was built to hide it."</p><h2 id="ai-shopping-assistants-are-becoming-gatekeepers">AI shopping assistants are becoming gatekeepers</h2><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="sWXS3838SMjeJknJJm3KRc" name="8 - 2026-07-30T095325.222" alt="alexa screenshot" src="https://cdn.mos.cms.futurecdn.net/sWXS3838SMjeJknJJm3KRc.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>The report arrives as retailers increasingly push shoppers toward AI-powered recommendations instead of traditional keyword searches. Whether it's suggesting products, comparing alternatives or summarizing reviews, these assistants are becoming the first stop for many online purchases.</p><p>According to the report, neither Amazon nor Walmart currently offers shoppers a dedicated "Made in USA" filter, despite providing hundreds of other filtering options across many product categories. The researchers argue that if AI assistants become the primary interface for online shopping, the way they choose what information to surface, or withhold, could influence purchasing decisions on a massive scale.<br><br>I tried it by asking for a few common items like furniture and fishing poles, Alexa+ said it did not have access to the information. However, when I asked for American flags made in the U.S.A., it supplied a product that matched my query.</p><p>Lina Khan, director of the Center for Law and the Economy and former chair of the Federal Trade Commission, said the findings demonstrate that increasingly sophisticated AI systems are still shaped by the incentives behind them.</p><p>"Even as AI tools continue to grow in sophistication and capability, business incentives will shape how these advancements get deployed," Khan said. "Policymakers and enforcers have a vital role to play to ensure the public doesn't get the short end of the stick."</p><h2 id="the-systems-appear-capable-of-spotting-suspicious-claims">The systems appear capable of spotting suspicious claims</h2><p>One of the report's more interesting findings is that both companies' AI assistants appeared able to identify potentially misleading "Made in USA" claims.</p><p>According to the researchers, Amazon's chatbot identified listings where promotional material claimed products were American-made despite evidence suggesting they were imported. Walmart's chatbot reportedly ranked "Made in USA" claims by how suspicious they appeared based on factors including seller information and manufacturing footprints.</p><p>The authors argue this demonstrates the underlying AI systems have the technical capability to help identify questionable origin claims. However, the report does not establish that Amazon or Walmart internally use these capabilities for marketplace enforcement.</p><h2 id="amazon-responds">Amazon responds</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RzZN7gXnZ5rfnyvVLbAcKS" name="Amazon logo.shutterstock_2445780831" alt="Amazon building" src="https://cdn.mos.cms.futurecdn.net/RzZN7gXnZ5rfnyvVLbAcKS.jpg" mos="" align="middle" fullscreen="" width="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>In a statement to <a href="https://www.reuters.com/business/retail-consumer/amazon-walmart-ai-detect-made-usa-fraud-do-not-flag-it-study-says-2026-07-30">Reuters</a>, Amazon disputed the broader implication that it hides country-of-origin information from shoppers.</p><p>"Country-of-origin information, when available, is currently displayed on product detail pages, and we're continually working to improve Alexa for Shopping to make this information even more accessible for customers," an Amazon spokesperson said.</p><p>Walmart did not immediately respond to Reuters' request for comment. </p><h2 id="bottom-line-2">Bottom line </h2><p>The report highlights a question that is likely to become more important as AI shopping assistants continue to replace traditional search.  If consumers  rely on AI to decide what products to buy, the design choices behind those systems become far more consequential. </p><p>Decisions about which products are surfaced first, which attributes are emphasized and which questions receive complete answers could shape purchasing behavior in ways that are largely invisible to shoppers.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/claude/i-just-learned-your-claude-ai-chats-could-show-up-in-google-heres-how-to-check-yours"><strong>I just learned your Claude AI chats could show up in Google — here's how to check yours</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-searched-amazon-for-ai-written-books-and-it-was-much-harder-to-spot-them-than-i-expected"><strong>I searched Amazon for AI-written books — and it was much harder to spot them than I expected</strong></a></li><li><a href="https://www.tomsguide.com/ai/jimothy-the-viral-raccoon-is-100-percent-real-heres-whats-ai"><strong>Jimothy the viral raccoon is 100% real — here's what's AI</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/shopping-on-amazon-or-walmart-why-you-shouldnt-rely-on-their-ai-assistants-just-yet</link>
                                                                            <description>
                            <![CDATA[ A new Columbia Law School report claims Amazon and Walmart's AI shopping assistants make American-made products harder to find—and raises bigger questions about AI-powered shopping. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FvRWvpCgMH965VBMUY9m7a</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cUpYh7MML9dQLmES78DqZn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Jul 2026 15:16:42 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/cUpYh7MML9dQLmES78DqZn-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Walmart sign]]></media:description>                                                            <media:text><![CDATA[Walmart sign]]></media:text>
                                <media:title type="plain"><![CDATA[Walmart sign]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cUpYh7MML9dQLmES78DqZn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>AI is rapidly becoming the new storefront. Instead of scrolling through pages of search results, more shoppers are asking AI assistants to recommend products, compare prices and narrow down options. But a new report argues that those same AI systems may also be quietly shaping what consumers never see.</p><p>Researchers at Columbia Law School's Center for Law and the Economy have published a report accusing Amazon and Walmart of using their<a href="https://www.tomsguide.com/ai/meet-rufus-amazons-new-ai-assistant-designed-to-help-you-shop"> AI shopping assistants</a> in ways that make American-made products harder to find, despite the systems appearing capable of identifying them.</p><p>The report, <a href="https://law-and-economy.law.columbia.edu/sites/law-and-economy.law.columbia.edu/files/content/Made%20in%20America%2C%20Hidden%20by%20AI.pdf" target="_blank">Made in America, Hidden by AI,</a> examined how Amazon's and Walmart's AI shopping tools responded to questions about products made in the United States. According to the researchers, <a href="https://www.tomsguide.com/ai/amazons-ai-chatbot-is-here-to-make-prime-day-shopping-easier">Amazon's chatbot</a> often declined to answer straightforward questions about American-made products while readily answering equivalent questions about products manufactured in China. After rephrasing the same request, however, the chatbot returned American-made products using information that had been available all along.</p><p>"We tested these systems the way an engineer would, and the refusals fell apart under basic testing," Erie Meyer, senior fellow at the Center for Law and the Economy and one of the report's authors, said. "The data was there, but the design was built to hide it."</p><h2 id="ai-shopping-assistants-are-becoming-gatekeepers">AI shopping assistants are becoming gatekeepers</h2><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="sWXS3838SMjeJknJJm3KRc" name="8 - 2026-07-30T095325.222" alt="alexa screenshot" src="https://cdn.mos.cms.futurecdn.net/sWXS3838SMjeJknJJm3KRc.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>The report arrives as retailers increasingly push shoppers toward AI-powered recommendations instead of traditional keyword searches. Whether it's suggesting products, comparing alternatives or summarizing reviews, these assistants are becoming the first stop for many online purchases.</p><p>According to the report, neither Amazon nor Walmart currently offers shoppers a dedicated "Made in USA" filter, despite providing hundreds of other filtering options across many product categories. The researchers argue that if AI assistants become the primary interface for online shopping, the way they choose what information to surface, or withhold, could influence purchasing decisions on a massive scale.<br><br>I tried it by asking for a few common items like furniture and fishing poles, Alexa+ said it did not have access to the information. However, when I asked for American flags made in the U.S.A., it supplied a product that matched my query.</p><p>Lina Khan, director of the Center for Law and the Economy and former chair of the Federal Trade Commission, said the findings demonstrate that increasingly sophisticated AI systems are still shaped by the incentives behind them.</p><p>"Even as AI tools continue to grow in sophistication and capability, business incentives will shape how these advancements get deployed," Khan said. "Policymakers and enforcers have a vital role to play to ensure the public doesn't get the short end of the stick."</p><h2 id="the-systems-appear-capable-of-spotting-suspicious-claims">The systems appear capable of spotting suspicious claims</h2><p>One of the report's more interesting findings is that both companies' AI assistants appeared able to identify potentially misleading "Made in USA" claims.</p><p>According to the researchers, Amazon's chatbot identified listings where promotional material claimed products were American-made despite evidence suggesting they were imported. Walmart's chatbot reportedly ranked "Made in USA" claims by how suspicious they appeared based on factors including seller information and manufacturing footprints.</p><p>The authors argue this demonstrates the underlying AI systems have the technical capability to help identify questionable origin claims. However, the report does not establish that Amazon or Walmart internally use these capabilities for marketplace enforcement.</p><h2 id="amazon-responds">Amazon responds</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RzZN7gXnZ5rfnyvVLbAcKS" name="Amazon logo.shutterstock_2445780831" alt="Amazon building" src="https://cdn.mos.cms.futurecdn.net/RzZN7gXnZ5rfnyvVLbAcKS.jpg" mos="" align="middle" fullscreen="" width="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>In a statement to <a href="https://www.reuters.com/business/retail-consumer/amazon-walmart-ai-detect-made-usa-fraud-do-not-flag-it-study-says-2026-07-30">Reuters</a>, Amazon disputed the broader implication that it hides country-of-origin information from shoppers.</p><p>"Country-of-origin information, when available, is currently displayed on product detail pages, and we're continually working to improve Alexa for Shopping to make this information even more accessible for customers," an Amazon spokesperson said.</p><p>Walmart did not immediately respond to Reuters' request for comment. </p><h2 id="bottom-line-2">Bottom line </h2><p>The report highlights a question that is likely to become more important as AI shopping assistants continue to replace traditional search.  If consumers  rely on AI to decide what products to buy, the design choices behind those systems become far more consequential. </p><p>Decisions about which products are surfaced first, which attributes are emphasized and which questions receive complete answers could shape purchasing behavior in ways that are largely invisible to shoppers.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/claude/i-just-learned-your-claude-ai-chats-could-show-up-in-google-heres-how-to-check-yours"><strong>I just learned your Claude AI chats could show up in Google — here's how to check yours</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-searched-amazon-for-ai-written-books-and-it-was-much-harder-to-spot-them-than-i-expected"><strong>I searched Amazon for AI-written books — and it was much harder to spot them than I expected</strong></a></li><li><a href="https://www.tomsguide.com/ai/jimothy-the-viral-raccoon-is-100-percent-real-heres-whats-ai"><strong>Jimothy the viral raccoon is 100% real — here's what's AI</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ New on Prime Video in August 2026: Top picks and all the new movies and shows to watch ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We’re right in the thick of summer, but <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> certainly isn’t hitting the brakes when it comes to new movies and shows. Even if August feels like the final true stretch of the sunny season, there’s still more than enough time to soak it all in, and streaming platforms are keeping the energy high with a fresh lineup of entertainment.</p><p>The full Prime Video slate for August 2026 is officially in, so I’ve picked the biggest titles on the radar alongside the fresh additions dropping at the start of the month. This month includes a new teen drama packed with mystery, the fourth season of the action-thriller “Reacher,” and a romance set during a summer in Mallorca.</p><p>Take a look at my top picks below and the complete calendar of what’s hitting Prime Video this August 2026.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxxBO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxxBO.js" async></script><h3 class="article-body__section" id="section-new-on-prime-video-in-august-2026-top-picks"><span>New on Prime Video in August 2026: Top picks</span></h3><h2 id="sterling-point-august-5">‘Sterling Point’ (August 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/bwwF3TuJQME" allowfullscreen></iframe></div></div><p>“Sterling Point” is a coming-of-age mystery drama series, based on an entirely original story conceived and written for the screen by Megan Park. It has a similar tone to shows like “We Were Liars” and “The Summer I Turned Pretty,” but with a distinctly Canadian setting. Set against the backdrop of a foggy island off the coast of Canada, the series is driven by a central mystery, but viewers tuning in for the romance will be pleased to know there’s also a love triangle at the heart of the story.</p><p>Seventeen-year-old Annie Jacobson (Ella Rubin) has always lived an ordinary life in New York with her twin brother Connor (Keen Ruffalo) and their adoptive father. Everything changes when the siblings unexpectedly inherit a remote island in Canada from the estranged grandfather they were never allowed to meet. Hoping to uncover the truth about their family’s past, Annie travels to the island, where she meets an unexpected sister named Ramona (Amélie Hoeferle) and a group of locals who are deeply connected to the property.</p><p><em><strong>Stream "Sterling Point" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H49C7NVH" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from August 5</strong></em></p><h2 id="reacher-season-4-august-12">‘Reacher’ season 4 (August 12)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/PCbp1FfipPg" allowfullscreen></iframe></div></div><p>It’s time to celebrate, because “Reacher” is finally back for season 4. This time around, the series adapts Lee Child’s novel Gone Tomorrow, which focuses on a conspiracy involving government cover-ups. From the trailer alone, this season appears to take heavy inspiration from classic neo-noir detective stories, with a much darker and more claustrophobic feel than what we’ve seen before. It’s an exciting time to be a “Reacher” fan, especially with the series already renewed for season 5.</p><p>“Reacher” season 4 begins when Reacher (Alan Ritchson) witnesses a woman behaving suspiciously on a late-night New York City subway train. Before he can question her, she dies, and what appears to be a straightforward suicide quickly proves far more complicated. Determined to uncover the truth, Reacher joins forces with the woman’s brother and an NYPD homicide detective, fighting to expose the truth before those responsible can silence him for good.</p><p><em><strong>Stream "Reacher" season 4 on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H8N9812R" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from August 12</strong></em></p><h2 id="the-last-sunrise-august-26">‘The Last Sunrise’ (August 26)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UMYXEABbCHbwg2FNnD2YW8" name="The Last Sunrise" alt="Maia Reficco (Ry) and Fernando Lindez (Julian) in "The Last Sunrise" coming soon to Prime Video" src="https://cdn.mos.cms.futurecdn.net/UMYXEABbCHbwg2FNnD2YW8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Lucia Faraig / Prime Video)</span></figcaption></figure><p>Lastly, we have a romance flick perfect for summer, and that’s “The Last Sunrise.” The film is based on Anna Todd’s 2025 novel of the same name, with the bestselling author best known for creating the global “After” franchise. It’s also directed by Carlson Young, who previously helmed the films “Upgraded” and “The Map of Tiny Perfect Things,” so I have high hopes. As a romance fan, I’m eagerly awaiting the trailer, but even from the premise alone, I’m already intrigued.</p><p>Oriah “Ry” Pera (Maia Reficco) is a college student living with a chronic illness whose overprotective mother takes a new job in Mallorca. Hoping for a fresh start, Ry spends the summer exploring the island and meets Julián (Fernando Lindez), a charming local who introduces her to experiences she has never had before. Soon, Ry begins embracing her independence and imagining a different future. However, worsening health problems threaten to cut her journey short, forcing her to make difficult choices before the summer comes to an end.</p><p><em><strong>Stream "The Last Sunrise" on </strong></em><a href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from August 26</strong></em></p><h3 class="article-body__section" id="section-new-shows-on-prime-video-in-august-2026"><span>New shows on Prime Video in August 2026</span></h3><p><strong>August 5</strong></p><ul><li>Sterling Point (2026)</li></ul><p><strong>August 9</strong></p><ul><li>The Chosen in the Wild with Bear Grylls (2026)</li></ul><p><strong>August 12</strong></p><ul><li>Reacher S4 (2026)</li></ul><p><strong>August 14</strong></p><ul><li>ONE Championship on Prime (2026)</li></ul><p><strong>August 20</strong></p><ul><li>NOVAK DJOKOVIC: The Wolf in Winter (2026)</li></ul><h3 class="article-body__section" id="section-new-movies-on-prime-video-in-august-2026"><span>New movies on Prime Video in August 2026</span></h3><p><strong>August 1</strong></p><ul><li>Baby Boom (1987)</li><li>Back To School (1986)</li><li>Bandits (2001)</li><li>Barbershop (2002)</li><li>Barbershop 2: Back In Business (2004)</li><li>Barbershop: The Next Cut (2016)</li><li>Beauty Shop (2005)</li><li>Blue Velvet (1986)</li><li>Bridesmaids (Unrated) (2011)</li><li>Challengers (2024)</li><li>Colors (1988)</li><li>Cop Car (2015)</li><li>Everything, Everything (2017)</li><li>Fargo (1996)</li><li>Fighting With My Family (2019)</li><li>Hard Target (1993)</li><li>Hard Target 2 (2016)</li><li>Hercules (2014)</li><li>Hoodlum (1997)</li><li>Interstellar (2014)</li><li>Into The Blue (2005)</li><li>Joy Ride (2023)</li><li>Just Go With It (2011)</li><li>Killing Me Softly (2003)</li><li>Licorice Pizza (2021)</li><li>Moonstruck (1988)</li><li>Mystic Pizza (1988)</li><li>No Way Out (1987)</li><li>Oblivion (1994)</li><li>Operation Finale (2018)</li><li>Overboard (2018)</li><li>Primate (2026)</li><li>Pulp Fiction (1994)</li><li>Quigley Down Under (1990)</li><li>Return To Me (2000)</li><li>Robocop (1987)</li><li>Robocop (2014)</li><li>Robocop 2 (1990)</li><li>Robocop 3 (1993)</li><li>Small Soldiers (1998)</li><li>Sudden Death (1995)</li><li>The Adventures Of Buckaroo Banzai (1984)</li><li>The Gambler (2014)</li><li>The Hustle (2019)</li><li>The Silencing (2020)</li><li>The Thomas Crown Affair (1968)</li><li>The Thomas Crown Affair (1999)</li><li>The Usual Suspects (1995)</li><li>What's The Worst That Could Happen? (2001)</li><li>Women Talking (2022)</li><li>Yours, Mine, And Ours (1968)</li></ul><p><strong>August 2</strong></p><ul><li>Kingdom Of The Planet Of The Apes (2024)</li></ul><p><strong>August 7</strong></p><ul><li>Piece By Piece (2024)</li><li>The Gates (2026)</li></ul><p><strong>August 8</strong></p><ul><li>Journey To Bethlehem (2023)</li></ul><p><strong>August 17</strong></p><ul><li>Blue Beetle (2023)</li></ul><p><strong>August 19</strong></p><ul><li>Is God Is (2026)</li></ul><p><strong>August 21</strong></p><ul><li>Back to the 90s (2026)</li><li>Good Fortune (2025)</li></ul><p><strong>August 26</strong></p><ul><li>The Last Sunrise (2026)</li></ul><p><strong>August 27</strong></p><ul><li>Nickel Boys (2024)</li></ul><h3 class="article-body__section" id="section-live-sports"><span>Live sports</span></h3><p><strong>Yankees</strong></p><ul><li><strong>Wed Aug 5 at 7:05 p.m. ET</strong>: St. Louis Cardinals at New York Yankees</li><li><strong>Wed Aug 19 at 6:35 p.m. ET</strong>: New York Yankees at Baltimore Orioles</li><li><strong>Thu Aug 20 at 6:35 p.m. ET</strong>: New York Yankees at Baltimore Orioles</li><li><strong>Wed Aug 26 at 7:05 p.m. ET</strong>: Houston Astros at New York Yankees</li></ul><p><strong>WNBA</strong></p><ul><li><strong>Thu Aug 6 at 7 p.m. ET</strong>: Las Vegas Aces at Indiana Fever</li><li><strong>Thu Aug 6 at 9 p.m. ET</strong>: Los Angeles Sparks at Minnesota Lynx</li><li><strong>Thu Aug 13 at 8 p.m. ET</strong>: Los Angeles Sparks at New York Liberty</li><li><strong>Thu Aug 13 at 10 p.m. ET</strong>: Washington Mystics at Las Vegas Aces</li><li><strong>Thu Aug 20 at 8 p.m. ET</strong>: Indiana Fever at Dallas Wings</li><li><strong>Thu Aug 20 at 10 p.m. ET</strong>: Atlanta Dream at Los Angeles Sparks</li><li><strong>Sat Aug 22 at 7 p.m. ET</strong>: Indiana Fever at New York Liberty</li><li><strong>Sat Aug 22 at 9 p.m. ET</strong>: Connecticut Sun at Los Angeles Sparks</li><li><strong>Thu Aug 27 at 8 p.m. ET</strong>: Golden State Valkyries at New York Liberty</li><li><strong>Thu Aug 27 at 10 p.m. ET</strong>: Washington Mystics at Phoenix Mercury</li></ul><p><strong>NWSL</strong></p><ul><li><strong>Thu Aug 7 at 8 p.m. ET</strong>: Gotham FC vs. San Diego Wave</li><li><strong>Thu Aug 14 at 8 p.m. ET</strong>: Gotham FC vs. Kansas City Current</li><li><strong>Thu Aug 21 at 10 p.m. ET</strong>: San Diego Wave vs. Utah Royals FC</li><li><strong>Thu Aug 28 at 8 p.m. ET</strong>: Gotham FC vs. Portland Thorns</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><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-upcoming-ai-makeover-could-completely-change-how-you-decide-what-to-watch-next">Prime Video's AI makeover could change how you stream</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-july-27-aug-2">5 best new Netflix movies and shows to stream this week</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/10-best-netflix-movies-and-shows-of-summer-2026-so-far-ranked-by-viewers-no-1-is-a-twisting-mystery-thriller-made-for-binge-watching">10 best Netflix movies and shows of summer 2026 (so far)</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-august-2026-top-picks-and-all-the-new-movies-and-shows-to-watch</link>
                                                                            <description>
                            <![CDATA[ Our guide to the best new movies and shows you can stream on Prime Video in August 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">axnqmYjTLFbgSHvjBzAKFA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Jul 2026 09:48:47 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ alix.blackburn@futurenet.com (Alix Blackburn) ]]></author>                    <dc:creator><![CDATA[ Alix Blackburn ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8UxyT2McanNFLYwQ6wC7di.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a laser speed abstract background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a laser speed abstract background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a laser speed abstract background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We’re right in the thick of summer, but <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> certainly isn’t hitting the brakes when it comes to new movies and shows. Even if August feels like the final true stretch of the sunny season, there’s still more than enough time to soak it all in, and streaming platforms are keeping the energy high with a fresh lineup of entertainment.</p><p>The full Prime Video slate for August 2026 is officially in, so I’ve picked the biggest titles on the radar alongside the fresh additions dropping at the start of the month. This month includes a new teen drama packed with mystery, the fourth season of the action-thriller “Reacher,” and a romance set during a summer in Mallorca.</p><p>Take a look at my top picks below and the complete calendar of what’s hitting Prime Video this August 2026.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmxxBO"></div>                            </div>                            <script src="https://kwizly.com/embed/XmxxBO.js" async></script><h3 class="article-body__section" id="section-new-on-prime-video-in-august-2026-top-picks"><span>New on Prime Video in August 2026: Top picks</span></h3><h2 id="sterling-point-august-5">‘Sterling Point’ (August 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/bwwF3TuJQME" allowfullscreen></iframe></div></div><p>“Sterling Point” is a coming-of-age mystery drama series, based on an entirely original story conceived and written for the screen by Megan Park. It has a similar tone to shows like “We Were Liars” and “The Summer I Turned Pretty,” but with a distinctly Canadian setting. Set against the backdrop of a foggy island off the coast of Canada, the series is driven by a central mystery, but viewers tuning in for the romance will be pleased to know there’s also a love triangle at the heart of the story.</p><p>Seventeen-year-old Annie Jacobson (Ella Rubin) has always lived an ordinary life in New York with her twin brother Connor (Keen Ruffalo) and their adoptive father. Everything changes when the siblings unexpectedly inherit a remote island in Canada from the estranged grandfather they were never allowed to meet. Hoping to uncover the truth about their family’s past, Annie travels to the island, where she meets an unexpected sister named Ramona (Amélie Hoeferle) and a group of locals who are deeply connected to the property.</p><p><em><strong>Stream "Sterling Point" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H49C7NVH" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from August 5</strong></em></p><h2 id="reacher-season-4-august-12">‘Reacher’ season 4 (August 12)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/PCbp1FfipPg" allowfullscreen></iframe></div></div><p>It’s time to celebrate, because “Reacher” is finally back for season 4. This time around, the series adapts Lee Child’s novel Gone Tomorrow, which focuses on a conspiracy involving government cover-ups. From the trailer alone, this season appears to take heavy inspiration from classic neo-noir detective stories, with a much darker and more claustrophobic feel than what we’ve seen before. It’s an exciting time to be a “Reacher” fan, especially with the series already renewed for season 5.</p><p>“Reacher” season 4 begins when Reacher (Alan Ritchson) witnesses a woman behaving suspiciously on a late-night New York City subway train. Before he can question her, she dies, and what appears to be a straightforward suicide quickly proves far more complicated. Determined to uncover the truth, Reacher joins forces with the woman’s brother and an NYPD homicide detective, fighting to expose the truth before those responsible can silence him for good.</p><p><em><strong>Stream "Reacher" season 4 on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H8N9812R" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from August 12</strong></em></p><h2 id="the-last-sunrise-august-26">‘The Last Sunrise’ (August 26)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UMYXEABbCHbwg2FNnD2YW8" name="The Last Sunrise" alt="Maia Reficco (Ry) and Fernando Lindez (Julian) in "The Last Sunrise" coming soon to Prime Video" src="https://cdn.mos.cms.futurecdn.net/UMYXEABbCHbwg2FNnD2YW8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Lucia Faraig / Prime Video)</span></figcaption></figure><p>Lastly, we have a romance flick perfect for summer, and that’s “The Last Sunrise.” The film is based on Anna Todd’s 2025 novel of the same name, with the bestselling author best known for creating the global “After” franchise. It’s also directed by Carlson Young, who previously helmed the films “Upgraded” and “The Map of Tiny Perfect Things,” so I have high hopes. As a romance fan, I’m eagerly awaiting the trailer, but even from the premise alone, I’m already intrigued.</p><p>Oriah “Ry” Pera (Maia Reficco) is a college student living with a chronic illness whose overprotective mother takes a new job in Mallorca. Hoping for a fresh start, Ry spends the summer exploring the island and meets Julián (Fernando Lindez), a charming local who introduces her to experiences she has never had before. Soon, Ry begins embracing her independence and imagining a different future. However, worsening health problems threaten to cut her journey short, forcing her to make difficult choices before the summer comes to an end.</p><p><em><strong>Stream "The Last Sunrise" on </strong></em><a href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from August 26</strong></em></p><h3 class="article-body__section" id="section-new-shows-on-prime-video-in-august-2026"><span>New shows on Prime Video in August 2026</span></h3><p><strong>August 5</strong></p><ul><li>Sterling Point (2026)</li></ul><p><strong>August 9</strong></p><ul><li>The Chosen in the Wild with Bear Grylls (2026)</li></ul><p><strong>August 12</strong></p><ul><li>Reacher S4 (2026)</li></ul><p><strong>August 14</strong></p><ul><li>ONE Championship on Prime (2026)</li></ul><p><strong>August 20</strong></p><ul><li>NOVAK DJOKOVIC: The Wolf in Winter (2026)</li></ul><h3 class="article-body__section" id="section-new-movies-on-prime-video-in-august-2026"><span>New movies on Prime Video in August 2026</span></h3><p><strong>August 1</strong></p><ul><li>Baby Boom (1987)</li><li>Back To School (1986)</li><li>Bandits (2001)</li><li>Barbershop (2002)</li><li>Barbershop 2: Back In Business (2004)</li><li>Barbershop: The Next Cut (2016)</li><li>Beauty Shop (2005)</li><li>Blue Velvet (1986)</li><li>Bridesmaids (Unrated) (2011)</li><li>Challengers (2024)</li><li>Colors (1988)</li><li>Cop Car (2015)</li><li>Everything, Everything (2017)</li><li>Fargo (1996)</li><li>Fighting With My Family (2019)</li><li>Hard Target (1993)</li><li>Hard Target 2 (2016)</li><li>Hercules (2014)</li><li>Hoodlum (1997)</li><li>Interstellar (2014)</li><li>Into The Blue (2005)</li><li>Joy Ride (2023)</li><li>Just Go With It (2011)</li><li>Killing Me Softly (2003)</li><li>Licorice Pizza (2021)</li><li>Moonstruck (1988)</li><li>Mystic Pizza (1988)</li><li>No Way Out (1987)</li><li>Oblivion (1994)</li><li>Operation Finale (2018)</li><li>Overboard (2018)</li><li>Primate (2026)</li><li>Pulp Fiction (1994)</li><li>Quigley Down Under (1990)</li><li>Return To Me (2000)</li><li>Robocop (1987)</li><li>Robocop (2014)</li><li>Robocop 2 (1990)</li><li>Robocop 3 (1993)</li><li>Small Soldiers (1998)</li><li>Sudden Death (1995)</li><li>The Adventures Of Buckaroo Banzai (1984)</li><li>The Gambler (2014)</li><li>The Hustle (2019)</li><li>The Silencing (2020)</li><li>The Thomas Crown Affair (1968)</li><li>The Thomas Crown Affair (1999)</li><li>The Usual Suspects (1995)</li><li>What's The Worst That Could Happen? (2001)</li><li>Women Talking (2022)</li><li>Yours, Mine, And Ours (1968)</li></ul><p><strong>August 2</strong></p><ul><li>Kingdom Of The Planet Of The Apes (2024)</li></ul><p><strong>August 7</strong></p><ul><li>Piece By Piece (2024)</li><li>The Gates (2026)</li></ul><p><strong>August 8</strong></p><ul><li>Journey To Bethlehem (2023)</li></ul><p><strong>August 17</strong></p><ul><li>Blue Beetle (2023)</li></ul><p><strong>August 19</strong></p><ul><li>Is God Is (2026)</li></ul><p><strong>August 21</strong></p><ul><li>Back to the 90s (2026)</li><li>Good Fortune (2025)</li></ul><p><strong>August 26</strong></p><ul><li>The Last Sunrise (2026)</li></ul><p><strong>August 27</strong></p><ul><li>Nickel Boys (2024)</li></ul><h3 class="article-body__section" id="section-live-sports"><span>Live sports</span></h3><p><strong>Yankees</strong></p><ul><li><strong>Wed Aug 5 at 7:05 p.m. ET</strong>: St. Louis Cardinals at New York Yankees</li><li><strong>Wed Aug 19 at 6:35 p.m. ET</strong>: New York Yankees at Baltimore Orioles</li><li><strong>Thu Aug 20 at 6:35 p.m. ET</strong>: New York Yankees at Baltimore Orioles</li><li><strong>Wed Aug 26 at 7:05 p.m. ET</strong>: Houston Astros at New York Yankees</li></ul><p><strong>WNBA</strong></p><ul><li><strong>Thu Aug 6 at 7 p.m. ET</strong>: Las Vegas Aces at Indiana Fever</li><li><strong>Thu Aug 6 at 9 p.m. ET</strong>: Los Angeles Sparks at Minnesota Lynx</li><li><strong>Thu Aug 13 at 8 p.m. ET</strong>: Los Angeles Sparks at New York Liberty</li><li><strong>Thu Aug 13 at 10 p.m. ET</strong>: Washington Mystics at Las Vegas Aces</li><li><strong>Thu Aug 20 at 8 p.m. ET</strong>: Indiana Fever at Dallas Wings</li><li><strong>Thu Aug 20 at 10 p.m. ET</strong>: Atlanta Dream at Los Angeles Sparks</li><li><strong>Sat Aug 22 at 7 p.m. ET</strong>: Indiana Fever at New York Liberty</li><li><strong>Sat Aug 22 at 9 p.m. ET</strong>: Connecticut Sun at Los Angeles Sparks</li><li><strong>Thu Aug 27 at 8 p.m. ET</strong>: Golden State Valkyries at New York Liberty</li><li><strong>Thu Aug 27 at 10 p.m. ET</strong>: Washington Mystics at Phoenix Mercury</li></ul><p><strong>NWSL</strong></p><ul><li><strong>Thu Aug 7 at 8 p.m. ET</strong>: Gotham FC vs. San Diego Wave</li><li><strong>Thu Aug 14 at 8 p.m. ET</strong>: Gotham FC vs. Kansas City Current</li><li><strong>Thu Aug 21 at 10 p.m. ET</strong>: San Diego Wave vs. Utah Royals FC</li><li><strong>Thu Aug 28 at 8 p.m. ET</strong>: Gotham FC vs. Portland Thorns</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><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-upcoming-ai-makeover-could-completely-change-how-you-decide-what-to-watch-next">Prime Video's AI makeover could change how you stream</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/5-best-new-netflix-movies-and-shows-to-stream-this-week-july-27-aug-2">5 best new Netflix movies and shows to stream this week</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/10-best-netflix-movies-and-shows-of-summer-2026-so-far-ranked-by-viewers-no-1-is-a-twisting-mystery-thriller-made-for-binge-watching">10 best Netflix movies and shows of summer 2026 (so far)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I searched Amazon for AI-written books — and it was much harder to spot them than I expected ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When ChatGPT first launched, most of the conversation centered on <a href="https://www.tomsguide.com/ai/tired-of-being-flagged-by-ai-i-started-watermarking-my-writing-to-prove-im-human">AI-generated student essays</a>, <a href="https://www.tomsguide.com/ai/openai-to-launch-deepfake-detector-as-realism-of-ai-generated-content-grows">deepfake images </a>and the <a href="https://www.tomsguide.com/computing/online-security/from-misinformation-to-ai-powered-cyberattacks-the-top-cybersecurity-risks-for-2026">threat of automated fake news</a>. Books, however, felt different. </p><p>As someone who reads and reviews half a dozen books a month for ReaderViews, I've always found a certain comfort in the traditional publishing process. Bringing a book to market has historically required editors, designers, proofreaders, and, most importantly, <a href="https://www.tomsguide.com/ai/writing-a-novel-in-2026-heres-why-chatgpt-alone-wont-get-you-to-the-finish-line">an author who actually sat down and wrote it</a>. That barrier to entry gave books an inherent authority that standard websites and fleeting social media posts often lacked.</p><p>Then I read a recent <a href="https://www.nytimes.com/2026/07/16/technology/ai-slop-books-biography-amazon.html" target="_blank">New York Times investigation</a> into AI-generated biographies appearing on Amazon. These included books about living public figures that were riddled with factual mistakes and seemingly produced with zero human oversight.</p><p>I wondered: Could I actually spot one in the wild? I opened Amazon and started searching.</p><h2 id="most-of-the-listings-looked-completely-normal">Most of the listings looked completely normal</h2><p>The most surprising part of the whole experiment was at first glance, nothing looked unusual. All the books with AI-generated content featured professional-looking covers, convincing descriptions, reasonable price points, and even star ratings. Nothing immediately screamed "AI." If I hadn't intentionally gone looking for them, I probably would have assumed they were entirely legitimate.</p><p>Once I dug a little deeper, however, the facade started to crack — and the first thing that tipped me off was the author pages. I clicked on the name behind one biography and landed on the page of someone called <a href="https://www.nytimes.com/2026/07/16/technology/ai-slop-books-biography-amazon.html">John Crane Miller</a>, described as a "seasoned biographer and cultural analyst" with a stock-photo portrait. Miller had published ten biographies in a single week, all about journalists and public figures, and when <a href="https://www.nytimes.com/by/kashmir-hill?eafs_enabled=false" target="_blank">Kashmir Hill</a> left a public review on Amazon asking to speak with him, his books quietly vanished. He wasn't the only phantom. </p><p><a href="https://originality.ai/blog/likely-ai-success-self-help-book-study">A study by Originality.ai</a> found entire catalogs built by authors who appeared to be fabricated identities, one of whom had published 74 books in five months on topics ranging from porn addiction to solo parenting to toxic workplaces. No single person writes like that. These weren't prolific indie authors with a strong work ethic; they were fake names attached to automated output.</p><h2 id="marketing-copy-was-a-dead-giveaway">Marketing copy was a dead giveaway </h2><p>Blurb after blurb leaned on the same broad promises and eerily familiar phrasing — "delve into," "comprehensive guide," "unlock the secrets of" — without ever explaining what made the book worth reading over any other book on the same topic. </p><p>After half a dozen of these, I could practically predict the next sentence before I read it. The marketing copy wasn't just generic; it was interchangeable, as if the same prompt had been run through the same model with only the subject swapped out.</p><p>The biographies were the most troubling category, and the <a href="https://www.404media.co/ai-generated-kara-swisher-biographies-flood-amazon/" target="_blank">wave of books about tech journalist Kara Swisher</a> illustrated why. Multiple unauthorized biographies of Swisher appeared on Amazon around the release of her memoir "<a href="https://www.simonandschuster.com/books/Burn-Book/Kara-Swisher/9781982163907" target="_blank">Burn Book</a>," written by authors with no apparent journalism credentials and no indication they had ever spoken to Swisher or anyone in her orbit. </p><p>Political scientist Ian Bremmer <a href="https://www.npr.org/2024/03/13/1237888126/growing-number-ai-scam-books-amazon" target="_blank">encountered the same phenomenon</a>: books bearing his name as a subject, produced without his involvement, that simply scraped and summarized what was already freely available online. This is, of course, exactly what chatbots are built to do, that is, synthesize existing information into fluent, confident-sounding prose. The result is a product that looks and feels like a real book but contributes nothing a reader couldn't get from the source material itself.</p><h2 id="beyond-books">Beyond books </h2><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="JKuR2zNYoo68T66LtMcnLB" name="subtack" alt="Amanda Caswell's substack" src="https://cdn.mos.cms.futurecdn.net/JKuR2zNYoo68T66LtMcnLB.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/Amanda Caswell)</span></figcaption></figure><p>Substack recently launched an AI detection feature in partnership with a company called <a href="https://www.tomsguide.com/ai/i-tested-pangram-the-black-light-of-ai-detection-built-by-ex-tesla-and-google-engineers-heres-how-well-it-worked">Pangram</a>, letting readers scan any post to see an estimate of how much was written by a human versus generated by AI. </p><p>Substack CEO Chris Best framed it as a way to keep the platform from becoming "like LinkedIn," <a href="https://www.pangram.com/blog/ai-in-your-feed" target="_blank">overrun with hollow AI content, </a>but even Substack acknowledges the tool isn't perfect. <a href="https://san.com/cc/substacks-new-ai-detection-tool-has-some-critics-worried-about-false-flags/" target="_blank">The Atlantic found</a> that Pangram's accuracy is far from bulletproof, and critics worry about false positives flagging legitimate human writers. </p><p>Still, the fact that a major publishing platform felt compelled to build this feature at all says something about how urgent the problem has become. Amazon, for its part, has no equivalent.</p><h2 id="the-takeaway">The takeaway </h2><p>As someone who absolutely loves to read, I found this to be a very interesting experiment. My takeaway is that now, instead of trusting a listing at face value, I take a few extra minutes to look up the author outside of Amazon to see if they have a credible publishing history elsewhere, and I specifically hunt down professional reviews rather than relying on standard star ratings. </p><p>I always preview the sample text to check if the writing feels robotic or relies on repetitive phrasing, and for nonfiction, I actively look for evidence of real human interviews and original citations. None of these steps individually guarantee a book was written by a human, but together, they make it much easier to separate thoughtful, researched work from automated content designed just to game search results.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-to-improve-my-apple-notes-app-here-are-the-7-changes-i-actually-kept">I asked ChatGPT to improve my Apple Notes app — here are the 7 changes I actually kept</a></li><li><a href="https://www.tomsguide.com/ai/microsoft-copilots-free-deep-research-ai-tool-is-going-away-these-are-the-7-best-free-alternatives">Microsoft Copilot’s free Deep Research AI tool is going away — these are the 7 best free alternatives</a></li><li><a href="https://www.tomsguide.com/ai/i-always-recommend-the-chatgpt-escape-prompt-to-friends-looking-for-a-new-job-heres-why-it-works">I always recommend the ChatGPT 'Escape Prompt' to friends looking for a new job — here's why it works</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-searched-amazon-for-ai-written-books-and-it-was-much-harder-to-spot-them-than-i-expected</link>
                                                                            <description>
                            <![CDATA[ After reading reports about AI-generated biographies flooding Amazon, I decided to see how easy they were to find — and whether I could actually tell the difference. What I discovered made me rethink how I'll shop for books online. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hcCgEeArwtL35dfeX2z4K8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/SzrvZwmC9roPvdzWXqpByE-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Sun, 26 Jul 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.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/SzrvZwmC9roPvdzWXqpByE-1280-80.png">
                                                            <media:credit><![CDATA[Future/edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amanda&#039;s AI lab]]></media:description>                                                            <media:text><![CDATA[Amanda&#039;s AI lab]]></media:text>
                                <media:title type="plain"><![CDATA[Amanda&#039;s AI lab]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/SzrvZwmC9roPvdzWXqpByE-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When ChatGPT first launched, most of the conversation centered on <a href="https://www.tomsguide.com/ai/tired-of-being-flagged-by-ai-i-started-watermarking-my-writing-to-prove-im-human">AI-generated student essays</a>, <a href="https://www.tomsguide.com/ai/openai-to-launch-deepfake-detector-as-realism-of-ai-generated-content-grows">deepfake images </a>and the <a href="https://www.tomsguide.com/computing/online-security/from-misinformation-to-ai-powered-cyberattacks-the-top-cybersecurity-risks-for-2026">threat of automated fake news</a>. Books, however, felt different. </p><p>As someone who reads and reviews half a dozen books a month for ReaderViews, I've always found a certain comfort in the traditional publishing process. Bringing a book to market has historically required editors, designers, proofreaders, and, most importantly, <a href="https://www.tomsguide.com/ai/writing-a-novel-in-2026-heres-why-chatgpt-alone-wont-get-you-to-the-finish-line">an author who actually sat down and wrote it</a>. That barrier to entry gave books an inherent authority that standard websites and fleeting social media posts often lacked.</p><p>Then I read a recent <a href="https://www.nytimes.com/2026/07/16/technology/ai-slop-books-biography-amazon.html" target="_blank">New York Times investigation</a> into AI-generated biographies appearing on Amazon. These included books about living public figures that were riddled with factual mistakes and seemingly produced with zero human oversight.</p><p>I wondered: Could I actually spot one in the wild? I opened Amazon and started searching.</p><h2 id="most-of-the-listings-looked-completely-normal">Most of the listings looked completely normal</h2><p>The most surprising part of the whole experiment was at first glance, nothing looked unusual. All the books with AI-generated content featured professional-looking covers, convincing descriptions, reasonable price points, and even star ratings. Nothing immediately screamed "AI." If I hadn't intentionally gone looking for them, I probably would have assumed they were entirely legitimate.</p><p>Once I dug a little deeper, however, the facade started to crack — and the first thing that tipped me off was the author pages. I clicked on the name behind one biography and landed on the page of someone called <a href="https://www.nytimes.com/2026/07/16/technology/ai-slop-books-biography-amazon.html">John Crane Miller</a>, described as a "seasoned biographer and cultural analyst" with a stock-photo portrait. Miller had published ten biographies in a single week, all about journalists and public figures, and when <a href="https://www.nytimes.com/by/kashmir-hill?eafs_enabled=false" target="_blank">Kashmir Hill</a> left a public review on Amazon asking to speak with him, his books quietly vanished. He wasn't the only phantom. </p><p><a href="https://originality.ai/blog/likely-ai-success-self-help-book-study">A study by Originality.ai</a> found entire catalogs built by authors who appeared to be fabricated identities, one of whom had published 74 books in five months on topics ranging from porn addiction to solo parenting to toxic workplaces. No single person writes like that. These weren't prolific indie authors with a strong work ethic; they were fake names attached to automated output.</p><h2 id="marketing-copy-was-a-dead-giveaway">Marketing copy was a dead giveaway </h2><p>Blurb after blurb leaned on the same broad promises and eerily familiar phrasing — "delve into," "comprehensive guide," "unlock the secrets of" — without ever explaining what made the book worth reading over any other book on the same topic. </p><p>After half a dozen of these, I could practically predict the next sentence before I read it. The marketing copy wasn't just generic; it was interchangeable, as if the same prompt had been run through the same model with only the subject swapped out.</p><p>The biographies were the most troubling category, and the <a href="https://www.404media.co/ai-generated-kara-swisher-biographies-flood-amazon/" target="_blank">wave of books about tech journalist Kara Swisher</a> illustrated why. Multiple unauthorized biographies of Swisher appeared on Amazon around the release of her memoir "<a href="https://www.simonandschuster.com/books/Burn-Book/Kara-Swisher/9781982163907" target="_blank">Burn Book</a>," written by authors with no apparent journalism credentials and no indication they had ever spoken to Swisher or anyone in her orbit. </p><p>Political scientist Ian Bremmer <a href="https://www.npr.org/2024/03/13/1237888126/growing-number-ai-scam-books-amazon" target="_blank">encountered the same phenomenon</a>: books bearing his name as a subject, produced without his involvement, that simply scraped and summarized what was already freely available online. This is, of course, exactly what chatbots are built to do, that is, synthesize existing information into fluent, confident-sounding prose. The result is a product that looks and feels like a real book but contributes nothing a reader couldn't get from the source material itself.</p><h2 id="beyond-books">Beyond books </h2><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="JKuR2zNYoo68T66LtMcnLB" name="subtack" alt="Amanda Caswell's substack" src="https://cdn.mos.cms.futurecdn.net/JKuR2zNYoo68T66LtMcnLB.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/Amanda Caswell)</span></figcaption></figure><p>Substack recently launched an AI detection feature in partnership with a company called <a href="https://www.tomsguide.com/ai/i-tested-pangram-the-black-light-of-ai-detection-built-by-ex-tesla-and-google-engineers-heres-how-well-it-worked">Pangram</a>, letting readers scan any post to see an estimate of how much was written by a human versus generated by AI. </p><p>Substack CEO Chris Best framed it as a way to keep the platform from becoming "like LinkedIn," <a href="https://www.pangram.com/blog/ai-in-your-feed" target="_blank">overrun with hollow AI content, </a>but even Substack acknowledges the tool isn't perfect. <a href="https://san.com/cc/substacks-new-ai-detection-tool-has-some-critics-worried-about-false-flags/" target="_blank">The Atlantic found</a> that Pangram's accuracy is far from bulletproof, and critics worry about false positives flagging legitimate human writers. </p><p>Still, the fact that a major publishing platform felt compelled to build this feature at all says something about how urgent the problem has become. Amazon, for its part, has no equivalent.</p><h2 id="the-takeaway">The takeaway </h2><p>As someone who absolutely loves to read, I found this to be a very interesting experiment. My takeaway is that now, instead of trusting a listing at face value, I take a few extra minutes to look up the author outside of Amazon to see if they have a credible publishing history elsewhere, and I specifically hunt down professional reviews rather than relying on standard star ratings. </p><p>I always preview the sample text to check if the writing feels robotic or relies on repetitive phrasing, and for nonfiction, I actively look for evidence of real human interviews and original citations. None of these steps individually guarantee a book was written by a human, but together, they make it much easier to separate thoughtful, researched work from automated content designed just to game search results.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-to-improve-my-apple-notes-app-here-are-the-7-changes-i-actually-kept">I asked ChatGPT to improve my Apple Notes app — here are the 7 changes I actually kept</a></li><li><a href="https://www.tomsguide.com/ai/microsoft-copilots-free-deep-research-ai-tool-is-going-away-these-are-the-7-best-free-alternatives">Microsoft Copilot’s free Deep Research AI tool is going away — these are the 7 best free alternatives</a></li><li><a href="https://www.tomsguide.com/ai/i-always-recommend-the-chatgpt-escape-prompt-to-friends-looking-for-a-new-job-heres-why-it-works">I always recommend the ChatGPT 'Escape Prompt' to friends looking for a new job — here's why it works</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon Alexa was down: outage affecting security systems and more ]]></title>
                                                                                                <dc:content><![CDATA[ <div class="live-content"><p>Amazon's Alexa voice assistant suffered an outage today. Starting around 11:30 a.m. Pacific, more than 2,000 reports suddenly hit the outage tracking site <a href="https://downdetector.com/status/amazon-alexa/" target="_blank">DownDetector</a>.</p><p>We also saw <a href="https://www.reddit.com/r/alexa/new/" target="_blank">reports on Reddit</a> with users asking if Alexa is down. My colleagues found delays in Alexa reporting announcements with Ring systems and the Alexa speakers weren't connecting. Some users on Reddit reported that newer Alexa devices were working but that older speakers were the main ones affected. </p></div><div class="live-content"><time datetime="2026-07-23T19:10:29+00:00">July 23, 2026 – 3:10 PM</time><h2 id="sudden-spike-on-down-detector">Sudden spike on Down Detector</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:680px;"><p class="vanilla-image-block" style="padding-top:56.62%;"><img id="8BcxjJE6FRgY9PQucL7JCn" name="Screenshot 2026-07-23 120726" alt="Alexa outage 7-23-26" src="https://cdn.mos.cms.futurecdn.net/8BcxjJE6FRgY9PQucL7JCn.png" mos="" align="middle" fullscreen="" width="680" height="385" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DownDetector)</span></figcaption></figure><p>Starting around 11:30 am Pacific, a sudden spike of over 2,000 reports suddenly hit the outage tracking site on Down Detector.</p><p>Most users just reported it was down but a couple said that their Amazon speakers weren't working.</p><p>"No response to voice commands, lots of blue lights. affecting all 3 of my smart speakers," one person wrote.</p></div><div class="live-content"><time datetime="2026-07-23T19:12:07+00:00">July 23, 2026 – 3:12 PM</time><h2 id="relay-between-ring-and-alexa-is-down">Relay between Ring and Alexa is down</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:61.67%;"><img id="Rc4eYmTQ5QsoXuCkjBi9JB" name="Ring Battery Doorbell Pro (2nd gen)" alt="Ring Battery Doorbell Pro (2nd gen)" src="https://cdn.mos.cms.futurecdn.net/Rc4eYmTQ5QsoXuCkjBi9JB.jpg" mos="" align="middle" fullscreen="" width="1500" height="925" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Ring)</span></figcaption></figure><p>My colleague John Velasco confirmed that he is getting a delay on announcements from his Ring cameras to Alexa. </p><p>"My Alexa speakers don't announce people when my Ring cameras detect them," he said.</p><p>He had a minute delay he said.</p></div><div class="live-content"><time datetime="2026-07-23T19:20:05+00:00">July 23, 2026 – 3:20 PM</time><h2 id="reports-dive-but-alexa-com-is-down">Reports dive but Alexa.com is down</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ENcHRNWoHMSJgLLu7xM6sh" name="amazon alexa event 2025" alt="Amazon Alexa+ graphic" src="https://cdn.mos.cms.futurecdn.net/ENcHRNWoHMSJgLLu7xM6sh.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon )</span></figcaption></figure><p>On DownDetector reports have taken a nose dive with people reporting things back up.</p><p>However, I've found that Alexa.com is currently inaccessible. Is it down for you?</p></div><div class="live-content"><time datetime="2026-07-23T19:23:39+00:00">July 23, 2026 – 3:23 PM</time><h2 id="multiple-reports-on-alexa-subreddit">Multiple reports on Alexa subreddit</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WXPMeDCBrXbRBUA2FYPddf" name="reddit logo 1.shutterstock_2459885999" alt="Reddit app logo on a phone with blue screens in background" src="https://cdn.mos.cms.futurecdn.net/WXPMeDCBrXbRBUA2FYPddf.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>On the<a href="https://www.reddit.com/r/alexa/new/" target="_blank"> Alexa subreddit</a>, I've seen multiple reports from Alexa users saying that the platform is down.</p><p>"My Alexa platform is unresponsive and the app interface isn't working on either my iPhone or iPad. I have performed basic troubleshooting (cold boot device and iPhone) but still unresponsive. I can ask Alexa to turn on the lights and the device lights indicate that it hears me but does not perform the task. I can also ask about the weather. Same result. Light on device acknowledging being spoken to but nothing is done. is anyone," said one post.</p><p>I have seen some people saying that the outage is only affecting their older devices but not the newer ones.</p></div><div class="live-content"><time datetime="2026-07-23T19:28:30+00:00">July 23, 2026 – 3:28 PM</time><h2 id="a-blip">A blip</h2><p>Well, it appears the outage is over. Lasting just about an hour, it's not clear what caused the Alexa platform to glitch today. </p><p>However, reports on DownDetector are at nearly zero and the systems we have  access to have started to receive normal announcements.</p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/news/live/amazon-outage-july-23-2026</link>
                                                                            <description>
                            <![CDATA[ Amazon's Alexa voice assistant appears to be suffering an outage affecting the ability to contact systems. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iB5JtaesDBEns9aFtszgoT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5P7fpww3ZptYTqpHtaZvG4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 19:08:08 +0000</pubDate>                                                                                                                                <updated>Thu, 23 Jul 2026 19:33:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Home Security]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/5P7fpww3ZptYTqpHtaZvG4-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[An Echo Show 10 with the Alexa Plus logo displayed on screen]]></media:description>                                                            <media:text><![CDATA[An Echo Show 10 with the Alexa Plus logo displayed on screen]]></media:text>
                                <media:title type="plain"><![CDATA[An Echo Show 10 with the Alexa Plus logo displayed on screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5P7fpww3ZptYTqpHtaZvG4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="live-content"><p>Amazon's Alexa voice assistant suffered an outage today. Starting around 11:30 a.m. Pacific, more than 2,000 reports suddenly hit the outage tracking site <a href="https://downdetector.com/status/amazon-alexa/" target="_blank">DownDetector</a>.</p><p>We also saw <a href="https://www.reddit.com/r/alexa/new/" target="_blank">reports on Reddit</a> with users asking if Alexa is down. My colleagues found delays in Alexa reporting announcements with Ring systems and the Alexa speakers weren't connecting. Some users on Reddit reported that newer Alexa devices were working but that older speakers were the main ones affected. </p></div><div class="live-content"><time datetime="2026-07-23T19:10:29+00:00">July 23, 2026 – 3:10 PM</time><h2 id="sudden-spike-on-down-detector">Sudden spike on Down Detector</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:680px;"><p class="vanilla-image-block" style="padding-top:56.62%;"><img id="8BcxjJE6FRgY9PQucL7JCn" name="Screenshot 2026-07-23 120726" alt="Alexa outage 7-23-26" src="https://cdn.mos.cms.futurecdn.net/8BcxjJE6FRgY9PQucL7JCn.png" mos="" align="middle" fullscreen="" width="680" height="385" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DownDetector)</span></figcaption></figure><p>Starting around 11:30 am Pacific, a sudden spike of over 2,000 reports suddenly hit the outage tracking site on Down Detector.</p><p>Most users just reported it was down but a couple said that their Amazon speakers weren't working.</p><p>"No response to voice commands, lots of blue lights. affecting all 3 of my smart speakers," one person wrote.</p></div><div class="live-content"><time datetime="2026-07-23T19:12:07+00:00">July 23, 2026 – 3:12 PM</time><h2 id="relay-between-ring-and-alexa-is-down">Relay between Ring and Alexa is down</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:61.67%;"><img id="Rc4eYmTQ5QsoXuCkjBi9JB" name="Ring Battery Doorbell Pro (2nd gen)" alt="Ring Battery Doorbell Pro (2nd gen)" src="https://cdn.mos.cms.futurecdn.net/Rc4eYmTQ5QsoXuCkjBi9JB.jpg" mos="" align="middle" fullscreen="" width="1500" height="925" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Ring)</span></figcaption></figure><p>My colleague John Velasco confirmed that he is getting a delay on announcements from his Ring cameras to Alexa. </p><p>"My Alexa speakers don't announce people when my Ring cameras detect them," he said.</p><p>He had a minute delay he said.</p></div><div class="live-content"><time datetime="2026-07-23T19:20:05+00:00">July 23, 2026 – 3:20 PM</time><h2 id="reports-dive-but-alexa-com-is-down">Reports dive but Alexa.com is down</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ENcHRNWoHMSJgLLu7xM6sh" name="amazon alexa event 2025" alt="Amazon Alexa+ graphic" src="https://cdn.mos.cms.futurecdn.net/ENcHRNWoHMSJgLLu7xM6sh.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon )</span></figcaption></figure><p>On DownDetector reports have taken a nose dive with people reporting things back up.</p><p>However, I've found that Alexa.com is currently inaccessible. Is it down for you?</p></div><div class="live-content"><time datetime="2026-07-23T19:23:39+00:00">July 23, 2026 – 3:23 PM</time><h2 id="multiple-reports-on-alexa-subreddit">Multiple reports on Alexa subreddit</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WXPMeDCBrXbRBUA2FYPddf" name="reddit logo 1.shutterstock_2459885999" alt="Reddit app logo on a phone with blue screens in background" src="https://cdn.mos.cms.futurecdn.net/WXPMeDCBrXbRBUA2FYPddf.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>On the<a href="https://www.reddit.com/r/alexa/new/" target="_blank"> Alexa subreddit</a>, I've seen multiple reports from Alexa users saying that the platform is down.</p><p>"My Alexa platform is unresponsive and the app interface isn't working on either my iPhone or iPad. I have performed basic troubleshooting (cold boot device and iPhone) but still unresponsive. I can ask Alexa to turn on the lights and the device lights indicate that it hears me but does not perform the task. I can also ask about the weather. Same result. Light on device acknowledging being spoken to but nothing is done. is anyone," said one post.</p><p>I have seen some people saying that the outage is only affecting their older devices but not the newer ones.</p></div><div class="live-content"><time datetime="2026-07-23T19:28:30+00:00">July 23, 2026 – 3:28 PM</time><h2 id="a-blip">A blip</h2><p>Well, it appears the outage is over. Lasting just about an hour, it's not clear what caused the Alexa platform to glitch today. </p><p>However, reports on DownDetector are at nearly zero and the systems we have  access to have started to receive normal announcements.</p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Jeff Bezos reportedly pushing for Prime Video overhaul that puts AI front and center ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Prime Video could be getting an AI overhaul at the behest of Amazon founder Jeff Bezos, according to a new report. The redesign would put AI front and center under a new project allegedly dubbed Lighthouse.</p><p><a href="https://www.reuters.com/business/media-telecom/amazons-bezos-pushes-prime-video-redesign-focused-ai-2026-07-23/" target="_blank">Reuters</a> reports that the push from Bezos is meant as a way for Amazon to utilize its massive investments in AI and "elevate the company's stature in artificial intelligence." This comes as other investments, including improving the Alexa voice assistant, have provided mixed results and ongoing losses.</p><p>Bezos was "displeased" with a Prime Video presentation last fall where AI was not highlighted. The Lighthouse project was born out of this meeting.</p><h2 id="what-does-lighthouse-add-to-prime-video">What does Lighthouse add to Prime Video?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="drYYfdJ36CcqYV9vHHGK6g" name="thelighthouse.jpg" alt="Best movies on Amazon: The Lighthouse" src="https://cdn.mos.cms.futurecdn.net/drYYfdJ36CcqYV9vHHGK6g.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: A24)</span></figcaption></figure><p>Bezos is said to be personally involved in the overhaul, an unusual step considering he relinquished the CEO title in 2021 to focus on the Washington Post and his spaceflight company Blue Origin.</p><p>Per Reuters, Lighthouse would add a slew of new features that would use AI to improve film and TV show recommendations. This would be done by having the AI learn customer preferences and respond to spoken requests.</p><p>A homepage redesign is part of the project, but it's not finalized, so it's not known how it would look yet. </p><p>However, it was suggested that it could include AI-driven titles with viewing suggestions like "Christmas rom-coms" or "action movies from the 1980s." Reportedly, a current version doesn't include text-heavy titles, so that even that appears to still be in the air.</p><p>Programs and live events like Thursday Night Football would still be promoted in the upper portion of the platform alongside the traditional search bar.</p><p>Amazon is also supposedly attempting to integrate Alexa into Prime Video's search function as part of the redesign. Most recently, Alexa was <a href="https://www.tomsguide.com/ai/alexa-release-date-cost-devices-and-all-the-new-ai-features">overhauled into a generative AI version</a> last year and integrated into the <a href="https://www.tomsguide.com/ai/alexa-just-got-a-major-upgrade-for-the-holidays-here-are-the-new-shopping-and-home-features-im-most-excited-about">Amazon shopping platform</a> earlier this year.</p><h2 id="where-prime-video-stands">Where Prime Video stands</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zWqHCpTxYNgNF2cEkpZ93U" name="primevideo-logo-blueelectric" alt="Prime Video logo on blue electric currents background" src="https://cdn.mos.cms.futurecdn.net/zWqHCpTxYNgNF2cEkpZ93U.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Prime Video; Shutterstock)</span></figcaption></figure><p>Amazon last gave <a href="https://www.tomsguide.com/entertainment/streaming/prime-video-is-getting-a-massive-redesign-heres-whats-new">Prime Video a massive update </a>in July of 2024 that streamlined content curation and added AI recommendations.</p><p>The most r<a href="https://www.nielsen.com/news-center/2025/youtube-netflix-ride-the-wave-of-summer-streaming-highs-in-nielsens-media-distributor-gauge/">ecent Nielsen data from 2025</a> has Prime Video in a distant eighth place in TV viewing share behind YouTube, Netflix and Disney+ at 3.9% of viewers. Reuters reports that it's bumped up to 4.2% this year, though still behind Netflix and Disney.</p><p>An AI overhaul could be a way for the company to utilize both its artificial intelligence investments and increase viewership with more personalized recommendations.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/amazon-prime-usd2-5-billion-settlement-deadline-is-days-away-heres-how-to-claim-your-share">Amazon Prime $2.5 billion settlement deadline is days away — here's how to claim your share</a></li><li><a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">Read anywhere with the best Kindle and e-readers we tested for books, comics and note-taking</a></li><li><a href="https://www.tomsguide.com/computing/e-readers/sorry-kindle-but-i-still-prefer-reading-comic-books-on-my-ipad">Sorry, Kindle — but I still prefer reading comic books on my iPad</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/jeff-bezos-reportedly-pushing-for-prime-video-overhaul-that-puts-ai-front-and-center</link>
                                                                            <description>
                            <![CDATA[ A new report claims Jeff Bezos is personally advocating for an AI-first overhaul of Prime Video. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">GCfR7zxVKusC2L8wiytg5n</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fZ72AHPgRrZVefGKSdC9Zk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 18:26:23 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/fZ72AHPgRrZVefGKSdC9Zk-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Jeff Bezos speaking at a VATECH event]]></media:description>                                                            <media:text><![CDATA[Jeff Bezos speaking at a VATECH event]]></media:text>
                                <media:title type="plain"><![CDATA[Jeff Bezos speaking at a VATECH event]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fZ72AHPgRrZVefGKSdC9Zk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Video could be getting an AI overhaul at the behest of Amazon founder Jeff Bezos, according to a new report. The redesign would put AI front and center under a new project allegedly dubbed Lighthouse.</p><p><a href="https://www.reuters.com/business/media-telecom/amazons-bezos-pushes-prime-video-redesign-focused-ai-2026-07-23/" target="_blank">Reuters</a> reports that the push from Bezos is meant as a way for Amazon to utilize its massive investments in AI and "elevate the company's stature in artificial intelligence." This comes as other investments, including improving the Alexa voice assistant, have provided mixed results and ongoing losses.</p><p>Bezos was "displeased" with a Prime Video presentation last fall where AI was not highlighted. The Lighthouse project was born out of this meeting.</p><h2 id="what-does-lighthouse-add-to-prime-video">What does Lighthouse add to Prime Video?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="drYYfdJ36CcqYV9vHHGK6g" name="thelighthouse.jpg" alt="Best movies on Amazon: The Lighthouse" src="https://cdn.mos.cms.futurecdn.net/drYYfdJ36CcqYV9vHHGK6g.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: A24)</span></figcaption></figure><p>Bezos is said to be personally involved in the overhaul, an unusual step considering he relinquished the CEO title in 2021 to focus on the Washington Post and his spaceflight company Blue Origin.</p><p>Per Reuters, Lighthouse would add a slew of new features that would use AI to improve film and TV show recommendations. This would be done by having the AI learn customer preferences and respond to spoken requests.</p><p>A homepage redesign is part of the project, but it's not finalized, so it's not known how it would look yet. </p><p>However, it was suggested that it could include AI-driven titles with viewing suggestions like "Christmas rom-coms" or "action movies from the 1980s." Reportedly, a current version doesn't include text-heavy titles, so that even that appears to still be in the air.</p><p>Programs and live events like Thursday Night Football would still be promoted in the upper portion of the platform alongside the traditional search bar.</p><p>Amazon is also supposedly attempting to integrate Alexa into Prime Video's search function as part of the redesign. Most recently, Alexa was <a href="https://www.tomsguide.com/ai/alexa-release-date-cost-devices-and-all-the-new-ai-features">overhauled into a generative AI version</a> last year and integrated into the <a href="https://www.tomsguide.com/ai/alexa-just-got-a-major-upgrade-for-the-holidays-here-are-the-new-shopping-and-home-features-im-most-excited-about">Amazon shopping platform</a> earlier this year.</p><h2 id="where-prime-video-stands">Where Prime Video stands</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zWqHCpTxYNgNF2cEkpZ93U" name="primevideo-logo-blueelectric" alt="Prime Video logo on blue electric currents background" src="https://cdn.mos.cms.futurecdn.net/zWqHCpTxYNgNF2cEkpZ93U.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Prime Video; Shutterstock)</span></figcaption></figure><p>Amazon last gave <a href="https://www.tomsguide.com/entertainment/streaming/prime-video-is-getting-a-massive-redesign-heres-whats-new">Prime Video a massive update </a>in July of 2024 that streamlined content curation and added AI recommendations.</p><p>The most r<a href="https://www.nielsen.com/news-center/2025/youtube-netflix-ride-the-wave-of-summer-streaming-highs-in-nielsens-media-distributor-gauge/">ecent Nielsen data from 2025</a> has Prime Video in a distant eighth place in TV viewing share behind YouTube, Netflix and Disney+ at 3.9% of viewers. Reuters reports that it's bumped up to 4.2% this year, though still behind Netflix and Disney.</p><p>An AI overhaul could be a way for the company to utilize both its artificial intelligence investments and increase viewership with more personalized recommendations.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/amazon-prime-usd2-5-billion-settlement-deadline-is-days-away-heres-how-to-claim-your-share">Amazon Prime $2.5 billion settlement deadline is days away — here's how to claim your share</a></li><li><a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">Read anywhere with the best Kindle and e-readers we tested for books, comics and note-taking</a></li><li><a href="https://www.tomsguide.com/computing/e-readers/sorry-kindle-but-i-still-prefer-reading-comic-books-on-my-ipad">Sorry, Kindle — but I still prefer reading comic books on my iPad</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon Prime $2.5 billion settlement deadline is days away — here's how to claim your share ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Time is running out to grab your cut of Amazon’s massive $2.5 billion settlement with the Federal Trade Commission (FTC). </p><p>If you accidentally ended up paying for a Prime membership or struggled to cancel one, you could be owed up to $51, but <strong>the deadline to submit a claim is fast approaching on Monday, July 27</strong>.</p><p>The payout stems from an FTC lawsuit alleging Amazon used deceptive design tactics to trick customers into signing up for Prime subscriptions and intentionally made the cancellation process confusing. </p><p>While Amazon paid $1 billion in civil penalties, the remaining $1.5 billion was earmarked directly for affected consumers.</p><p>Automatic refunds were disbursed to the first wave of users <a href="https://www.tomsguide.com/computing/internet/how-to-claim-your-amazon-prime-settlement-refund-as-payments-start-going-out">late last year</a>, but millions of additional shoppers are eligible for the second payout phase, provided they act before the deadline.</p><h2 id="who-qualifies-for-a-refund">Who qualifies for a refund?</h2><p>You don't need to currently hold an active Prime account to file a claim, but you must meet all four of the following criteria:</p><ul><li>You must be a <strong>U.S. consumer</strong>.<br></li><li>You <strong>enrolled in Amazon Prime between June 23, 2019, and June 23, 2025</strong> through a challenged checkout page, OR attempted to cancel during that period and were unable to do so.<br></li><li>You <strong>used fewer than 10 Prime benefits</strong> (such as streaming Prime Video, using free shipping, or Prime Reading) <strong>during any 12-month period </strong>of your enrollment.<br></li><li><strong>You did not already receive an automatic refund during Phase 1</strong> (which was paid out in late 2025 to ultra-low usage customers who used 3 or fewer benefits).<br></li><li>If you used between 4 and 9 Prime benefits, you were not eligible for the automatic Phase 1 payment — meaning <strong>you must manually file a claim before the July 27 deadline </strong>to receive your payout.</li></ul><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="9q9uD2jmqJAPMpwiEHKe6E" name="prime video 2.jpg" alt="Amazon Prime Video logo on a phone being held by someone" src="https://cdn.mos.cms.futurecdn.net/9q9uD2jmqJAPMpwiEHKe6E.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: Kicking Studio/Shutterstock)</span></figcaption></figure><h2 id="how-to-file-your-claim">How to file your claim </h2><p>Filing takes less than five minutes online through the official administrator at <a href="https://www.subscriptionmembershipsettlement.com/"><strong>SubscriptionMembershipSettlement.com</strong></a>. </p><p>First, <strong>check your inbox for a message sent from subscriptionmembershipsettlement.com in January</strong>, which contains a unique Claim ID and PIN to expedite the process. </p><p>If you can't find that notice, <strong>simply select the option stating "I DO NOT have a Claim ID and PIN"</strong> on the homepage to manually enter your name, address, and Amazon account details. </p><p><strong>You can choose to receive your payout via direct deposit, PayPal, Venmo, or check</strong>. Once the July 27 filing window closes, Amazon will review all submitted claims, with approved payouts expected to be disbursed in late 2026.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O9231X"></div>                            </div>                            <script src="https://kwizly.com/embed/O9231X.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/internet/amazon-1-5-ftc-settlement-the-biggest-questions-answered">Amazon's $1.5 billion Prime settlement explained — your most common questions answered</a></li><li><a href="https://www.tomsguide.com/sales-events/amazon-has-a-hidden-button-that-connects-you-with-a-real-customer-service-agent-heres-where-to-find-it">Amazon has a hidden button that connects you with a real customer service agent — here's where to find it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-is-paying-usd250-million-to-iphone-customers-over-delayed-ai-features-heres-how-to-get-your-share">Apple is paying $250 million to iPhone customers over delayed AI features — here's how to get your share</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/home/amazon-prime-usd2-5-billion-settlement-deadline-is-days-away-heres-how-to-claim-your-share</link>
                                                                            <description>
                            <![CDATA[ How to get your share of Amazon’s $2.5 billion FTC settlement before the deadline. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">j9koNBb3sq3k6GQuDwJszW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wmVm3TePyjJDn24ewHmcBh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 16:08:18 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home]]></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/wmVm3TePyjJDn24ewHmcBh-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon logo on a building]]></media:description>                                                            <media:text><![CDATA[Amazon logo on a building]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon logo on a building]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wmVm3TePyjJDn24ewHmcBh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Time is running out to grab your cut of Amazon’s massive $2.5 billion settlement with the Federal Trade Commission (FTC). </p><p>If you accidentally ended up paying for a Prime membership or struggled to cancel one, you could be owed up to $51, but <strong>the deadline to submit a claim is fast approaching on Monday, July 27</strong>.</p><p>The payout stems from an FTC lawsuit alleging Amazon used deceptive design tactics to trick customers into signing up for Prime subscriptions and intentionally made the cancellation process confusing. </p><p>While Amazon paid $1 billion in civil penalties, the remaining $1.5 billion was earmarked directly for affected consumers.</p><p>Automatic refunds were disbursed to the first wave of users <a href="https://www.tomsguide.com/computing/internet/how-to-claim-your-amazon-prime-settlement-refund-as-payments-start-going-out">late last year</a>, but millions of additional shoppers are eligible for the second payout phase, provided they act before the deadline.</p><h2 id="who-qualifies-for-a-refund">Who qualifies for a refund?</h2><p>You don't need to currently hold an active Prime account to file a claim, but you must meet all four of the following criteria:</p><ul><li>You must be a <strong>U.S. consumer</strong>.<br></li><li>You <strong>enrolled in Amazon Prime between June 23, 2019, and June 23, 2025</strong> through a challenged checkout page, OR attempted to cancel during that period and were unable to do so.<br></li><li>You <strong>used fewer than 10 Prime benefits</strong> (such as streaming Prime Video, using free shipping, or Prime Reading) <strong>during any 12-month period </strong>of your enrollment.<br></li><li><strong>You did not already receive an automatic refund during Phase 1</strong> (which was paid out in late 2025 to ultra-low usage customers who used 3 or fewer benefits).<br></li><li>If you used between 4 and 9 Prime benefits, you were not eligible for the automatic Phase 1 payment — meaning <strong>you must manually file a claim before the July 27 deadline </strong>to receive your payout.</li></ul><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="9q9uD2jmqJAPMpwiEHKe6E" name="prime video 2.jpg" alt="Amazon Prime Video logo on a phone being held by someone" src="https://cdn.mos.cms.futurecdn.net/9q9uD2jmqJAPMpwiEHKe6E.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: Kicking Studio/Shutterstock)</span></figcaption></figure><h2 id="how-to-file-your-claim">How to file your claim </h2><p>Filing takes less than five minutes online through the official administrator at <a href="https://www.subscriptionmembershipsettlement.com/"><strong>SubscriptionMembershipSettlement.com</strong></a>. </p><p>First, <strong>check your inbox for a message sent from subscriptionmembershipsettlement.com in January</strong>, which contains a unique Claim ID and PIN to expedite the process. </p><p>If you can't find that notice, <strong>simply select the option stating "I DO NOT have a Claim ID and PIN"</strong> on the homepage to manually enter your name, address, and Amazon account details. </p><p><strong>You can choose to receive your payout via direct deposit, PayPal, Venmo, or check</strong>. Once the July 27 filing window closes, Amazon will review all submitted claims, with approved payouts expected to be disbursed in late 2026.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O9231X"></div>                            </div>                            <script src="https://kwizly.com/embed/O9231X.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/internet/amazon-1-5-ftc-settlement-the-biggest-questions-answered">Amazon's $1.5 billion Prime settlement explained — your most common questions answered</a></li><li><a href="https://www.tomsguide.com/sales-events/amazon-has-a-hidden-button-that-connects-you-with-a-real-customer-service-agent-heres-where-to-find-it">Amazon has a hidden button that connects you with a real customer service agent — here's where to find it</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-is-paying-usd250-million-to-iphone-customers-over-delayed-ai-features-heres-how-to-get-your-share">Apple is paying $250 million to iPhone customers over delayed AI features — here's how to get your share</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 17 affordable Amazon home and garden buys to elevate your space — up to 50% off patio furniture, decor and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We're right in the middle of summer. Now that we're not in the midst of a heatwave, the temperatures outdoors are actually enjoyable — so it's a great time to upgrade your outdoor space and make the most of it.</p><p>Right now <a href="https://www.amazon.co.uk/gp/browse.html?node=11052671" target="_blank" rel="nofollow">Amazon is taking up to 50% off patio furniture, decor and gardening essentials</a>, so you can transform your living space without breaking the bank. I've been searching the site for the best affordable upgrades, so keep scrolling to check them out. (I also recommend taking a look at our <a href="https://www.tomsguide.com/coupons/amazon-uk">Amazon promo codes</a> coverage.)</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.amazon.co.uk/deals" target="_blank" rel="nofollow"><strong>shop all deals at Amazon</strong></a></li><li><strong>Baby Bio Houseplant Food, 175ml: </strong><a href="https://www.amazon.co.uk/SBM-Life-Science-Baby-Houseplant/dp/B000TROMB2" target="_blank" rel="nofollow"><strong>was £4 now £2</strong></a></li><li><strong>Grills & outdoor cooking: </strong><a href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow"><strong>deals from £3</strong></a></li><li><strong>Resolva Pro Ready To Use Weed Killer, 3 Litre: </strong><a href="https://www.amazon.co.uk/Resolva-Ready-Weed-Killer-Litre/dp/B0779JGM1S" target="_blank" rel="nofollow"><strong>was £18 now £14</strong></a></li><li><strong>Garden decor: </strong><a href="https://www.amazon.co.uk/b?node=27917239031" target="_blank" rel="nofollow"><strong>from £15</strong></a></li><li><strong>Vounot Garden Parasol: </strong><a href="https://www.amazon.co.uk/VOUNOT-Parasol-Balcony-Umbrella-Rectangular/dp/B08F55XT6L" target="_blank" rel="nofollow"><strong>was £24 now £21</strong></a></li><li><strong>Keter City 113L Outdoor Storage Box: </strong><a href="https://www.amazon.co.uk/Keter-242798-City-Box-Chest/dp/B07NQ6R7R1" target="_blank" rel="nofollow"><strong>was £32 now £24</strong></a></li><li><strong>Lawnmower sale: </strong><a href="https://www.amazon.co.uk/b/?node=11714761" target="_blank" rel="nofollow"><strong>deals from £40</strong></a></li><li><strong>Garden Vida 2 Seater Rattan Bistro Set: </strong><a href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow"><strong>was £99 now £69</strong></a></li><li><strong>Weber Compact 47 cm Portable Kettle Charcoal BBQ: </strong><a href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow"><strong>was £99 now £82</strong></a></li><li><strong>Kitchen & home appliances: </strong><a href="https://www.amazon.co.uk/b?node=391784011" target="_blank" rel="nofollow"><strong>up to 40% off De'Longhi, Shark, Ninja</strong></a></li><li><strong>Ring smart home security: </strong><a href="https://www.amazon.co.uk/stores/page/28BC3C0A-5C1C-4C60-96CC-32489E917877" target="_blank" rel="nofollow"><strong>up to 61% off</strong></a></li></ul><h3 class="article-body__section" id="section-gardening"><span>Gardening</span></h3><div class="product"><a data-dimension112="5e07ab70-867d-11f1-bfa7-1ba9ad9afb9d" data-action="Deal Block" data-label="Houseplant Food, 175ml" data-dimension48="Houseplant Food, 175ml" data-dimension25="£2" href="https://www.amazon.co.uk/SBM-Life-Science-Baby-Houseplant/dp/B000TROMB2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:673px;"><p class="vanilla-image-block" style="padding-top:222.88%;"><img id="sgFFaDbCtGDrs8sSPzo835" name="Houseplant Food, 175ml" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/sgFFaDbCtGDrs8sSPzo835.jpg" mos="" align="middle" fullscreen="" width="673" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/SBM-Life-Science-Baby-Houseplant/dp/B000TROMB2" target="_blank" rel="nofollow" data-dimension112="5e07ab70-867d-11f1-bfa7-1ba9ad9afb9d" data-action="Deal Block" data-label="Houseplant Food, 175ml" data-dimension48="Houseplant Food, 175ml" data-dimension25="£2">Houseplant Food, 175ml: was £4 now £2</a></strong><br>This Baby Bio fertilizer is on sale for 52% off, so now's the time to stock up. Just add a few drops to your houseplant's soil for greener leaves and more vibrant flowers.<a class="view-deal button" href="https://www.amazon.co.uk/SBM-Life-Science-Baby-Houseplant/dp/B000TROMB2" target="_blank" rel="nofollow" data-dimension112="5e07ab70-867d-11f1-bfa7-1ba9ad9afb9d" data-action="Deal Block" data-label="Houseplant Food, 175ml" data-dimension48="Houseplant Food, 175ml" data-dimension25="£2">View Deal</a></p></div><div class="product"><a data-dimension112="5e07abde-867d-11f1-9784-ad73e18d6d92" data-action="Deal Block" data-label="Pro Ready To Use Weed Killer, 3 Litre" data-dimension48="Pro Ready To Use Weed Killer, 3 Litre" data-dimension25="£14" href="https://www.amazon.co.uk/Resolva-Ready-Weed-Killer-Litre/dp/B0779JGM1S" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="TEvnfa9TcKyB9PbZms6owJ" name="Pro Ready To Use Weed Killer, 3 Litre" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TEvnfa9TcKyB9PbZms6owJ.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Resolva-Ready-Weed-Killer-Litre/dp/B0779JGM1S" target="_blank" rel="nofollow" data-dimension112="5e07abde-867d-11f1-9784-ad73e18d6d92" data-action="Deal Block" data-label="Pro Ready To Use Weed Killer, 3 Litre" data-dimension48="Pro Ready To Use Weed Killer, 3 Litre" data-dimension25="£14">Pro Ready To Use Weed Killer, 3 Litre: was £18 now £14</a></strong><br>Need to take care of weeds? This pack of Resolva weed killer has enough to treat 111 sq m and tackles everything from dandelions to bindweed. <a class="view-deal button" href="https://www.amazon.co.uk/Resolva-Ready-Weed-Killer-Litre/dp/B0779JGM1S" target="_blank" rel="nofollow" data-dimension112="5e07abde-867d-11f1-9784-ad73e18d6d92" data-action="Deal Block" data-label="Pro Ready To Use Weed Killer, 3 Litre" data-dimension48="Pro Ready To Use Weed Killer, 3 Litre" data-dimension25="£14">View Deal</a></p></div><div class="product"><a data-dimension112="5e07ac56-867d-11f1-84b7-81ade7d900a9" data-action="Deal Block" data-label="Lawnmower sale: deals from £40 @ Amazon" data-dimension48="Lawnmower sale: deals from £40 @ Amazon" href="https://www.amazon.co.uk/b/?node=11714761" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1139px;"><p class="vanilla-image-block" style="padding-top:131.69%;"><img id="n7UFr5BuvWfHJ2eNdxQPWf" name="Flymo EasiGlide 300 Hover Collect Lawn Mower" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/n7UFr5BuvWfHJ2eNdxQPWf.jpg" mos="" align="middle" fullscreen="" width="1139" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Lawnmower sale: </strong><a href="https://www.amazon.co.uk/b/?node=11714761" target="_blank" rel="nofollow" data-dimension112="5e07ac56-867d-11f1-84b7-81ade7d900a9" data-action="Deal Block" data-label="Lawnmower sale: deals from £40 @ Amazon" data-dimension48="Lawnmower sale: deals from £40 @ Amazon" data-dimension25=""><strong>deals from £40 @ Amazon</strong></a><br>If your grass has gotten out of control over winter, Amazon has deals on lawnmowers from £40. The sale includes brands like Flymo, Bosch and more.<a class="view-deal button" href="https://www.amazon.co.uk/b/?node=11714761" target="_blank" rel="nofollow" data-dimension112="5e07ac56-867d-11f1-84b7-81ade7d900a9" data-action="Deal Block" data-label="Lawnmower sale: deals from £40 @ Amazon" data-dimension48="Lawnmower sale: deals from £40 @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="5e07acc4-867d-11f1-954d-e52fe9de4a7c" data-action="Deal Block" data-label="High Pressure Washer UniversalAquatak 135" data-dimension48="High Pressure Washer UniversalAquatak 135" data-dimension25="£114" href="https://www.amazon.co.uk/dp/B06XRWS76H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1149px;"><p class="vanilla-image-block" style="padding-top:100.17%;"><img id="rBF6jAHrGZhSCKrmgKLERf" name="High Pressure Washer UniversalAquatak 135" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rBF6jAHrGZhSCKrmgKLERf.jpg" mos="" align="middle" fullscreen="" width="1149" height="1151" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/dp/B06XRWS76H" target="_blank" rel="nofollow" data-dimension112="5e07acc4-867d-11f1-954d-e52fe9de4a7c" data-action="Deal Block" data-label="High Pressure Washer UniversalAquatak 135" data-dimension48="High Pressure Washer UniversalAquatak 135" data-dimension25="£114">High Pressure Washer UniversalAquatak 135: was £123 now £114</a></strong><br>This Bosch pressure washer is on sale for just over £100, so now is a great time to pick it up. Its 3-in-1 nozzle is perfect for a variety of cleaning tasks, and it delivers 135 bar pressure.<a class="view-deal button" href="https://www.amazon.co.uk/dp/B06XRWS76H" target="_blank" rel="nofollow" data-dimension112="5e07acc4-867d-11f1-954d-e52fe9de4a7c" data-action="Deal Block" data-label="High Pressure Washer UniversalAquatak 135" data-dimension48="High Pressure Washer UniversalAquatak 135" data-dimension25="£114">View Deal</a></p></div><div class="product"><a data-dimension112="5e07ad3c-867d-11f1-8c4b-b3c36843bcd9" data-action="Deal Block" data-label="40V Cordless Lawnmower" data-dimension48="40V Cordless Lawnmower" data-dimension25="£209" href="https://www.amazon.co.uk/dp/B0721LYLZK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:88.20%;"><img id="PptfBKbBAv9mEzFcrBT2gK" name="40V Cordless Lawnmower" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PptfBKbBAv9mEzFcrBT2gK.jpg" mos="" align="middle" fullscreen="" width="1500" height="1323" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/dp/B0721LYLZK" target="_blank" rel="nofollow" data-dimension112="5e07ad3c-867d-11f1-8c4b-b3c36843bcd9" data-action="Deal Block" data-label="40V Cordless Lawnmower" data-dimension48="40V Cordless Lawnmower" data-dimension25="£209">40V Cordless Lawnmower: was £299 now £209</a></strong><br>This Greenworks lawnmower is a popular pick on Amazon, and it's now been discounted by 30%. It's suited for lawns up to 400m. One reviewer on Amazon loves this mower, and wrote "To anyone with a small to medium size garden I cannot recommend this mower enough, I guarantee you will not be disappointed."<a class="view-deal button" href="https://www.amazon.co.uk/dp/B0721LYLZK" target="_blank" rel="nofollow" data-dimension112="5e07ad3c-867d-11f1-8c4b-b3c36843bcd9" data-action="Deal Block" data-label="40V Cordless Lawnmower" data-dimension48="40V Cordless Lawnmower" data-dimension25="£209">View Deal</a></p></div><h3 class="article-body__section" id="section-furniture-and-decor"><span>Furniture and decor</span></h3><div class="product"><a data-dimension112="d9bfe6e4-8680-11f1-8aae-27592f0e3a13" data-action="Deal Block" data-label="Tablecloth Clips 8 Pack" data-dimension48="Tablecloth Clips 8 Pack" data-dimension25="£5" href="https://www.amazon.co.uk/Blooven-Tablecloth-Stainless-Clamps-Holders/dp/B07CWSP9LT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:93.53%;"><img id="9bZFCfwoqjvjifHjXWV9GV" name="Tablecloth Clips 8 Pack" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9bZFCfwoqjvjifHjXWV9GV.jpg" mos="" align="middle" fullscreen="" width="1500" height="1403" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Blooven-Tablecloth-Stainless-Clamps-Holders/dp/B07CWSP9LT" target="_blank" rel="nofollow" data-dimension112="d9bfe6e4-8680-11f1-8aae-27592f0e3a13" data-action="Deal Block" data-label="Tablecloth Clips 8 Pack" data-dimension48="Tablecloth Clips 8 Pack" data-dimension25="£5">Tablecloth Clips 8 Pack: was £7 now £5</a></strong><br>One of those little essentials you can't go without — these clips will stop your tablecloth from blowing around if the wind picks up. £5 is definitely worth it to save your snacks and drinks from knocking over.<a class="view-deal button" href="https://www.amazon.co.uk/Blooven-Tablecloth-Stainless-Clamps-Holders/dp/B07CWSP9LT" target="_blank" rel="nofollow" data-dimension112="d9bfe6e4-8680-11f1-8aae-27592f0e3a13" data-action="Deal Block" data-label="Tablecloth Clips 8 Pack" data-dimension48="Tablecloth Clips 8 Pack" data-dimension25="£5">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff008-8680-11f1-9dc7-63c9dbbaa02a" data-action="Deal Block" data-label="Outdoor Cushion Covers" data-dimension48="Outdoor Cushion Covers" data-dimension25="£11" href="https://www.amazon.co.uk/Brentfords-Geometric-Cushion-Resistant-Decorative/dp/B0BXQKDH9T" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:99.20%;"><img id="hSgvXQEzedjWpcU6RVDW7" name="Outdoor Cushion Covers" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hSgvXQEzedjWpcU6RVDW7.jpg" mos="" align="middle" fullscreen="" width="1500" height="1488" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Protect your cushions from the elements! This set of outdoor cushion covers measures 45 x 45 cm and has an eye-catching grey and white geometric design.<a class="view-deal button" href="https://www.amazon.co.uk/Brentfords-Geometric-Cushion-Resistant-Decorative/dp/B0BXQKDH9T" target="_blank" rel="nofollow" data-dimension112="d9bff008-8680-11f1-9dc7-63c9dbbaa02a" data-action="Deal Block" data-label="Outdoor Cushion Covers" data-dimension48="Outdoor Cushion Covers" data-dimension25="£11">View Deal</a></p></div><div class="product"><a data-dimension112="5e07ae18-867d-11f1-adce-4b3a8ccf3c20" data-action="Deal Block" data-label="Garden Parasol" data-dimension48="Garden Parasol" data-dimension25="£21" href="https://www.amazon.co.uk/VOUNOT-Parasol-Balcony-Umbrella-Rectangular/dp/B08F55XT6L" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1488px;"><p class="vanilla-image-block" style="padding-top:100.81%;"><img id="aY5HddTDeyVe2wgaaZzgJJ" name="Garden Parasol" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aY5HddTDeyVe2wgaaZzgJJ.jpg" mos="" align="middle" fullscreen="" width="1488" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/VOUNOT-Parasol-Balcony-Umbrella-Rectangular/dp/B08F55XT6L" target="_blank" rel="nofollow" data-dimension112="5e07ae18-867d-11f1-adce-4b3a8ccf3c20" data-action="Deal Block" data-label="Garden Parasol" data-dimension48="Garden Parasol" data-dimension25="£21">Garden Parasol: was £24 now £21</a></strong><br>This rectangular parasol is 200 x 125 cm and can tilt to shade your patio or garden at the perfect angle! At just over £20, it's incredibly affordable and there are three colour options to pick from.<a class="view-deal button" href="https://www.amazon.co.uk/VOUNOT-Parasol-Balcony-Umbrella-Rectangular/dp/B08F55XT6L" target="_blank" rel="nofollow" data-dimension112="5e07ae18-867d-11f1-adce-4b3a8ccf3c20" data-action="Deal Block" data-label="Garden Parasol" data-dimension48="Garden Parasol" data-dimension25="£21">View Deal</a></p></div><div class="product"><a data-dimension112="5e07ae90-867d-11f1-aa6c-618b1c5f7570" data-action="Deal Block" data-label="113L Outdoor Storage Box" data-dimension48="113L Outdoor Storage Box" data-dimension25="£24" href="https://www.amazon.co.uk/Keter-242798-City-Box-Chest/dp/B07NQ6R7R1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:99.20%;"><img id="wD7BHHj5Tk3KH5sZKiC7aQ" name="113L Outdoor 96% recycled Small Balcony Garden Furniture Storage Box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wD7BHHj5Tk3KH5sZKiC7aQ.jpg" mos="" align="middle" fullscreen="" width="1500" height="1488" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Keter-242798-City-Box-Chest/dp/B07NQ6R7R1" target="_blank" rel="nofollow" data-dimension112="5e07ae90-867d-11f1-aa6c-618b1c5f7570" data-action="Deal Block" data-label="113L Outdoor Storage Box" data-dimension48="113L Outdoor Storage Box" data-dimension25="£24">113L Outdoor Storage Box: was £32 now £24</a></strong><br>This deal is an affordable way to add 113L of storage to your garden, and keep tools and other bits and bobs out of sight. The neutral design and color means it'll easily blend in, too.<a class="view-deal button" href="https://www.amazon.co.uk/Keter-242798-City-Box-Chest/dp/B07NQ6R7R1" target="_blank" rel="nofollow" data-dimension112="5e07ae90-867d-11f1-aa6c-618b1c5f7570" data-action="Deal Block" data-label="113L Outdoor Storage Box" data-dimension48="113L Outdoor Storage Box" data-dimension25="£24">View Deal</a></p></div><div class="product"><a data-dimension112="5e07aefe-867d-11f1-98a4-d97d76287891" data-action="Deal Block" data-label="Vida Garden Bench" data-dimension48="Vida Garden Bench" data-dimension25="£47" href="https://www.amazon.co.uk/Home-Garden-Outdoor-Furniture-Seating/dp/B07DNF521Y" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:84.40%;"><img id="Gy9w93johCCmgdZ2cVycte" name="Vida Garden Bench" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Gy9w93johCCmgdZ2cVycte.jpg" mos="" align="middle" fullscreen="" width="1500" height="1266" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Home-Garden-Outdoor-Furniture-Seating/dp/B07DNF521Y" target="_blank" rel="nofollow" data-dimension112="5e07aefe-867d-11f1-98a4-d97d76287891" data-action="Deal Block" data-label="Vida Garden Bench" data-dimension48="Vida Garden Bench" data-dimension25="£47">Vida Garden Bench: was £54 now £47</a></strong><br>I'm pretty surprised to see this garden bench costs less than £50 right now. There's space for three to sit, and it's made of sturdy wood, iron and plastic. But the cut-out rose design on the back is the most attractive feature.<a class="view-deal button" href="https://www.amazon.co.uk/Home-Garden-Outdoor-Furniture-Seating/dp/B07DNF521Y" target="_blank" rel="nofollow" data-dimension112="5e07aefe-867d-11f1-98a4-d97d76287891" data-action="Deal Block" data-label="Vida Garden Bench" data-dimension48="Vida Garden Bench" data-dimension25="£47">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff256-8680-11f1-aeca-53fca813d631" data-action="Deal Block" data-label="Hammock with Stand" data-dimension48="Hammock with Stand" data-dimension25="£48" href="https://www.amazon.co.uk/VonHaus-Person-Hammock-Frame-Nautical/dp/B07BGZT5YB" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:72.60%;"><img id="kxbhkYaDPYZoxJCXUPPSyA" name="Hammock with Stand" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kxbhkYaDPYZoxJCXUPPSyA.jpg" mos="" align="middle" fullscreen="" width="1500" height="1089" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/VonHaus-Person-Hammock-Frame-Nautical/dp/B07BGZT5YB" target="_blank" rel="nofollow" data-dimension112="d9bff256-8680-11f1-aeca-53fca813d631" data-action="Deal Block" data-label="Hammock with Stand" data-dimension48="Hammock with Stand" data-dimension25="£48">Hammock with Stand: was £69 now £48</a></strong><br>Doesn't relaxing in a hammock sound good right about now? This one has a swinging stand, a blue and white striped design, and a handy pocket to store your phone or summer reads.<a class="view-deal button" href="https://www.amazon.co.uk/VonHaus-Person-Hammock-Frame-Nautical/dp/B07BGZT5YB" target="_blank" rel="nofollow" data-dimension112="d9bff256-8680-11f1-aeca-53fca813d631" data-action="Deal Block" data-label="Hammock with Stand" data-dimension48="Hammock with Stand" data-dimension25="£48">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff2d8-8680-11f1-9cef-57ff889a4b9d" data-action="Deal Block" data-label="Zero Gravity Chair" data-dimension48="Zero Gravity Chair" data-dimension25="£30" href="https://www.amazon.co.uk/VOUNOT%C2%AE-Outdoor-Umbrella-Cantilever-Fillable/dp/B0F1CJ7NM7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1157px;"><p class="vanilla-image-block" style="padding-top:129.65%;"><img id="zsweGKnAGUkHd29JcoykjB" name="Zero Gravity Chair" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zsweGKnAGUkHd29JcoykjB.jpg" mos="" align="middle" fullscreen="" width="1157" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/VOUNOT%C2%AE-Outdoor-Umbrella-Cantilever-Fillable/dp/B0F1CJ7NM7" target="_blank" rel="nofollow" data-dimension112="d9bff2d8-8680-11f1-9cef-57ff889a4b9d" data-action="Deal Block" data-label="Zero Gravity Chair" data-dimension48="Zero Gravity Chair" data-dimension25="£30">Zero Gravity Chair: was £35 now £30</a></strong><br>Time to lounge in perfect comfort! This outdoor chair is made to make you feel weightless, with a comfortable headrest and reclining design. There's also a cup holder and phone tray.<a class="view-deal button" href="https://www.amazon.co.uk/VOUNOT%C2%AE-Outdoor-Umbrella-Cantilever-Fillable/dp/B0F1CJ7NM7" target="_blank" rel="nofollow" data-dimension112="d9bff2d8-8680-11f1-9cef-57ff889a4b9d" data-action="Deal Block" data-label="Zero Gravity Chair" data-dimension48="Zero Gravity Chair" data-dimension25="£30">View Deal</a></p></div><div class="product"><a data-dimension112="5e07af6c-867d-11f1-a82a-85caf67be4de" data-action="Deal Block" data-label="2 Seater Rattan Bistro Set" data-dimension48="2 Seater Rattan Bistro Set" data-dimension25="£69" href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ySochRXbLb2e4uk8bmhL56" name="Capri 2 Seater Rattan Bistro Set Outdoor Garden Patio Balcony Furniture 3 Pcs" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ySochRXbLb2e4uk8bmhL56.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow" data-dimension112="5e07af6c-867d-11f1-a82a-85caf67be4de" data-action="Deal Block" data-label="2 Seater Rattan Bistro Set" data-dimension48="2 Seater Rattan Bistro Set" data-dimension25="£69">2 Seater Rattan Bistro Set: was £99 now £69</a></strong><br>This patio set transforms your outdoor space, adding seating and dining space for just £69. You get two chairs and a table that fold away when not in use.<a class="view-deal button" href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow" data-dimension112="5e07af6c-867d-11f1-a82a-85caf67be4de" data-action="Deal Block" data-label="2 Seater Rattan Bistro Set" data-dimension48="2 Seater Rattan Bistro Set" data-dimension25="£69">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff35a-8680-11f1-859a-f31652545887" data-action="Deal Block" data-label="Rattan Garden Furniture Set" data-dimension48="Rattan Garden Furniture Set" data-dimension25="£118" href="https://www.amazon.co.uk/EVRE-Rattan-Furniture-Conservatory-Outdoor/dp/B09B7V2F67" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1267px;"><p class="vanilla-image-block" style="padding-top:45.94%;"><img id="FmVv4Y8eJGxWW4DqdJKCSR" name="Rattan Garden Furniture Set" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FmVv4Y8eJGxWW4DqdJKCSR.jpg" mos="" align="middle" fullscreen="" width="1267" height="582" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/EVRE-Rattan-Furniture-Conservatory-Outdoor/dp/B09B7V2F67" target="_blank" rel="nofollow" data-dimension112="d9bff35a-8680-11f1-859a-f31652545887" data-action="Deal Block" data-label="Rattan Garden Furniture Set" data-dimension48="Rattan Garden Furniture Set" data-dimension25="£118">Rattan Garden Furniture Set: was £139 now £118</a></strong><br>Getting a loveseat, two chairs and a coffee table in this set for £118 is pretty great value. It's made of rattan that's UV resistant and easy to wipe clean. <a class="view-deal button" href="https://www.amazon.co.uk/EVRE-Rattan-Furniture-Conservatory-Outdoor/dp/B09B7V2F67" target="_blank" rel="nofollow" data-dimension112="d9bff35a-8680-11f1-859a-f31652545887" data-action="Deal Block" data-label="Rattan Garden Furniture Set" data-dimension48="Rattan Garden Furniture Set" data-dimension25="£118">View Deal</a></p></div><h3 class="article-body__section" id="section-outdoor-cooking"><span>Outdoor cooking</span></h3><div class="product"><a data-dimension112="d9bff56c-8680-11f1-9f5e-b7b07711ddfb" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£82" href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="CERqwPnM6zij6hpVVKyAXf" name="Compact 47 cm Portable Kettle Charcoal BBQ" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CERqwPnM6zij6hpVVKyAXf.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow" data-dimension112="d9bff56c-8680-11f1-9f5e-b7b07711ddfb" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£82">Compact 47 cm Portable Kettle Charcoal BBQ: was £94 now £82</a></strong><br>Weber makes some of the <a href="https://www.tomsguide.com/best-picks/best-grills" target="_blank">best grills</a> we've tested, and this is one of the more affordable entry-level options. It has 47cm of cooking space, perfect for everything from burgers to kebabs. Plus, there are wheels to move it around easily.<br><strong>Price check: </strong><a href="https://www.currys.co.uk/products/weber-compact-47-cm-portable-kettle-charcoal-bbq-black-10299398.html" target="_blank" rel="nofollow"><strong>£89 @ Currys</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow" data-dimension112="d9bff56c-8680-11f1-9f5e-b7b07711ddfb" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£82">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff5e4-8680-11f1-8f13-7187a75faca7" data-action="Deal Block" data-label="FrostVault 42L Cool Box" data-dimension48="FrostVault 42L Cool Box" data-dimension25="£199" href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:81.40%;"><img id="hAaSPFC4GbRTXFW7HQXJVb" name="FrostVault 42L Cool Box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hAaSPFC4GbRTXFW7HQXJVb.jpg" mos="" align="middle" fullscreen="" width="1500" height="1221" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow" data-dimension112="d9bff5e4-8680-11f1-8f13-7187a75faca7" data-action="Deal Block" data-label="FrostVault 42L Cool Box" data-dimension48="FrostVault 42L Cool Box" data-dimension25="£199">FrostVault 42L Cool Box: was £279 now £199</a></strong><br>The Ninja FrostVault cooler is the <a href="https://www.tomsguide.com/best-picks/best-coolers">best cooler</a> we've tested and is a go-to for hot summer adventures. The 42L cooler can hold up to 68 cans and keeps them cool for 8 days! The wheels also mean you don't have to carry it, making it easy to manoeuvre even when full. <a class="view-deal button" href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow" data-dimension112="d9bff5e4-8680-11f1-8f13-7187a75faca7" data-action="Deal Block" data-label="FrostVault 42L Cool Box" data-dimension48="FrostVault 42L Cool Box" data-dimension25="£199">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff652-8680-11f1-8971-e1f3ac22aafd" data-action="Deal Block" data-label="Woodfire Electric BBQ Grill and Smoker" data-dimension48="Woodfire Electric BBQ Grill and Smoker" data-dimension25="£259" href="https://www.amazon.co.uk/Ninja-Dehydrate-Resistant-Non-Stick-OG701UK/dp/B0BS753P4H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:76.93%;"><img id="Eux5QGsPbZHipBmQ3R2oHM" name="Woodfire Electric BBQ Grill and Smoker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Eux5QGsPbZHipBmQ3R2oHM.jpg" mos="" align="middle" fullscreen="" width="1500" height="1154" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Ninja-Dehydrate-Resistant-Non-Stick-OG701UK/dp/B0BS753P4H" target="_blank" rel="nofollow" data-dimension112="d9bff652-8680-11f1-8971-e1f3ac22aafd" data-action="Deal Block" data-label="Woodfire Electric BBQ Grill and Smoker" data-dimension48="Woodfire Electric BBQ Grill and Smoker" data-dimension25="£259">Woodfire Electric BBQ Grill and Smoker: was £299 now £259</a></strong><br>Ninja has you covered with its electric grill and smoker. Using wood pellets, this grill can easily add rich and smoky flavour to your favourite meats, veggies and side dishes. You'll achieve great results every time with its built-in temperature control probe, and you can also bake, roast, dehydrate and air fry with the same device. <a class="view-deal button" href="https://www.amazon.co.uk/Ninja-Dehydrate-Resistant-Non-Stick-OG701UK/dp/B0BS753P4H" target="_blank" rel="nofollow" data-dimension112="d9bff652-8680-11f1-8971-e1f3ac22aafd" data-action="Deal Block" data-label="Woodfire Electric BBQ Grill and Smoker" data-dimension48="Woodfire Electric BBQ Grill and Smoker" data-dimension25="£259">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/17-affordable-amazon-home-and-garden-buys-to-elevate-your-space-up-to-50-percent-off-patio-furniture-decor-and-more</link>
                                                                            <description>
                            <![CDATA[ I found the best affordable upgrades for your outdoor space, with epic discounts at up to 50% off. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">QtmPRssepeqgoTtD5nbjjJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/zhET7YYKoehUwhzWzQ2MzN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 11:25:42 +0000</pubDate>                                                                                                                                <updated>Thu, 23 Jul 2026 11:28:28 +0000</updated>
                                                                                                                                            <category><![CDATA[Sales Events]]></category>
                                                                                                <author><![CDATA[ millie.daviswilliams@futurenet.com (Millie Davis-Williams) ]]></author>                    <dc:creator><![CDATA[ Millie Davis-Williams ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/WU6pa7hKuxs5ScCoqcXYWA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Millie is a Deals Editor at Tom&#039;s Guide specializing in tech deals content. Based in London, Millie has spent a lifetime stubbornly refusing to pay full price on any possible purchase. She has years of searching for the best discounts on the latest and greatest phones, TVs and gadgets under her belt, and knows how to sort the best deals from the rest. Helping readers save on the products they want is her mission, whether it’s an Apple Watch or a new tablet.&lt;/p&gt;&lt;p&gt;Since working at Tom’s Guide, Millie has covered retail events like Prime Day, Black Friday and Cyber Monday extensively, meaning she knows the products readers are looking for and the best times of year to hit “purchase.”&lt;/p&gt;&lt;p&gt;When she’s not looking for discounts, Millie covers news and writes how-to articles about everything from phones, streaming devices, and headphones to apps and video games.&lt;/p&gt;&lt;p&gt;In her spare time, Millie enjoys reading, gaming on her Nintendo Switch and creating digital art. She’s also a fan of watching Disney movies and collecting plush (the latter having totally taken over her bedroom.)&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/zhET7YYKoehUwhzWzQ2MzN-1280-80.jpg">
                                                            <media:credit><![CDATA[Garden Vida]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garden Vida patio furniture]]></media:description>                                                            <media:text><![CDATA[Garden Vida patio furniture]]></media:text>
                                <media:title type="plain"><![CDATA[Garden Vida patio furniture]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/zhET7YYKoehUwhzWzQ2MzN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're right in the middle of summer. Now that we're not in the midst of a heatwave, the temperatures outdoors are actually enjoyable — so it's a great time to upgrade your outdoor space and make the most of it.</p><p>Right now <a href="https://www.amazon.co.uk/gp/browse.html?node=11052671" target="_blank" rel="nofollow">Amazon is taking up to 50% off patio furniture, decor and gardening essentials</a>, so you can transform your living space without breaking the bank. I've been searching the site for the best affordable upgrades, so keep scrolling to check them out. (I also recommend taking a look at our <a href="https://www.tomsguide.com/coupons/amazon-uk">Amazon promo codes</a> coverage.)</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.amazon.co.uk/deals" target="_blank" rel="nofollow"><strong>shop all deals at Amazon</strong></a></li><li><strong>Baby Bio Houseplant Food, 175ml: </strong><a href="https://www.amazon.co.uk/SBM-Life-Science-Baby-Houseplant/dp/B000TROMB2" target="_blank" rel="nofollow"><strong>was £4 now £2</strong></a></li><li><strong>Grills & outdoor cooking: </strong><a href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow"><strong>deals from £3</strong></a></li><li><strong>Resolva Pro Ready To Use Weed Killer, 3 Litre: </strong><a href="https://www.amazon.co.uk/Resolva-Ready-Weed-Killer-Litre/dp/B0779JGM1S" target="_blank" rel="nofollow"><strong>was £18 now £14</strong></a></li><li><strong>Garden decor: </strong><a href="https://www.amazon.co.uk/b?node=27917239031" target="_blank" rel="nofollow"><strong>from £15</strong></a></li><li><strong>Vounot Garden Parasol: </strong><a href="https://www.amazon.co.uk/VOUNOT-Parasol-Balcony-Umbrella-Rectangular/dp/B08F55XT6L" target="_blank" rel="nofollow"><strong>was £24 now £21</strong></a></li><li><strong>Keter City 113L Outdoor Storage Box: </strong><a href="https://www.amazon.co.uk/Keter-242798-City-Box-Chest/dp/B07NQ6R7R1" target="_blank" rel="nofollow"><strong>was £32 now £24</strong></a></li><li><strong>Lawnmower sale: </strong><a href="https://www.amazon.co.uk/b/?node=11714761" target="_blank" rel="nofollow"><strong>deals from £40</strong></a></li><li><strong>Garden Vida 2 Seater Rattan Bistro Set: </strong><a href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow"><strong>was £99 now £69</strong></a></li><li><strong>Weber Compact 47 cm Portable Kettle Charcoal BBQ: </strong><a href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow"><strong>was £99 now £82</strong></a></li><li><strong>Kitchen & home appliances: </strong><a href="https://www.amazon.co.uk/b?node=391784011" target="_blank" rel="nofollow"><strong>up to 40% off De'Longhi, Shark, Ninja</strong></a></li><li><strong>Ring smart home security: </strong><a href="https://www.amazon.co.uk/stores/page/28BC3C0A-5C1C-4C60-96CC-32489E917877" target="_blank" rel="nofollow"><strong>up to 61% off</strong></a></li></ul><h3 class="article-body__section" id="section-gardening"><span>Gardening</span></h3><div class="product"><a data-dimension112="5e07ab70-867d-11f1-bfa7-1ba9ad9afb9d" data-action="Deal Block" data-label="Houseplant Food, 175ml" data-dimension48="Houseplant Food, 175ml" data-dimension25="£2" href="https://www.amazon.co.uk/SBM-Life-Science-Baby-Houseplant/dp/B000TROMB2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:673px;"><p class="vanilla-image-block" style="padding-top:222.88%;"><img id="sgFFaDbCtGDrs8sSPzo835" name="Houseplant Food, 175ml" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/sgFFaDbCtGDrs8sSPzo835.jpg" mos="" align="middle" fullscreen="" width="673" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/SBM-Life-Science-Baby-Houseplant/dp/B000TROMB2" target="_blank" rel="nofollow" data-dimension112="5e07ab70-867d-11f1-bfa7-1ba9ad9afb9d" data-action="Deal Block" data-label="Houseplant Food, 175ml" data-dimension48="Houseplant Food, 175ml" data-dimension25="£2">Houseplant Food, 175ml: was £4 now £2</a></strong><br>This Baby Bio fertilizer is on sale for 52% off, so now's the time to stock up. Just add a few drops to your houseplant's soil for greener leaves and more vibrant flowers.<a class="view-deal button" href="https://www.amazon.co.uk/SBM-Life-Science-Baby-Houseplant/dp/B000TROMB2" target="_blank" rel="nofollow" data-dimension112="5e07ab70-867d-11f1-bfa7-1ba9ad9afb9d" data-action="Deal Block" data-label="Houseplant Food, 175ml" data-dimension48="Houseplant Food, 175ml" data-dimension25="£2">View Deal</a></p></div><div class="product"><a data-dimension112="5e07abde-867d-11f1-9784-ad73e18d6d92" data-action="Deal Block" data-label="Pro Ready To Use Weed Killer, 3 Litre" data-dimension48="Pro Ready To Use Weed Killer, 3 Litre" data-dimension25="£14" href="https://www.amazon.co.uk/Resolva-Ready-Weed-Killer-Litre/dp/B0779JGM1S" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="TEvnfa9TcKyB9PbZms6owJ" name="Pro Ready To Use Weed Killer, 3 Litre" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TEvnfa9TcKyB9PbZms6owJ.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Resolva-Ready-Weed-Killer-Litre/dp/B0779JGM1S" target="_blank" rel="nofollow" data-dimension112="5e07abde-867d-11f1-9784-ad73e18d6d92" data-action="Deal Block" data-label="Pro Ready To Use Weed Killer, 3 Litre" data-dimension48="Pro Ready To Use Weed Killer, 3 Litre" data-dimension25="£14">Pro Ready To Use Weed Killer, 3 Litre: was £18 now £14</a></strong><br>Need to take care of weeds? This pack of Resolva weed killer has enough to treat 111 sq m and tackles everything from dandelions to bindweed. <a class="view-deal button" href="https://www.amazon.co.uk/Resolva-Ready-Weed-Killer-Litre/dp/B0779JGM1S" target="_blank" rel="nofollow" data-dimension112="5e07abde-867d-11f1-9784-ad73e18d6d92" data-action="Deal Block" data-label="Pro Ready To Use Weed Killer, 3 Litre" data-dimension48="Pro Ready To Use Weed Killer, 3 Litre" data-dimension25="£14">View Deal</a></p></div><div class="product"><a data-dimension112="5e07ac56-867d-11f1-84b7-81ade7d900a9" data-action="Deal Block" data-label="Lawnmower sale: deals from £40 @ Amazon" data-dimension48="Lawnmower sale: deals from £40 @ Amazon" href="https://www.amazon.co.uk/b/?node=11714761" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1139px;"><p class="vanilla-image-block" style="padding-top:131.69%;"><img id="n7UFr5BuvWfHJ2eNdxQPWf" name="Flymo EasiGlide 300 Hover Collect Lawn Mower" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/n7UFr5BuvWfHJ2eNdxQPWf.jpg" mos="" align="middle" fullscreen="" width="1139" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Lawnmower sale: </strong><a href="https://www.amazon.co.uk/b/?node=11714761" target="_blank" rel="nofollow" data-dimension112="5e07ac56-867d-11f1-84b7-81ade7d900a9" data-action="Deal Block" data-label="Lawnmower sale: deals from £40 @ Amazon" data-dimension48="Lawnmower sale: deals from £40 @ Amazon" data-dimension25=""><strong>deals from £40 @ Amazon</strong></a><br>If your grass has gotten out of control over winter, Amazon has deals on lawnmowers from £40. The sale includes brands like Flymo, Bosch and more.<a class="view-deal button" href="https://www.amazon.co.uk/b/?node=11714761" target="_blank" rel="nofollow" data-dimension112="5e07ac56-867d-11f1-84b7-81ade7d900a9" data-action="Deal Block" data-label="Lawnmower sale: deals from £40 @ Amazon" data-dimension48="Lawnmower sale: deals from £40 @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="5e07acc4-867d-11f1-954d-e52fe9de4a7c" data-action="Deal Block" data-label="High Pressure Washer UniversalAquatak 135" data-dimension48="High Pressure Washer UniversalAquatak 135" data-dimension25="£114" href="https://www.amazon.co.uk/dp/B06XRWS76H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1149px;"><p class="vanilla-image-block" style="padding-top:100.17%;"><img id="rBF6jAHrGZhSCKrmgKLERf" name="High Pressure Washer UniversalAquatak 135" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rBF6jAHrGZhSCKrmgKLERf.jpg" mos="" align="middle" fullscreen="" width="1149" height="1151" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/dp/B06XRWS76H" target="_blank" rel="nofollow" data-dimension112="5e07acc4-867d-11f1-954d-e52fe9de4a7c" data-action="Deal Block" data-label="High Pressure Washer UniversalAquatak 135" data-dimension48="High Pressure Washer UniversalAquatak 135" data-dimension25="£114">High Pressure Washer UniversalAquatak 135: was £123 now £114</a></strong><br>This Bosch pressure washer is on sale for just over £100, so now is a great time to pick it up. Its 3-in-1 nozzle is perfect for a variety of cleaning tasks, and it delivers 135 bar pressure.<a class="view-deal button" href="https://www.amazon.co.uk/dp/B06XRWS76H" target="_blank" rel="nofollow" data-dimension112="5e07acc4-867d-11f1-954d-e52fe9de4a7c" data-action="Deal Block" data-label="High Pressure Washer UniversalAquatak 135" data-dimension48="High Pressure Washer UniversalAquatak 135" data-dimension25="£114">View Deal</a></p></div><div class="product"><a data-dimension112="5e07ad3c-867d-11f1-8c4b-b3c36843bcd9" data-action="Deal Block" data-label="40V Cordless Lawnmower" data-dimension48="40V Cordless Lawnmower" data-dimension25="£209" href="https://www.amazon.co.uk/dp/B0721LYLZK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:88.20%;"><img id="PptfBKbBAv9mEzFcrBT2gK" name="40V Cordless Lawnmower" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PptfBKbBAv9mEzFcrBT2gK.jpg" mos="" align="middle" fullscreen="" width="1500" height="1323" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/dp/B0721LYLZK" target="_blank" rel="nofollow" data-dimension112="5e07ad3c-867d-11f1-8c4b-b3c36843bcd9" data-action="Deal Block" data-label="40V Cordless Lawnmower" data-dimension48="40V Cordless Lawnmower" data-dimension25="£209">40V Cordless Lawnmower: was £299 now £209</a></strong><br>This Greenworks lawnmower is a popular pick on Amazon, and it's now been discounted by 30%. It's suited for lawns up to 400m. One reviewer on Amazon loves this mower, and wrote "To anyone with a small to medium size garden I cannot recommend this mower enough, I guarantee you will not be disappointed."<a class="view-deal button" href="https://www.amazon.co.uk/dp/B0721LYLZK" target="_blank" rel="nofollow" data-dimension112="5e07ad3c-867d-11f1-8c4b-b3c36843bcd9" data-action="Deal Block" data-label="40V Cordless Lawnmower" data-dimension48="40V Cordless Lawnmower" data-dimension25="£209">View Deal</a></p></div><h3 class="article-body__section" id="section-furniture-and-decor"><span>Furniture and decor</span></h3><div class="product"><a data-dimension112="d9bfe6e4-8680-11f1-8aae-27592f0e3a13" data-action="Deal Block" data-label="Tablecloth Clips 8 Pack" data-dimension48="Tablecloth Clips 8 Pack" data-dimension25="£5" href="https://www.amazon.co.uk/Blooven-Tablecloth-Stainless-Clamps-Holders/dp/B07CWSP9LT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:93.53%;"><img id="9bZFCfwoqjvjifHjXWV9GV" name="Tablecloth Clips 8 Pack" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9bZFCfwoqjvjifHjXWV9GV.jpg" mos="" align="middle" fullscreen="" width="1500" height="1403" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Blooven-Tablecloth-Stainless-Clamps-Holders/dp/B07CWSP9LT" target="_blank" rel="nofollow" data-dimension112="d9bfe6e4-8680-11f1-8aae-27592f0e3a13" data-action="Deal Block" data-label="Tablecloth Clips 8 Pack" data-dimension48="Tablecloth Clips 8 Pack" data-dimension25="£5">Tablecloth Clips 8 Pack: was £7 now £5</a></strong><br>One of those little essentials you can't go without — these clips will stop your tablecloth from blowing around if the wind picks up. £5 is definitely worth it to save your snacks and drinks from knocking over.<a class="view-deal button" href="https://www.amazon.co.uk/Blooven-Tablecloth-Stainless-Clamps-Holders/dp/B07CWSP9LT" target="_blank" rel="nofollow" data-dimension112="d9bfe6e4-8680-11f1-8aae-27592f0e3a13" data-action="Deal Block" data-label="Tablecloth Clips 8 Pack" data-dimension48="Tablecloth Clips 8 Pack" data-dimension25="£5">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff008-8680-11f1-9dc7-63c9dbbaa02a" data-action="Deal Block" data-label="Outdoor Cushion Covers" data-dimension48="Outdoor Cushion Covers" data-dimension25="£11" href="https://www.amazon.co.uk/Brentfords-Geometric-Cushion-Resistant-Decorative/dp/B0BXQKDH9T" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:99.20%;"><img id="hSgvXQEzedjWpcU6RVDW7" name="Outdoor Cushion Covers" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hSgvXQEzedjWpcU6RVDW7.jpg" mos="" align="middle" fullscreen="" width="1500" height="1488" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Protect your cushions from the elements! This set of outdoor cushion covers measures 45 x 45 cm and has an eye-catching grey and white geometric design.<a class="view-deal button" href="https://www.amazon.co.uk/Brentfords-Geometric-Cushion-Resistant-Decorative/dp/B0BXQKDH9T" target="_blank" rel="nofollow" data-dimension112="d9bff008-8680-11f1-9dc7-63c9dbbaa02a" data-action="Deal Block" data-label="Outdoor Cushion Covers" data-dimension48="Outdoor Cushion Covers" data-dimension25="£11">View Deal</a></p></div><div class="product"><a data-dimension112="5e07ae18-867d-11f1-adce-4b3a8ccf3c20" data-action="Deal Block" data-label="Garden Parasol" data-dimension48="Garden Parasol" data-dimension25="£21" href="https://www.amazon.co.uk/VOUNOT-Parasol-Balcony-Umbrella-Rectangular/dp/B08F55XT6L" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1488px;"><p class="vanilla-image-block" style="padding-top:100.81%;"><img id="aY5HddTDeyVe2wgaaZzgJJ" name="Garden Parasol" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aY5HddTDeyVe2wgaaZzgJJ.jpg" mos="" align="middle" fullscreen="" width="1488" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/VOUNOT-Parasol-Balcony-Umbrella-Rectangular/dp/B08F55XT6L" target="_blank" rel="nofollow" data-dimension112="5e07ae18-867d-11f1-adce-4b3a8ccf3c20" data-action="Deal Block" data-label="Garden Parasol" data-dimension48="Garden Parasol" data-dimension25="£21">Garden Parasol: was £24 now £21</a></strong><br>This rectangular parasol is 200 x 125 cm and can tilt to shade your patio or garden at the perfect angle! At just over £20, it's incredibly affordable and there are three colour options to pick from.<a class="view-deal button" href="https://www.amazon.co.uk/VOUNOT-Parasol-Balcony-Umbrella-Rectangular/dp/B08F55XT6L" target="_blank" rel="nofollow" data-dimension112="5e07ae18-867d-11f1-adce-4b3a8ccf3c20" data-action="Deal Block" data-label="Garden Parasol" data-dimension48="Garden Parasol" data-dimension25="£21">View Deal</a></p></div><div class="product"><a data-dimension112="5e07ae90-867d-11f1-aa6c-618b1c5f7570" data-action="Deal Block" data-label="113L Outdoor Storage Box" data-dimension48="113L Outdoor Storage Box" data-dimension25="£24" href="https://www.amazon.co.uk/Keter-242798-City-Box-Chest/dp/B07NQ6R7R1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:99.20%;"><img id="wD7BHHj5Tk3KH5sZKiC7aQ" name="113L Outdoor 96% recycled Small Balcony Garden Furniture Storage Box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wD7BHHj5Tk3KH5sZKiC7aQ.jpg" mos="" align="middle" fullscreen="" width="1500" height="1488" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Keter-242798-City-Box-Chest/dp/B07NQ6R7R1" target="_blank" rel="nofollow" data-dimension112="5e07ae90-867d-11f1-aa6c-618b1c5f7570" data-action="Deal Block" data-label="113L Outdoor Storage Box" data-dimension48="113L Outdoor Storage Box" data-dimension25="£24">113L Outdoor Storage Box: was £32 now £24</a></strong><br>This deal is an affordable way to add 113L of storage to your garden, and keep tools and other bits and bobs out of sight. The neutral design and color means it'll easily blend in, too.<a class="view-deal button" href="https://www.amazon.co.uk/Keter-242798-City-Box-Chest/dp/B07NQ6R7R1" target="_blank" rel="nofollow" data-dimension112="5e07ae90-867d-11f1-aa6c-618b1c5f7570" data-action="Deal Block" data-label="113L Outdoor Storage Box" data-dimension48="113L Outdoor Storage Box" data-dimension25="£24">View Deal</a></p></div><div class="product"><a data-dimension112="5e07aefe-867d-11f1-98a4-d97d76287891" data-action="Deal Block" data-label="Vida Garden Bench" data-dimension48="Vida Garden Bench" data-dimension25="£47" href="https://www.amazon.co.uk/Home-Garden-Outdoor-Furniture-Seating/dp/B07DNF521Y" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:84.40%;"><img id="Gy9w93johCCmgdZ2cVycte" name="Vida Garden Bench" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Gy9w93johCCmgdZ2cVycte.jpg" mos="" align="middle" fullscreen="" width="1500" height="1266" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Home-Garden-Outdoor-Furniture-Seating/dp/B07DNF521Y" target="_blank" rel="nofollow" data-dimension112="5e07aefe-867d-11f1-98a4-d97d76287891" data-action="Deal Block" data-label="Vida Garden Bench" data-dimension48="Vida Garden Bench" data-dimension25="£47">Vida Garden Bench: was £54 now £47</a></strong><br>I'm pretty surprised to see this garden bench costs less than £50 right now. There's space for three to sit, and it's made of sturdy wood, iron and plastic. But the cut-out rose design on the back is the most attractive feature.<a class="view-deal button" href="https://www.amazon.co.uk/Home-Garden-Outdoor-Furniture-Seating/dp/B07DNF521Y" target="_blank" rel="nofollow" data-dimension112="5e07aefe-867d-11f1-98a4-d97d76287891" data-action="Deal Block" data-label="Vida Garden Bench" data-dimension48="Vida Garden Bench" data-dimension25="£47">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff256-8680-11f1-aeca-53fca813d631" data-action="Deal Block" data-label="Hammock with Stand" data-dimension48="Hammock with Stand" data-dimension25="£48" href="https://www.amazon.co.uk/VonHaus-Person-Hammock-Frame-Nautical/dp/B07BGZT5YB" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:72.60%;"><img id="kxbhkYaDPYZoxJCXUPPSyA" name="Hammock with Stand" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kxbhkYaDPYZoxJCXUPPSyA.jpg" mos="" align="middle" fullscreen="" width="1500" height="1089" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/VonHaus-Person-Hammock-Frame-Nautical/dp/B07BGZT5YB" target="_blank" rel="nofollow" data-dimension112="d9bff256-8680-11f1-aeca-53fca813d631" data-action="Deal Block" data-label="Hammock with Stand" data-dimension48="Hammock with Stand" data-dimension25="£48">Hammock with Stand: was £69 now £48</a></strong><br>Doesn't relaxing in a hammock sound good right about now? This one has a swinging stand, a blue and white striped design, and a handy pocket to store your phone or summer reads.<a class="view-deal button" href="https://www.amazon.co.uk/VonHaus-Person-Hammock-Frame-Nautical/dp/B07BGZT5YB" target="_blank" rel="nofollow" data-dimension112="d9bff256-8680-11f1-aeca-53fca813d631" data-action="Deal Block" data-label="Hammock with Stand" data-dimension48="Hammock with Stand" data-dimension25="£48">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff2d8-8680-11f1-9cef-57ff889a4b9d" data-action="Deal Block" data-label="Zero Gravity Chair" data-dimension48="Zero Gravity Chair" data-dimension25="£30" href="https://www.amazon.co.uk/VOUNOT%C2%AE-Outdoor-Umbrella-Cantilever-Fillable/dp/B0F1CJ7NM7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1157px;"><p class="vanilla-image-block" style="padding-top:129.65%;"><img id="zsweGKnAGUkHd29JcoykjB" name="Zero Gravity Chair" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zsweGKnAGUkHd29JcoykjB.jpg" mos="" align="middle" fullscreen="" width="1157" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/VOUNOT%C2%AE-Outdoor-Umbrella-Cantilever-Fillable/dp/B0F1CJ7NM7" target="_blank" rel="nofollow" data-dimension112="d9bff2d8-8680-11f1-9cef-57ff889a4b9d" data-action="Deal Block" data-label="Zero Gravity Chair" data-dimension48="Zero Gravity Chair" data-dimension25="£30">Zero Gravity Chair: was £35 now £30</a></strong><br>Time to lounge in perfect comfort! This outdoor chair is made to make you feel weightless, with a comfortable headrest and reclining design. There's also a cup holder and phone tray.<a class="view-deal button" href="https://www.amazon.co.uk/VOUNOT%C2%AE-Outdoor-Umbrella-Cantilever-Fillable/dp/B0F1CJ7NM7" target="_blank" rel="nofollow" data-dimension112="d9bff2d8-8680-11f1-9cef-57ff889a4b9d" data-action="Deal Block" data-label="Zero Gravity Chair" data-dimension48="Zero Gravity Chair" data-dimension25="£30">View Deal</a></p></div><div class="product"><a data-dimension112="5e07af6c-867d-11f1-a82a-85caf67be4de" data-action="Deal Block" data-label="2 Seater Rattan Bistro Set" data-dimension48="2 Seater Rattan Bistro Set" data-dimension25="£69" href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ySochRXbLb2e4uk8bmhL56" name="Capri 2 Seater Rattan Bistro Set Outdoor Garden Patio Balcony Furniture 3 Pcs" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ySochRXbLb2e4uk8bmhL56.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow" data-dimension112="5e07af6c-867d-11f1-a82a-85caf67be4de" data-action="Deal Block" data-label="2 Seater Rattan Bistro Set" data-dimension48="2 Seater Rattan Bistro Set" data-dimension25="£69">2 Seater Rattan Bistro Set: was £99 now £69</a></strong><br>This patio set transforms your outdoor space, adding seating and dining space for just £69. You get two chairs and a table that fold away when not in use.<a class="view-deal button" href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow" data-dimension112="5e07af6c-867d-11f1-a82a-85caf67be4de" data-action="Deal Block" data-label="2 Seater Rattan Bistro Set" data-dimension48="2 Seater Rattan Bistro Set" data-dimension25="£69">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff35a-8680-11f1-859a-f31652545887" data-action="Deal Block" data-label="Rattan Garden Furniture Set" data-dimension48="Rattan Garden Furniture Set" data-dimension25="£118" href="https://www.amazon.co.uk/EVRE-Rattan-Furniture-Conservatory-Outdoor/dp/B09B7V2F67" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1267px;"><p class="vanilla-image-block" style="padding-top:45.94%;"><img id="FmVv4Y8eJGxWW4DqdJKCSR" name="Rattan Garden Furniture Set" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FmVv4Y8eJGxWW4DqdJKCSR.jpg" mos="" align="middle" fullscreen="" width="1267" height="582" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/EVRE-Rattan-Furniture-Conservatory-Outdoor/dp/B09B7V2F67" target="_blank" rel="nofollow" data-dimension112="d9bff35a-8680-11f1-859a-f31652545887" data-action="Deal Block" data-label="Rattan Garden Furniture Set" data-dimension48="Rattan Garden Furniture Set" data-dimension25="£118">Rattan Garden Furniture Set: was £139 now £118</a></strong><br>Getting a loveseat, two chairs and a coffee table in this set for £118 is pretty great value. It's made of rattan that's UV resistant and easy to wipe clean. <a class="view-deal button" href="https://www.amazon.co.uk/EVRE-Rattan-Furniture-Conservatory-Outdoor/dp/B09B7V2F67" target="_blank" rel="nofollow" data-dimension112="d9bff35a-8680-11f1-859a-f31652545887" data-action="Deal Block" data-label="Rattan Garden Furniture Set" data-dimension48="Rattan Garden Furniture Set" data-dimension25="£118">View Deal</a></p></div><h3 class="article-body__section" id="section-outdoor-cooking"><span>Outdoor cooking</span></h3><div class="product"><a data-dimension112="d9bff56c-8680-11f1-9f5e-b7b07711ddfb" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£82" href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="CERqwPnM6zij6hpVVKyAXf" name="Compact 47 cm Portable Kettle Charcoal BBQ" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CERqwPnM6zij6hpVVKyAXf.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow" data-dimension112="d9bff56c-8680-11f1-9f5e-b7b07711ddfb" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£82">Compact 47 cm Portable Kettle Charcoal BBQ: was £94 now £82</a></strong><br>Weber makes some of the <a href="https://www.tomsguide.com/best-picks/best-grills" target="_blank">best grills</a> we've tested, and this is one of the more affordable entry-level options. It has 47cm of cooking space, perfect for everything from burgers to kebabs. Plus, there are wheels to move it around easily.<br><strong>Price check: </strong><a href="https://www.currys.co.uk/products/weber-compact-47-cm-portable-kettle-charcoal-bbq-black-10299398.html" target="_blank" rel="nofollow"><strong>£89 @ Currys</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow" data-dimension112="d9bff56c-8680-11f1-9f5e-b7b07711ddfb" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£82">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff5e4-8680-11f1-8f13-7187a75faca7" data-action="Deal Block" data-label="FrostVault 42L Cool Box" data-dimension48="FrostVault 42L Cool Box" data-dimension25="£199" href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:81.40%;"><img id="hAaSPFC4GbRTXFW7HQXJVb" name="FrostVault 42L Cool Box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hAaSPFC4GbRTXFW7HQXJVb.jpg" mos="" align="middle" fullscreen="" width="1500" height="1221" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow" data-dimension112="d9bff5e4-8680-11f1-8f13-7187a75faca7" data-action="Deal Block" data-label="FrostVault 42L Cool Box" data-dimension48="FrostVault 42L Cool Box" data-dimension25="£199">FrostVault 42L Cool Box: was £279 now £199</a></strong><br>The Ninja FrostVault cooler is the <a href="https://www.tomsguide.com/best-picks/best-coolers">best cooler</a> we've tested and is a go-to for hot summer adventures. The 42L cooler can hold up to 68 cans and keeps them cool for 8 days! The wheels also mean you don't have to carry it, making it easy to manoeuvre even when full. <a class="view-deal button" href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow" data-dimension112="d9bff5e4-8680-11f1-8f13-7187a75faca7" data-action="Deal Block" data-label="FrostVault 42L Cool Box" data-dimension48="FrostVault 42L Cool Box" data-dimension25="£199">View Deal</a></p></div><div class="product"><a data-dimension112="d9bff652-8680-11f1-8971-e1f3ac22aafd" data-action="Deal Block" data-label="Woodfire Electric BBQ Grill and Smoker" data-dimension48="Woodfire Electric BBQ Grill and Smoker" data-dimension25="£259" href="https://www.amazon.co.uk/Ninja-Dehydrate-Resistant-Non-Stick-OG701UK/dp/B0BS753P4H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:76.93%;"><img id="Eux5QGsPbZHipBmQ3R2oHM" name="Woodfire Electric BBQ Grill and Smoker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Eux5QGsPbZHipBmQ3R2oHM.jpg" mos="" align="middle" fullscreen="" width="1500" height="1154" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Ninja-Dehydrate-Resistant-Non-Stick-OG701UK/dp/B0BS753P4H" target="_blank" rel="nofollow" data-dimension112="d9bff652-8680-11f1-8971-e1f3ac22aafd" data-action="Deal Block" data-label="Woodfire Electric BBQ Grill and Smoker" data-dimension48="Woodfire Electric BBQ Grill and Smoker" data-dimension25="£259">Woodfire Electric BBQ Grill and Smoker: was £299 now £259</a></strong><br>Ninja has you covered with its electric grill and smoker. Using wood pellets, this grill can easily add rich and smoky flavour to your favourite meats, veggies and side dishes. You'll achieve great results every time with its built-in temperature control probe, and you can also bake, roast, dehydrate and air fry with the same device. <a class="view-deal button" href="https://www.amazon.co.uk/Ninja-Dehydrate-Resistant-Non-Stick-OG701UK/dp/B0BS753P4H" target="_blank" rel="nofollow" data-dimension112="d9bff652-8680-11f1-8971-e1f3ac22aafd" data-action="Deal Block" data-label="Woodfire Electric BBQ Grill and Smoker" data-dimension48="Woodfire Electric BBQ Grill and Smoker" data-dimension25="£259">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 new to Prime Video thriller movies to stream this week — including a $150 million disaster movie about the moon falling out of orbit (July 21-27) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Prime Video is always adding new movies to its library, and typically these drops include several arrivals in the thriller genre. After all, thrillers are persistently popular across streaming services, so it only makes sense that Prime Video would meet this demand. </p><p>I’ve taken a look through all the recently added movies for July 2026, and found a trio of thrillers worth adding to your watchlist. My picks this week range from a globe-trotting quest for revenge, a guilty pleasure option from a veteran of the disaster subgenre, and a survival drama that is made all the more engaging because it’s based on a shocking true story.</p><p>These are the latest thriller movies on Prime Video. Add them to your watchlist if you want to add some excitement, tension, and adrenaline-pumping action to your weekly streaming.</p><h2 id="the-amateur-2025-2">‘The Amateur’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DCWcK4c-F8Q" allowfullscreen></iframe></div></div><p>“The Amateur” is an excellent spy thriller that I believe falls into the slightly underrated category. Based on Robert Littell’s novel and starring Oscar winner Rami Malek, it draws clear inspiration from the Bourne film series in its tone and aesthetics. One of its biggest strengths is its compelling protagonist, who takes a brain-over-brawls approach; rather than outgunning his enemies, he outthinks them with his superior intellect. </p><p>Malek plays a CIA analyst whose world is shattered when his wife is killed in a terrorist attack. Using his skills, he identifies those responsible for his wife's murder and blackmails his superiors into giving him a license to hunt them down and get cold-blooded revenge. A novice in the field, Charlie (Malek) is shown the ropes by a gruff mentor, Hendo (Laurence Fishburne). Building to a satisfying conclusion, “The Amateur” is a consistently thrilling ride.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Amateur-James-Hawes/dp/B0D48BW2HT/" target="_blank" rel="nofollow"><em><strong>"The Amateur" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="moonfall-2022">‘Moonfall’ (2022)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ivIwdQBlS10" allowfullscreen></iframe></div></div><p>“Moonfall” is definitely more of a guilty pleasure flick. This sci-fi disaster-thriller comes from Roland Emmerich, known for “Independence Day,” “Godzilla,” and “The Day After Tomorrow.” It’s unashamedly silly with corny dialogue and a high-concept plot that goes to some ludicrous places. You could certainly pick at its seams, and the whole movie will quickly unravel, but if you switch your brain off for 130 minutes, it can offer throwaway fun.</p><p>As the name suggests, “Moonfall” sees the moon literally fall out of orbit, setting it on a devastating collision course with Earth. Former astronaut Jocinda Fowler (Halle Berry) believes she knows the key to saving humanity. With time running out, she has to rely on a disgraced former colleague (Patrick Wilson) and a conspiracy theorist (John Bradley) for help. If you can handle cheesy B-movie vibes, you might enjoy this one.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0DLRLS3V7" target="_blank" rel="nofollow"><em><strong>"Moonfall" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="death-race-2008">'Death Race' (2008)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/C8bxcJZrus0" allowfullscreen></iframe></div></div><p>Jason Statham stars in this 2000s remake of 1975’s “Death Race.” From director Paul W. S. Anderson, most known for his sprawling but largely subpar “Resident Evil” series, it was no critical darling, but I have a soft spot for this brash action flick. Its narrative is flimsy, and many of the characters aren’t particularly likeable, but the action comes thick and fast, and the concept of a high-speed race to the death leads to thrilling sequences. </p><p>Set in an alternative United States where economic downturn and rising crime rates have demanded a radical solution, Warden Claire Hennessey (Joan Allen) creates “Death Race.” A three-day live-streamed event in which prisoners race in weaponized cars for a shot at freedom. Forced to compete is Jensen Ames (Statham), an industrial worker framed for the murder of his wife. The tournament is petrol-fuelled mayhem, where the only rule is to drive fast and do whatever it takes to cross the finish line.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B00D5UGA10/" target="_blank" rel="nofollow"><em><strong>"Death Race" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="">New on Prime Video in July 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-must-watch-classic-movies-just-added-to-prime-video-including-clint-eastwoods-iconic-western-trilogy">5 must-watch classic movies just added to Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-5-gripping-movies-you-can-stream-for-free-and-one-is-an-action-packed-western-film">Prime Video just added these top movies you can stream for free</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>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</link>
                                                                            <description>
                            <![CDATA[ These are the latest thriller movies on Prime Video, including a $150 million disaster flick, an action pick with Jason Statham, and more ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nwPQp57Wue32VsucRuZpdJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/zWqHCpTxYNgNF2cEkpZ93U-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 11:34:16 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/zWqHCpTxYNgNF2cEkpZ93U-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on blue electric currents background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on blue electric currents background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on blue electric currents background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/zWqHCpTxYNgNF2cEkpZ93U-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Video is always adding new movies to its library, and typically these drops include several arrivals in the thriller genre. After all, thrillers are persistently popular across streaming services, so it only makes sense that Prime Video would meet this demand. </p><p>I’ve taken a look through all the recently added movies for July 2026, and found a trio of thrillers worth adding to your watchlist. My picks this week range from a globe-trotting quest for revenge, a guilty pleasure option from a veteran of the disaster subgenre, and a survival drama that is made all the more engaging because it’s based on a shocking true story.</p><p>These are the latest thriller movies on Prime Video. Add them to your watchlist if you want to add some excitement, tension, and adrenaline-pumping action to your weekly streaming.</p><h2 id="the-amateur-2025-2">‘The Amateur’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DCWcK4c-F8Q" allowfullscreen></iframe></div></div><p>“The Amateur” is an excellent spy thriller that I believe falls into the slightly underrated category. Based on Robert Littell’s novel and starring Oscar winner Rami Malek, it draws clear inspiration from the Bourne film series in its tone and aesthetics. One of its biggest strengths is its compelling protagonist, who takes a brain-over-brawls approach; rather than outgunning his enemies, he outthinks them with his superior intellect. </p><p>Malek plays a CIA analyst whose world is shattered when his wife is killed in a terrorist attack. Using his skills, he identifies those responsible for his wife's murder and blackmails his superiors into giving him a license to hunt them down and get cold-blooded revenge. A novice in the field, Charlie (Malek) is shown the ropes by a gruff mentor, Hendo (Laurence Fishburne). Building to a satisfying conclusion, “The Amateur” is a consistently thrilling ride.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Amateur-James-Hawes/dp/B0D48BW2HT/" target="_blank" rel="nofollow"><em><strong>"The Amateur" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="moonfall-2022">‘Moonfall’ (2022)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ivIwdQBlS10" allowfullscreen></iframe></div></div><p>“Moonfall” is definitely more of a guilty pleasure flick. This sci-fi disaster-thriller comes from Roland Emmerich, known for “Independence Day,” “Godzilla,” and “The Day After Tomorrow.” It’s unashamedly silly with corny dialogue and a high-concept plot that goes to some ludicrous places. You could certainly pick at its seams, and the whole movie will quickly unravel, but if you switch your brain off for 130 minutes, it can offer throwaway fun.</p><p>As the name suggests, “Moonfall” sees the moon literally fall out of orbit, setting it on a devastating collision course with Earth. Former astronaut Jocinda Fowler (Halle Berry) believes she knows the key to saving humanity. With time running out, she has to rely on a disgraced former colleague (Patrick Wilson) and a conspiracy theorist (John Bradley) for help. If you can handle cheesy B-movie vibes, you might enjoy this one.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0DLRLS3V7" target="_blank" rel="nofollow"><em><strong>"Moonfall" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="death-race-2008">'Death Race' (2008)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/C8bxcJZrus0" allowfullscreen></iframe></div></div><p>Jason Statham stars in this 2000s remake of 1975’s “Death Race.” From director Paul W. S. Anderson, most known for his sprawling but largely subpar “Resident Evil” series, it was no critical darling, but I have a soft spot for this brash action flick. Its narrative is flimsy, and many of the characters aren’t particularly likeable, but the action comes thick and fast, and the concept of a high-speed race to the death leads to thrilling sequences. </p><p>Set in an alternative United States where economic downturn and rising crime rates have demanded a radical solution, Warden Claire Hennessey (Joan Allen) creates “Death Race.” A three-day live-streamed event in which prisoners race in weaponized cars for a shot at freedom. Forced to compete is Jensen Ames (Statham), an industrial worker framed for the murder of his wife. The tournament is petrol-fuelled mayhem, where the only rule is to drive fast and do whatever it takes to cross the finish line.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B00D5UGA10/" target="_blank" rel="nofollow"><em><strong>"Death Race" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="">New on Prime Video in July 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-must-watch-classic-movies-just-added-to-prime-video-including-clint-eastwoods-iconic-western-trilogy">5 must-watch classic movies just added to Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-5-gripping-movies-you-can-stream-for-free-and-one-is-an-action-packed-western-film">Prime Video just added these top movies you can stream for free</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Sorry, Kindle — but I still prefer reading comic books on my iPad ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">best Kindles</a> have been my primary way to read books for the better part of a decade. Thanks to Amazon’s e-reader, I’ve read more books in the past seven years than in the nearly four decades prior. Not only is the device easy to hold and read on, but its integration with the Kindle app and store gives me more books than I could read in a single lifetime.</p><p>Though I adore my Kindles, I don’t read comic books on them. Even after the introduction of the <a href="https://www.tomsguide.com/tablets/e-readers/kindle-colorsoft-review">Kindle Colorsoft</a>, which finally let me read comics in color, I still can’t bring myself to read comics full-time on Amazon's hardware. Why? Because, as a lifelong comic book fan, I get a much better experience on the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>. Here’s why.</p><h2 id="display-size">Display size</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UHkmwSnbLfaJpaVj6YYqxT" name="iPad Pro M4 comic books-4.jpg" alt="A comic book on an iPad Pro 2024" src="https://cdn.mos.cms.futurecdn.net/UHkmwSnbLfaJpaVj6YYqxT.jpg" mos="" align="middle" fullscreen="" width="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>Digital comic apps like <a href="https://www.tomsguide.com/computing/mobile-apps/marvel-unlimited-heres-the-5-best-classic-comic-books-to-read-first">Marvel Unlimited</a> and DC Universe Infinite offer a guided view mode that zooms in on individual panels and text. This can be immersive, especially for those new to the medium. While guided mode works as advertised, I prefer seeing an entire comic page rather than breaking it up piece by piece.</p><p>On the <a href="https://www.tomsguide.com/tablets/e-readers/kindle-2024-review">base Kindle</a> and <a href="https://www.tomsguide.com/tablets/e-readers/kindle-paperwhite-2024-review">Kindle Paperwhite</a>, you almost have to use guided mode because of their small screens. For comics, I prefer reading on the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a>. The 13-inch model’s screen is slightly larger than a physical comic book page. Not only do single pages look fantastic, but double-page spreads look incredible when you rotate the tablet to landscape orientation.</p><p>Another problem with using guided view or pinch-to-zoom on Kindles is the device’s low refresh rate. This causes the e-reader to lag and flash to clear previous image artifacts (ghosting). While this has improved with the latest Kindle models, the refresh rate is still sluggish compared to iPads, which handle panning and zooming instantly and smoothly.</p><p>Returning to screen size, the Kindle Scribe features a roomier 10.2-inch display. While that’s still smaller than the 11-inch iPad Pro and <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air</a> models, it’s a good size for reading full comic book pages. There’s a specific reason I don’t use the Scribe for traditional color comics (which I’ll cover next), but for black-and-white manga, it’s legitimately great. However, since I don’t read much manga, that point is mostly moot for me.</p><p>When it comes to reading single pages and double-page spreads of a traditional American comic book, the iPad is simply the way to go.</p><h2 id="colorsoft-is-still-too-muted">Colorsoft is still too muted</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5172px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9B3xTqSpguT2kzFa28Lryn" name="Kindle Scribe Colorsoft (2025) review" alt="Kindle Scribe Colorsoft review unit in action" src="https://cdn.mos.cms.futurecdn.net/9B3xTqSpguT2kzFa28Lryn.jpg" mos="" align="middle" fullscreen="" width="5172" height="2909" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Kindle Colorsoft and <a href="https://www.tomsguide.com/computing/e-readers/kindle-scribe-colorsoft-2025-review">Kindle Scribe Colorsoft</a> are arguably the best color e-readers out there right now. If you mainly read traditional novels, having full-color book covers, maps, and other design elements is a nice perk. Naturally, comics are in color on these devices, but there is one major drawback—the hues are decidedly muted.</p><p>In fairness, muted colors can sometimes be preferable. For instance, if you’re reading older comics printed before the late ‘90s, the e-reader screen delivers an experience closer to reading them on original newsprint, which is much duller than the glossy paper used today. If you’re a comic purist who doesn’t like how vibrant classic comics look on modern paper or on an iPad, you might actually prefer the Colorsoft's presentation.</p><p>With all that said, I want my comics, classic and modern, to look as bright and bold as possible, which is why I prefer the iPad's display. Again, the color Kindles do a decent job, but the presentation is far too washed out for my tastes.</p><h2 id="ecosystems-and-storage">Ecosystems and storage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1024px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="vea5JJviUmSAQfjRSpMeUD" name="marvel-unlimited.jpg" alt="marvel unlimited comic book reader apps" src="https://cdn.mos.cms.futurecdn.net/vea5JJviUmSAQfjRSpMeUD.jpg" mos="" align="middle" fullscreen="" width="1024" height="768" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Marvel)</span></figcaption></figure><p>iPads give you access to excellent dedicated comic reader apps like Panels and Chunky, along with major subscription platforms like Marvel Unlimited, DC Universe Infinite, and Shonen Jump. Conversely, Kindles mostly confine you to Amazon’s storefront, Comixology, and Kindle Unlimited. Sideloading your own files can also be a chore.</p><p>On that note, if you have a large library of digital comic files (.CBR, .CBZ, and high-res PDFs), you’re going to hit a storage cap much faster on a Kindle than on an iPad. Apple’s tablets offer storage tiers up to 1TB and can easily connect to cloud storage like Google Drive or iCloud to offload your libraries. Kindles top out at 64GB of storage on the Scribe and don’t natively support common comic book formats without converting the files first.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEqoge"></div>                            </div>                            <script src="https://kwizly.com/embed/eEqoge.js" async></script><h2 id="bottom-line-3">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HBb9cZdUkhtu6c62nxUJWC" name="iPad Pro M4 comic books-5.jpg" alt="Conan the Barbarian comic book on an iPad Pro 2024" src="https://cdn.mos.cms.futurecdn.net/HBb9cZdUkhtu6c62nxUJWC.jpg" mos="" align="middle" fullscreen="" width="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>Don't get me wrong — Kindles still hold the crown for battery life and portability. Throwing a lightweight Paperwhite into a bag for a week-long trip without needing to pack a charger is fantastic, and it remains my go-to choice for novels.</p><p>But while Kindles are perfectly serviceable for most everyday reading, I get a much richer experience reading comics on the iPad. With a larger display for viewing full layouts, bolder colors, and seamless performance, I'll choose Apple's tablet for my graphic novels every single 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/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">First OLED iPad mini tipped for October launch — here's why I'm excited (and worried)</a></li><li><a href="https://www.tomsguide.com/best-picks/best-tablet">We've tested the best tablets for entertainment and productivity, and these are the 8 I recommend right now</a></li><li><a href="https://www.tomsguide.com/computing/ipads/ipados-27-hands-on-preview">iPadOS 27 hands-on preview: Siri AI and all the big features</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Apple&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/e-readers/sorry-kindle-but-i-still-prefer-reading-comic-books-on-my-ipad</link>
                                                                            <description>
                            <![CDATA[ Reading comic books on Kindle can be enjoyable, but the experience is more enjoyable on iPads — here's why. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LQaA7fMFHXLsyQ7b8qxJfN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qnqgJC53NXVyfCmKKVC2y5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 18 Jul 2026 19:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[E-Readers]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qnqgJC53NXVyfCmKKVC2y5-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Comic books on an iPad Pro 2024]]></media:description>                                                            <media:text><![CDATA[Comic books on an iPad Pro 2024]]></media:text>
                                <media:title type="plain"><![CDATA[Comic books on an iPad Pro 2024]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qnqgJC53NXVyfCmKKVC2y5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">best Kindles</a> have been my primary way to read books for the better part of a decade. Thanks to Amazon’s e-reader, I’ve read more books in the past seven years than in the nearly four decades prior. Not only is the device easy to hold and read on, but its integration with the Kindle app and store gives me more books than I could read in a single lifetime.</p><p>Though I adore my Kindles, I don’t read comic books on them. Even after the introduction of the <a href="https://www.tomsguide.com/tablets/e-readers/kindle-colorsoft-review">Kindle Colorsoft</a>, which finally let me read comics in color, I still can’t bring myself to read comics full-time on Amazon's hardware. Why? Because, as a lifelong comic book fan, I get a much better experience on the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a>. Here’s why.</p><h2 id="display-size">Display size</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UHkmwSnbLfaJpaVj6YYqxT" name="iPad Pro M4 comic books-4.jpg" alt="A comic book on an iPad Pro 2024" src="https://cdn.mos.cms.futurecdn.net/UHkmwSnbLfaJpaVj6YYqxT.jpg" mos="" align="middle" fullscreen="" width="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>Digital comic apps like <a href="https://www.tomsguide.com/computing/mobile-apps/marvel-unlimited-heres-the-5-best-classic-comic-books-to-read-first">Marvel Unlimited</a> and DC Universe Infinite offer a guided view mode that zooms in on individual panels and text. This can be immersive, especially for those new to the medium. While guided mode works as advertised, I prefer seeing an entire comic page rather than breaking it up piece by piece.</p><p>On the <a href="https://www.tomsguide.com/tablets/e-readers/kindle-2024-review">base Kindle</a> and <a href="https://www.tomsguide.com/tablets/e-readers/kindle-paperwhite-2024-review">Kindle Paperwhite</a>, you almost have to use guided mode because of their small screens. For comics, I prefer reading on the <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">iPad Pro</a>. The 13-inch model’s screen is slightly larger than a physical comic book page. Not only do single pages look fantastic, but double-page spreads look incredible when you rotate the tablet to landscape orientation.</p><p>Another problem with using guided view or pinch-to-zoom on Kindles is the device’s low refresh rate. This causes the e-reader to lag and flash to clear previous image artifacts (ghosting). While this has improved with the latest Kindle models, the refresh rate is still sluggish compared to iPads, which handle panning and zooming instantly and smoothly.</p><p>Returning to screen size, the Kindle Scribe features a roomier 10.2-inch display. While that’s still smaller than the 11-inch iPad Pro and <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">iPad Air</a> models, it’s a good size for reading full comic book pages. There’s a specific reason I don’t use the Scribe for traditional color comics (which I’ll cover next), but for black-and-white manga, it’s legitimately great. However, since I don’t read much manga, that point is mostly moot for me.</p><p>When it comes to reading single pages and double-page spreads of a traditional American comic book, the iPad is simply the way to go.</p><h2 id="colorsoft-is-still-too-muted">Colorsoft is still too muted</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5172px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9B3xTqSpguT2kzFa28Lryn" name="Kindle Scribe Colorsoft (2025) review" alt="Kindle Scribe Colorsoft review unit in action" src="https://cdn.mos.cms.futurecdn.net/9B3xTqSpguT2kzFa28Lryn.jpg" mos="" align="middle" fullscreen="" width="5172" height="2909" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Kindle Colorsoft and <a href="https://www.tomsguide.com/computing/e-readers/kindle-scribe-colorsoft-2025-review">Kindle Scribe Colorsoft</a> are arguably the best color e-readers out there right now. If you mainly read traditional novels, having full-color book covers, maps, and other design elements is a nice perk. Naturally, comics are in color on these devices, but there is one major drawback—the hues are decidedly muted.</p><p>In fairness, muted colors can sometimes be preferable. For instance, if you’re reading older comics printed before the late ‘90s, the e-reader screen delivers an experience closer to reading them on original newsprint, which is much duller than the glossy paper used today. If you’re a comic purist who doesn’t like how vibrant classic comics look on modern paper or on an iPad, you might actually prefer the Colorsoft's presentation.</p><p>With all that said, I want my comics, classic and modern, to look as bright and bold as possible, which is why I prefer the iPad's display. Again, the color Kindles do a decent job, but the presentation is far too washed out for my tastes.</p><h2 id="ecosystems-and-storage">Ecosystems and storage</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1024px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="vea5JJviUmSAQfjRSpMeUD" name="marvel-unlimited.jpg" alt="marvel unlimited comic book reader apps" src="https://cdn.mos.cms.futurecdn.net/vea5JJviUmSAQfjRSpMeUD.jpg" mos="" align="middle" fullscreen="" width="1024" height="768" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Marvel)</span></figcaption></figure><p>iPads give you access to excellent dedicated comic reader apps like Panels and Chunky, along with major subscription platforms like Marvel Unlimited, DC Universe Infinite, and Shonen Jump. Conversely, Kindles mostly confine you to Amazon’s storefront, Comixology, and Kindle Unlimited. Sideloading your own files can also be a chore.</p><p>On that note, if you have a large library of digital comic files (.CBR, .CBZ, and high-res PDFs), you’re going to hit a storage cap much faster on a Kindle than on an iPad. Apple’s tablets offer storage tiers up to 1TB and can easily connect to cloud storage like Google Drive or iCloud to offload your libraries. Kindles top out at 64GB of storage on the Scribe and don’t natively support common comic book formats without converting the files first.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEqoge"></div>                            </div>                            <script src="https://kwizly.com/embed/eEqoge.js" async></script><h2 id="bottom-line-3">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HBb9cZdUkhtu6c62nxUJWC" name="iPad Pro M4 comic books-5.jpg" alt="Conan the Barbarian comic book on an iPad Pro 2024" src="https://cdn.mos.cms.futurecdn.net/HBb9cZdUkhtu6c62nxUJWC.jpg" mos="" align="middle" fullscreen="" width="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>Don't get me wrong — Kindles still hold the crown for battery life and portability. Throwing a lightweight Paperwhite into a bag for a week-long trip without needing to pack a charger is fantastic, and it remains my go-to choice for novels.</p><p>But while Kindles are perfectly serviceable for most everyday reading, I get a much richer experience reading comics on the iPad. With a larger display for viewing full layouts, bolder colors, and seamless performance, I'll choose Apple's tablet for my graphic novels every single 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/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">First OLED iPad mini tipped for October launch — here's why I'm excited (and worried)</a></li><li><a href="https://www.tomsguide.com/best-picks/best-tablet">We've tested the best tablets for entertainment and productivity, and these are the 8 I recommend right now</a></li><li><a href="https://www.tomsguide.com/computing/ipads/ipados-27-hands-on-preview">iPadOS 27 hands-on preview: Siri AI and all the big features</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Apple&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the ultra-affordable Amazon Ember 4-Series TV and I wasn’t disappointed — here’s how it stacks up ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Amazon Ember 4-Series (2025) is an admirable entry-level TV. The 43-inch and 55-inch models launched at $329 and $459, respectively, and they can now be found for as little as $269 and $379 when they’re on sale. So could the 4-Series be one of the <a href="https://www.tomsguide.com/tvs/best-tvs-under-500">best TVs under $500</a> we’ve ever tested? If you value affordability above all, it could be a contender.</p><p>The general performance of the Ember 4-Series is around what I’d expect given its budget sticker price. However, due to the lack of full-array local dimming, black levels weren’t as dark as I’d have liked, and the TV’s lower brightness threshold hurt the overall contrast.</p><p>It’s not going to make our list of the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> and I wouldn’t recommend the Ember 4-Series for serious home cinema lovers, but for people on a budget, it could be one to watch. To find out why, keep reading my Amazon Ember 4-Series review. </p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-specs"><span>Amazon Ember 4-Series review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNFX2K7" target="_blank" rel="nofollow">$329 (43”) - $459 (55”)</a> / <a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow">£439 (43”) - £549 (55”)</a></p></td></tr><tr><td class="firstcol " ><p><strong>Screen size</strong></p></td><td  ><p>43”, 50”, 55”</p></td></tr><tr><td class="firstcol " ><p><strong>Model</strong></p></td><td  ><p>Amazon Ember 4-Series 2025</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3840 x 2160</p></td></tr><tr><td class="firstcol " ><p><strong>HDR</strong></p></td><td  ><p>HDR 10+, HLG</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>60Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>3 HDMI 2.0 + 1 HDMI eARC 2.1, 1 x UBC-A, 1 x Optical</p></td></tr><tr><td class="firstcol " ><p><strong>Audio</strong></p></td><td  ><p>2.0 channel</p></td></tr><tr><td class="firstcol " ><p><strong>Smart TV software</strong></p></td><td  ><p>Amazon Fire</p></td></tr><tr><td class="firstcol " ><p><strong>Size (without stand)</strong></p></td><td  ><p>43: 37.7 in x 22.2 in x 3.2 in</p><p>50: 43.7 in x 25.6 in x 3.2 in</p><p>55: 48.3 in x 28.2 in x 3.2 in</p></td></tr><tr><td class="firstcol " ><p><strong>Weight (without stand)</strong></p></td><td  ><p>43: 14.1 lbs</p><p>50: 18.3 lbs</p><p>55: 21.6 lbs</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-amazon-ember-4-series-review-price-availability"><span>Amazon Ember 4-Series review: Price & availability </span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cTLUGSnHNXLVRGpRZHtMeN" name="Amazon Ember 4-Series.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/cTLUGSnHNXLVRGpRZHtMeN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Amazon Ember 4-Series is the second-cheapest TV under Amazon’s belt. The 4-Series (2025) launched at <a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNPK1D3" target="_blank" rel="nofollow">$329 for the 43-inch model</a> and <a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNFX2K7" target="_blank" rel="nofollow">$459 for the 55-inch</a>. Unlike the Ember QLED, the 4-Series’ biggest size is 55 inches. (Amazon Ember QLED is $479 for 50” and provides a brighter screen — but it’s still not perfect.)</p><p>In the U.K., the Ember 4-Series is <a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNW3BRR" target="_blank" rel="nofollow">£439 for the 43-incher</a> and <a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFP1VLZ2" target="_blank" rel="nofollow">£549 for 55 inches</a>, but is often on sale for around £300-£400 depending on the model. </p><p>If you’re wondering why your searches for “Amazon Fire TV” only seem to bring up old models, that’s because Amazon recently updated its naming conventions. Amazon TVs are now called “Ember”, not “Fire”. The OS is still called “Fire TV”, though. </p><p>Keep in mind that the Ember 4-Series is a traditional LED-LCD rather than a newer Mini-LED or a QLED. There’s no Mini-LED lighting for higher brightness and better contrast, nor is there a quantum dot filter for more vibrant colors in HDR. If those features sound appealing, you might want to check out the <a href="https://www.tomsguide.com/tvs/qled-tvs/hisense-qd7-qled-tv-review">Hisense QD7</a> ($339 for the 50” QLED) or the <a href="https://www.tomsguide.com/tvs/qled-tvs/samsung-q7f-qled-tv-review">Samsung Q7F</a> ($379 for 43” QLED).</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-design-and-ports"><span>Amazon Ember 4-Series review: Design and ports</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vkHahc4wLsZuRwGW6a72bN" name="Amazon Ember 4-Series 14.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/vkHahc4wLsZuRwGW6a72bN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Like the Amazon Ember QLED, the 4-Series looks pretty great from an aesthetic perspective for such a cheap TV. It’s just 3 inches deep, has two dual-pronged feet — much closer together than the Ember QLED, so better for smaller TV stands — and an attractive black bezel. </p><p>The ports are hidden on the back of the TV. Here you’ll find four HDMI ports, only one of which is a 2.1 with eARC, so if you’ve got a soundbar and a game console, you’ll need to choose which one gets the 2.1 connection. There’s also an optical port and a USB-A port if you have devices that require those connectivity types. </p><p>Although its limited port selection won’t win any design awards, the Ember 4-Series’ utilitarian functionality does the trick. </p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-how-we-test-tvs"><span>Amazon Ember 4-Series review: How we test TVs </span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oV562mSqwTFT5pjbszxVeN" name="Amazon Ember 4-Series 8.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/oV562mSqwTFT5pjbszxVeN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We follow a standard testing protocol for every TV we review at Tom’s Guide. Our benchmarks include a series of technical and subject tests designed to rate the set’s performance.</p><p>For technical benchmarking tests, we use a Jeti SpectraVal 1501-HiRes spectroradiometer, a Klein K10-A colorimeter, a Murideo 8K-SIX-G Metal pattern generator. We measure using Portrait Displays’ Calman TV calibration software. </p><p>We use a Leo Bodnar 4K Input Lag Tester to determine whether it’s one of the <a href="https://www.tomsguide.com/tvs/qled-tvs/i-played-tons-of-games-on-tvs-this-year-heres-the-top-gaming-tvs-worth-buying-for-your-ps5-xbox-switch-and-more">best gaming TVs</a>. For a more detailed look at what we do and how we do it, check out our “<a href="https://www.tomsguide.com/us/how-we-test-tvs,review-2478.html">How we test TVs</a>” page. </p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-test-results"><span>Amazon Ember 4-Series review: Test results</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Amazon Ember 4-Series</strong></p></th><th  ><p><strong>Amazon Ember QLED</strong></p></th><th  ><p>Roku Select Series</p></th><th  ><p>Hisense QD7</p></th><th  ><p>Vizio VQM65-C</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>SDR Brightness (10%, in nits)</strong></p></td><td  ><p>304</p></td><td  ><p>439</p></td><td  ><p>335</p></td><td  ><p>402</p></td><td  ><p>789</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E (lower is better)</strong></p></td><td  ><p>7.1</p></td><td  ><p>4.62</p></td><td  ><p>2.45</p></td><td  ><p>1.75</p></td><td  ><p>4.99</p></td></tr><tr><td class="firstcol " ><p><strong>Rec. 709 Gamut Coverage</strong></p></td><td  ><p>99.3%</p></td><td  ><p>99.8%</p></td><td  ><p>93.85%</p></td><td  ><p>99.56%</p></td><td  ><p>97.87%</p></td></tr><tr><td class="firstcol " ><p><strong>HDR Brightness (10%, in nits)</strong></p></td><td  ><p>287</p></td><td  ><p>251</p></td><td  ><p>335</p></td><td  ><p>659</p></td><td  ><p>779</p></td></tr><tr><td class="firstcol " ><p><strong>UHDA-P3 Gamut Coverage</strong></p></td><td  ><p>94.10%</p></td><td  ><p>96.19%</p></td><td  ><p>91.59%</p></td><td  ><p>94.33%</p></td><td  ><p>92.89%</p></td></tr><tr><td class="firstcol " ><p><strong>Rec. 2020 Gamut Coverage</strong></p></td><td  ><p>70.13%</p></td><td  ><p>72.31%</p></td><td  ><p>72.36%</p></td><td  ><p>74.73%</p></td><td  ><p>71.34%</p></td></tr><tr><td class="firstcol " ><p><strong>Input latency (in milliseconds)</strong></p></td><td  ><p>13</p></td><td  ><p>13</p></td><td  ><p>9.6</p></td><td  ><p>9.4</p></td><td  ><p>9.9</p></td></tr></tbody></table></div><p>The Ember 4-Series outputs only 304 nits in SDR and a measly 287 nits in HDR. The Delta-E score (color accuracy) was 7.1, which is pretty poor. </p><p>Compared to the more advanced Amazon Ember QLED, the 4-Series is going to be dimmer in SDR and will have noticeably skewed colors. This demonstrates exactly why QLED TVs have become so popular in the last few years — they offer better brightness and color. </p><p>If you’re willing to spend a bit more on the Hisense QD7, you’ll see a significant improvement across the board. Shows and movies recorded in HDR will look much punchier on the Hisense thanks to its higher peak brightness (659 nits vs 287 on the 4-Series) and better contrast.</p><p>If you’re a home cinema enthusiast, I don’t think you’d be overly impressed with the Amazon Ember 4-Series — but for the most casual of viewers, it’s not the worst TV we’ve ever tested.</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-performance"><span>Amazon Ember 4-Series review: Performance</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fbzQT6zDwJWHmexFSCwVKN" name="Amazon Ember 4-Series 16.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/fbzQT6zDwJWHmexFSCwVKN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I expected to dislike the Ember 4-Series based on the test results, but I actually enjoyed using this TV during my subjective tests. </p><p>When watching “Top Gun: Maverick” on 4K Blu-ray, colors were bright in outdoor scenes, but a little dim in indoor scenes. Blues look particularly vibrant on the 4-Series, so images of clear skies were standouts. </p><p>Scenes with a lot of warm colors — like the beach football scene — appeared a little washed out, especially when compared to the blue ocean. The TV has much better saturation for cooler colors. </p><p>I noticed a lot of motion smoothing and ghosting during dogfighting scenes in “Top Gun: Maverick” — it made me feel a little motion sick in some long sequences — but this wasn’t noticeable while watching TV on Netflix. </p><p>Speaking of TV, I also watched “Yellowjackets.” The snow scenes looked great, and I didn’t notice any white blooming. The colors looked striking in a dark room, but in daylight, warm tones especially had a tendency to undersaturate. </p><p>Gaming might be an issue if you play demanding games; the max refresh rate is 60Hz, so you might want to spend more on a 120Hz TV if that’s the most important area to you.</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-audio"><span>Amazon Ember 4-Series review: Audio</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MYXvLPNLKdCXvAzZLajeNN" name="Amazon Ember 4-Series 13.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/MYXvLPNLKdCXvAzZLajeNN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Ember 4-Series has two 10W speakers. I would best describe this sound as “thin” and possibly also “tinny”. As someone who’s been using a soundbar for years now, I don’t think I could ever go back to standard TV speakers. </p><p>You don’t have to spend a lot to get a great-sounding soundbar. One of the best soundbars we’ve tested, the <a href="https://www.tomsguide.com/audio/soundbars/sony-ht-s100f-review">Sony HT-S100F</a> is $99 (often on sale) and has fantastic clarity and a rich sound profile.</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-interface-and-apps"><span>Amazon Ember 4-Series review: Interface and apps</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="doXqJZEfcHGkuyYrRM7nbN" name="Amazon Ember 4-Series 11.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/doXqJZEfcHGkuyYrRM7nbN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As we all know, Amazon Fire TV interface is incredibly easy to use. However, I did notice it took longer to respond on the Ember QLED compared to a dedicated streaming stick., </p><p>Sometimes, title cards didn’t load for a few seconds and when apps loaded, they could be a little jerky. This is something I’ve found with a variety of Fire-powered TVs — my old Toshiba and my parents’ old Panasonic also suffer from this. </p><p>One of the biggest upgrades from previous Fire TV models is the updated Alexa+ functionality. With the purchase of the TV, you get a year of free Alexa+. When I asked, “Show me a high school drama”, it obeyed. Easy commands like “sci-fi movie” and “thriller TV series” bring up a range of suggestions. </p><p>Better still, if you have more Amazon devices like the Amazon Echo Studio or Amazon Echo Dot, you can link the TV up with them and they will behave as an external speaker.</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-remote"><span>Amazon Ember 4-Series review: Remote</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9ugLWyLaXQTxxsHfZnMwaM" name="Amazon Ember 4-Series 9.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/9ugLWyLaXQTxxsHfZnMwaM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As with every other Amazon TV, you get the classic ‘Fire TV’ remote. It’s easy to hold and is long and slender. There are four buttons on the bottom: <a href="https://www.tomsguide.com/reviews/disney-plus">Disney+</a>, <a href="https://www.tomsguide.com/uk/entertainment/streaming/netflix">Netflix</a>, Freely, and <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a>. I wish one of these could be programmable, however. On other platforms, this is a common feature, and I usually configure the remote to quick-start YouTube. </p><p>The remote uses two AAA batteries, so not as innovative as Samsung’s solar-powered remotes, but it’s not a deal-breaker at this price point. </p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-verdict"><span>Amazon Ember 4-Series review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gZpaSHbfSisYfEJeLwJExM" name="Amazon Ember 4-Series 7.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/gZpaSHbfSisYfEJeLwJExM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Even though the Amazon Ember 4-Series didn’t perform well in our benchmarking tests, I actually think it’s a decent budget option. In 4K Blu-rays, I noticed a few issues with motion handling and color accuracy; however, when I was watching TV on Netflix and YouTube, the performance was great.</p><p>If you’re on a serious budget and want a 55-inch screen for well under $500, there are some other options like the <a href="https://www.tomsguide.com/tvs/qled-tvs/hisense-qd7-qled-tv-review">Hisense QD7</a>. It’s more expensive, but it offers both quantum dot colors and better overall brightness. </p><p>Still, if price is the ultimate factor in your buying decision, I still recommend the Ember 4-Series. Those looking for an entry-level, easy-to-use model with a huge variety of downloadable apps and built-in Alexa will find it here. </p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tvs/amazon-ember-4-series-review</link>
                                                                            <description>
                            <![CDATA[ Although it’s not as bright or color-accurate as pricier alternatives, for around $300, the Amazon Ember 4-Series is a decent option. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7Z9JRG3oY9GEsNmHNehchh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/zP9UyaHq8ZhJBzNx6FQGKN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Jul 2026 11:26:05 +0000</pubDate>                                                                                                                                <updated>Wed, 15 Jul 2026 13:45:22 +0000</updated>
                                                                                                                                            <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ erin.bashford@futurenet.com (Erin Bashford) ]]></author>                    <dc:creator><![CDATA[ Erin Bashford ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/rLvJvJVZx43hEzSsJy3BpL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Erin Bashford is a senior reviews writer at Tom’s Guide. She has a Master’s in Broadcast and Digital Journalism from the University of East Anglia and 7 years of experience reviewing music and events for various publications. She has edited publications such as Outline Magazine’s Guide to Norwich, and she has written for a number of music magazines and websites such as Clash Magazine, Outline Magazine and Dork Magazine. She has a strong interest in audio gear and the music world. &lt;/p&gt;&lt;p&gt;As an ex-barista, Erin is passionate about coffee tech. She also loves finding the best cooking hacks and kitchen appliances, including her beloved Instant Pot. &lt;/p&gt;&lt;p&gt;In her spare time, you can find her reading, practising yoga, hiking, writing fantasy novels, or stressing over NYT Games.&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/zP9UyaHq8ZhJBzNx6FQGKN-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the amazon ember 4-series TV photographed against the blue tom&#039;s guide background]]></media:description>                                                            <media:text><![CDATA[the amazon ember 4-series TV photographed against the blue tom&#039;s guide background]]></media:text>
                                <media:title type="plain"><![CDATA[the amazon ember 4-series TV photographed against the blue tom&#039;s guide background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/zP9UyaHq8ZhJBzNx6FQGKN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Amazon Ember 4-Series (2025) is an admirable entry-level TV. The 43-inch and 55-inch models launched at $329 and $459, respectively, and they can now be found for as little as $269 and $379 when they’re on sale. So could the 4-Series be one of the <a href="https://www.tomsguide.com/tvs/best-tvs-under-500">best TVs under $500</a> we’ve ever tested? If you value affordability above all, it could be a contender.</p><p>The general performance of the Ember 4-Series is around what I’d expect given its budget sticker price. However, due to the lack of full-array local dimming, black levels weren’t as dark as I’d have liked, and the TV’s lower brightness threshold hurt the overall contrast.</p><p>It’s not going to make our list of the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> and I wouldn’t recommend the Ember 4-Series for serious home cinema lovers, but for people on a budget, it could be one to watch. To find out why, keep reading my Amazon Ember 4-Series review. </p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-specs"><span>Amazon Ember 4-Series review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNFX2K7" target="_blank" rel="nofollow">$329 (43”) - $459 (55”)</a> / <a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow">£439 (43”) - £549 (55”)</a></p></td></tr><tr><td class="firstcol " ><p><strong>Screen size</strong></p></td><td  ><p>43”, 50”, 55”</p></td></tr><tr><td class="firstcol " ><p><strong>Model</strong></p></td><td  ><p>Amazon Ember 4-Series 2025</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3840 x 2160</p></td></tr><tr><td class="firstcol " ><p><strong>HDR</strong></p></td><td  ><p>HDR 10+, HLG</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>60Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>3 HDMI 2.0 + 1 HDMI eARC 2.1, 1 x UBC-A, 1 x Optical</p></td></tr><tr><td class="firstcol " ><p><strong>Audio</strong></p></td><td  ><p>2.0 channel</p></td></tr><tr><td class="firstcol " ><p><strong>Smart TV software</strong></p></td><td  ><p>Amazon Fire</p></td></tr><tr><td class="firstcol " ><p><strong>Size (without stand)</strong></p></td><td  ><p>43: 37.7 in x 22.2 in x 3.2 in</p><p>50: 43.7 in x 25.6 in x 3.2 in</p><p>55: 48.3 in x 28.2 in x 3.2 in</p></td></tr><tr><td class="firstcol " ><p><strong>Weight (without stand)</strong></p></td><td  ><p>43: 14.1 lbs</p><p>50: 18.3 lbs</p><p>55: 21.6 lbs</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-amazon-ember-4-series-review-price-availability"><span>Amazon Ember 4-Series review: Price & availability </span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cTLUGSnHNXLVRGpRZHtMeN" name="Amazon Ember 4-Series.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/cTLUGSnHNXLVRGpRZHtMeN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Amazon Ember 4-Series is the second-cheapest TV under Amazon’s belt. The 4-Series (2025) launched at <a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNPK1D3" target="_blank" rel="nofollow">$329 for the 43-inch model</a> and <a href="https://www.amazon.com/Fire-TV-4-Series-43-inch/dp/B0DFNFX2K7" target="_blank" rel="nofollow">$459 for the 55-inch</a>. Unlike the Ember QLED, the 4-Series’ biggest size is 55 inches. (Amazon Ember QLED is $479 for 50” and provides a brighter screen — but it’s still not perfect.)</p><p>In the U.K., the Ember 4-Series is <a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNW3BRR" target="_blank" rel="nofollow">£439 for the 43-incher</a> and <a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFP1VLZ2" target="_blank" rel="nofollow">£549 for 55 inches</a>, but is often on sale for around £300-£400 depending on the model. </p><p>If you’re wondering why your searches for “Amazon Fire TV” only seem to bring up old models, that’s because Amazon recently updated its naming conventions. Amazon TVs are now called “Ember”, not “Fire”. The OS is still called “Fire TV”, though. </p><p>Keep in mind that the Ember 4-Series is a traditional LED-LCD rather than a newer Mini-LED or a QLED. There’s no Mini-LED lighting for higher brightness and better contrast, nor is there a quantum dot filter for more vibrant colors in HDR. If those features sound appealing, you might want to check out the <a href="https://www.tomsguide.com/tvs/qled-tvs/hisense-qd7-qled-tv-review">Hisense QD7</a> ($339 for the 50” QLED) or the <a href="https://www.tomsguide.com/tvs/qled-tvs/samsung-q7f-qled-tv-review">Samsung Q7F</a> ($379 for 43” QLED).</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-design-and-ports"><span>Amazon Ember 4-Series review: Design and ports</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vkHahc4wLsZuRwGW6a72bN" name="Amazon Ember 4-Series 14.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/vkHahc4wLsZuRwGW6a72bN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Like the Amazon Ember QLED, the 4-Series looks pretty great from an aesthetic perspective for such a cheap TV. It’s just 3 inches deep, has two dual-pronged feet — much closer together than the Ember QLED, so better for smaller TV stands — and an attractive black bezel. </p><p>The ports are hidden on the back of the TV. Here you’ll find four HDMI ports, only one of which is a 2.1 with eARC, so if you’ve got a soundbar and a game console, you’ll need to choose which one gets the 2.1 connection. There’s also an optical port and a USB-A port if you have devices that require those connectivity types. </p><p>Although its limited port selection won’t win any design awards, the Ember 4-Series’ utilitarian functionality does the trick. </p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-how-we-test-tvs"><span>Amazon Ember 4-Series review: How we test TVs </span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oV562mSqwTFT5pjbszxVeN" name="Amazon Ember 4-Series 8.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/oV562mSqwTFT5pjbszxVeN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We follow a standard testing protocol for every TV we review at Tom’s Guide. Our benchmarks include a series of technical and subject tests designed to rate the set’s performance.</p><p>For technical benchmarking tests, we use a Jeti SpectraVal 1501-HiRes spectroradiometer, a Klein K10-A colorimeter, a Murideo 8K-SIX-G Metal pattern generator. We measure using Portrait Displays’ Calman TV calibration software. </p><p>We use a Leo Bodnar 4K Input Lag Tester to determine whether it’s one of the <a href="https://www.tomsguide.com/tvs/qled-tvs/i-played-tons-of-games-on-tvs-this-year-heres-the-top-gaming-tvs-worth-buying-for-your-ps5-xbox-switch-and-more">best gaming TVs</a>. For a more detailed look at what we do and how we do it, check out our “<a href="https://www.tomsguide.com/us/how-we-test-tvs,review-2478.html">How we test TVs</a>” page. </p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-test-results"><span>Amazon Ember 4-Series review: Test results</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Amazon Ember 4-Series</strong></p></th><th  ><p><strong>Amazon Ember QLED</strong></p></th><th  ><p>Roku Select Series</p></th><th  ><p>Hisense QD7</p></th><th  ><p>Vizio VQM65-C</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>SDR Brightness (10%, in nits)</strong></p></td><td  ><p>304</p></td><td  ><p>439</p></td><td  ><p>335</p></td><td  ><p>402</p></td><td  ><p>789</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E (lower is better)</strong></p></td><td  ><p>7.1</p></td><td  ><p>4.62</p></td><td  ><p>2.45</p></td><td  ><p>1.75</p></td><td  ><p>4.99</p></td></tr><tr><td class="firstcol " ><p><strong>Rec. 709 Gamut Coverage</strong></p></td><td  ><p>99.3%</p></td><td  ><p>99.8%</p></td><td  ><p>93.85%</p></td><td  ><p>99.56%</p></td><td  ><p>97.87%</p></td></tr><tr><td class="firstcol " ><p><strong>HDR Brightness (10%, in nits)</strong></p></td><td  ><p>287</p></td><td  ><p>251</p></td><td  ><p>335</p></td><td  ><p>659</p></td><td  ><p>779</p></td></tr><tr><td class="firstcol " ><p><strong>UHDA-P3 Gamut Coverage</strong></p></td><td  ><p>94.10%</p></td><td  ><p>96.19%</p></td><td  ><p>91.59%</p></td><td  ><p>94.33%</p></td><td  ><p>92.89%</p></td></tr><tr><td class="firstcol " ><p><strong>Rec. 2020 Gamut Coverage</strong></p></td><td  ><p>70.13%</p></td><td  ><p>72.31%</p></td><td  ><p>72.36%</p></td><td  ><p>74.73%</p></td><td  ><p>71.34%</p></td></tr><tr><td class="firstcol " ><p><strong>Input latency (in milliseconds)</strong></p></td><td  ><p>13</p></td><td  ><p>13</p></td><td  ><p>9.6</p></td><td  ><p>9.4</p></td><td  ><p>9.9</p></td></tr></tbody></table></div><p>The Ember 4-Series outputs only 304 nits in SDR and a measly 287 nits in HDR. The Delta-E score (color accuracy) was 7.1, which is pretty poor. </p><p>Compared to the more advanced Amazon Ember QLED, the 4-Series is going to be dimmer in SDR and will have noticeably skewed colors. This demonstrates exactly why QLED TVs have become so popular in the last few years — they offer better brightness and color. </p><p>If you’re willing to spend a bit more on the Hisense QD7, you’ll see a significant improvement across the board. Shows and movies recorded in HDR will look much punchier on the Hisense thanks to its higher peak brightness (659 nits vs 287 on the 4-Series) and better contrast.</p><p>If you’re a home cinema enthusiast, I don’t think you’d be overly impressed with the Amazon Ember 4-Series — but for the most casual of viewers, it’s not the worst TV we’ve ever tested.</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-performance"><span>Amazon Ember 4-Series review: Performance</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fbzQT6zDwJWHmexFSCwVKN" name="Amazon Ember 4-Series 16.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/fbzQT6zDwJWHmexFSCwVKN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I expected to dislike the Ember 4-Series based on the test results, but I actually enjoyed using this TV during my subjective tests. </p><p>When watching “Top Gun: Maverick” on 4K Blu-ray, colors were bright in outdoor scenes, but a little dim in indoor scenes. Blues look particularly vibrant on the 4-Series, so images of clear skies were standouts. </p><p>Scenes with a lot of warm colors — like the beach football scene — appeared a little washed out, especially when compared to the blue ocean. The TV has much better saturation for cooler colors. </p><p>I noticed a lot of motion smoothing and ghosting during dogfighting scenes in “Top Gun: Maverick” — it made me feel a little motion sick in some long sequences — but this wasn’t noticeable while watching TV on Netflix. </p><p>Speaking of TV, I also watched “Yellowjackets.” The snow scenes looked great, and I didn’t notice any white blooming. The colors looked striking in a dark room, but in daylight, warm tones especially had a tendency to undersaturate. </p><p>Gaming might be an issue if you play demanding games; the max refresh rate is 60Hz, so you might want to spend more on a 120Hz TV if that’s the most important area to you.</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-audio"><span>Amazon Ember 4-Series review: Audio</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MYXvLPNLKdCXvAzZLajeNN" name="Amazon Ember 4-Series 13.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/MYXvLPNLKdCXvAzZLajeNN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Ember 4-Series has two 10W speakers. I would best describe this sound as “thin” and possibly also “tinny”. As someone who’s been using a soundbar for years now, I don’t think I could ever go back to standard TV speakers. </p><p>You don’t have to spend a lot to get a great-sounding soundbar. One of the best soundbars we’ve tested, the <a href="https://www.tomsguide.com/audio/soundbars/sony-ht-s100f-review">Sony HT-S100F</a> is $99 (often on sale) and has fantastic clarity and a rich sound profile.</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-interface-and-apps"><span>Amazon Ember 4-Series review: Interface and apps</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="doXqJZEfcHGkuyYrRM7nbN" name="Amazon Ember 4-Series 11.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/doXqJZEfcHGkuyYrRM7nbN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As we all know, Amazon Fire TV interface is incredibly easy to use. However, I did notice it took longer to respond on the Ember QLED compared to a dedicated streaming stick., </p><p>Sometimes, title cards didn’t load for a few seconds and when apps loaded, they could be a little jerky. This is something I’ve found with a variety of Fire-powered TVs — my old Toshiba and my parents’ old Panasonic also suffer from this. </p><p>One of the biggest upgrades from previous Fire TV models is the updated Alexa+ functionality. With the purchase of the TV, you get a year of free Alexa+. When I asked, “Show me a high school drama”, it obeyed. Easy commands like “sci-fi movie” and “thriller TV series” bring up a range of suggestions. </p><p>Better still, if you have more Amazon devices like the Amazon Echo Studio or Amazon Echo Dot, you can link the TV up with them and they will behave as an external speaker.</p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-remote"><span>Amazon Ember 4-Series review: Remote</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9ugLWyLaXQTxxsHfZnMwaM" name="Amazon Ember 4-Series 9.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/9ugLWyLaXQTxxsHfZnMwaM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As with every other Amazon TV, you get the classic ‘Fire TV’ remote. It’s easy to hold and is long and slender. There are four buttons on the bottom: <a href="https://www.tomsguide.com/reviews/disney-plus">Disney+</a>, <a href="https://www.tomsguide.com/uk/entertainment/streaming/netflix">Netflix</a>, Freely, and <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a>. I wish one of these could be programmable, however. On other platforms, this is a common feature, and I usually configure the remote to quick-start YouTube. </p><p>The remote uses two AAA batteries, so not as innovative as Samsung’s solar-powered remotes, but it’s not a deal-breaker at this price point. </p><h2 class="article-body__section" id="section-amazon-ember-4-series-review-verdict"><span>Amazon Ember 4-Series review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gZpaSHbfSisYfEJeLwJExM" name="Amazon Ember 4-Series 7.JPG" alt="the amazon ember 4-series TV photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/gZpaSHbfSisYfEJeLwJExM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Even though the Amazon Ember 4-Series didn’t perform well in our benchmarking tests, I actually think it’s a decent budget option. In 4K Blu-rays, I noticed a few issues with motion handling and color accuracy; however, when I was watching TV on Netflix and YouTube, the performance was great.</p><p>If you’re on a serious budget and want a 55-inch screen for well under $500, there are some other options like the <a href="https://www.tomsguide.com/tvs/qled-tvs/hisense-qd7-qled-tv-review">Hisense QD7</a>. It’s more expensive, but it offers both quantum dot colors and better overall brightness. </p><p>Still, if price is the ultimate factor in your buying decision, I still recommend the Ember 4-Series. Those looking for an entry-level, easy-to-use model with a huge variety of downloadable apps and built-in Alexa will find it here. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon quietly upgrades Fire HD 10 tablet — make sure you buy the right one ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Amazon released its most recent update to the <a href="https://www.tomsguide.com/reviews/amazon-fire-hd-10-2023">Fire HD 10 tablet in 2023</a>, and it was starting to feel pretty dated with only 3GB of RAM under the hood. Amazon, deciding to forgo the fanfare, has quietly released a <a href="https://www.amazon.com/dp/B0GVTPKJVT?" target="_blank" rel="nofollow">new version of the tablet with an extra 1GB of RAM</a>, bringing it more in line with modern budget-friendly tablets.</p><p>Of course, with a new model and more memory comes a slightly higher price tag. Instead of $139.99, Amazon has pushed the price to $154.99. While $15 isn't necessarily enough to break the bank, for an <a href="https://www.tomsguide.com/best-picks/best-cheap-tablets">affordable tablet</a> like this, it could be the difference between being within someone's budget and not.</p><p>There's a bit of confusion on Amazon's website. You can see the new Fire HD 10 on the company's website, and everything looks normal there. But if you go to the <a href="https://www.amazon.com/dp/B0BHZT5S12" target="_blank" rel="nofollow">older model</a>, it says, "You’re viewing the newest model of this product — see what's new" right on the front page.</p><div class="product"><a data-dimension112="d3465fbb-18ce-4da1-9770-28a6200d1fcc" data-action="Deal Block" data-label="Fire HD 10 (4GB version)" data-dimension48="Fire HD 10 (4GB version)" data-dimension25="$154" href="https://www.amazon.com/dp/B0GVTPKJVT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:62.13%;"><img id="B64PduMnXMUfe2yrjFngQQ" name="Fire HD 10 (4GB version)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/B64PduMnXMUfe2yrjFngQQ.png" mos="" align="middle" fullscreen="" width="1500" height="932" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0GVTPKJVT" target="_blank" rel="nofollow" data-dimension112="d3465fbb-18ce-4da1-9770-28a6200d1fcc" data-action="Deal Block" data-label="Fire HD 10 (4GB version)" data-dimension48="Fire HD 10 (4GB version)" data-dimension25="$154">Fire HD 10 (4GB version): $154</a></strong><br>This is the correct model to buy if you want the most available RAM on Amazon's large-screen, affordable tablet. It is $15 more than the 2023 version, but with the extra memory, it's worth it to ensure the device can run the (somewhat limited) selection of apps available on Amazon tablets for the long haul.<a class="view-deal button" href="https://www.amazon.com/dp/B0GVTPKJVT" target="_blank" rel="nofollow" data-dimension112="d3465fbb-18ce-4da1-9770-28a6200d1fcc" data-action="Deal Block" data-label="Fire HD 10 (4GB version)" data-dimension48="Fire HD 10 (4GB version)" data-dimension25="$154">View Deal</a></p></div><p>Lots of potential buyers aren't looking at the latest tech news to see when Amazon quietly launches upgraded tablets, so they might just search for Fire HD 10 (or even a cheap tablet) on Amazon and stumble on the three-year-old version and think it's the newest one. That extra 1GB of RAM could significantly improve overall performance. </p><p>It's possible Amazon still considers the 2023 version to be the newest model, since it's the only one that offers 3GB of RAM, and it's showing the 4GB version as a separate model, not a replacement, but that would be an odd distinction to have between models, and I have to assume the 3GB version will be phased out.</p><p>Both tablets have 32GB of storage, and the <a href="https://www.amazon.com/dp/B0BHZWT2FR" target="_blank" rel="nofollow">64GB upgrade is only available on the older model</a>. Perhaps Amazon has decided that the extra space isn't needed in a tablet at this low price point. </p><p>If you're in the market for an affordable Amazon device, and you think you'll benefit from the extra memory (and I'm pretty sure you will), be sure to get the <em>actual </em>latest version. Hopefully, Amazon removes the "newest model" tag from the 2023 Fire HD 10 to avoid confusion, as I'm sure this was just an error and not an attempt to trick shoppers. But even if it's a mistake, it could still lead to confusion and wasted money. </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/opinion/i-use-these-3-tricks-with-all-my-tablets-so-they-dont-just-feel-like-a-bigger-phone">I use these 3 tricks with all my tablets so they don’t just feel like a bigger phone</a></li><li><a href="https://www.tomsguide.com/best-picks/best-tablets-under-dollar500">These are the best budget tablets under $500</a></li><li><a href="https://www.tomsguide.com/computing/tablets/samsung-galaxy-tab-s11-ultra-vs-ipad-pro-m5-which-tablet-should-you-buy">Samsung Galaxy Tab S11 Ultra vs. iPad Pro M5 — which tablet should you buy?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/amazon-quietly-upgrades-fire-hd-10-tablet-make-sure-you-buy-the-right-one</link>
                                                                            <description>
                            <![CDATA[ It's a bit confusing: Amazon released a new Fire HD 10, but the old model still shows as the 'newest model' on Amazon. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kxio9XVBatUsn3gESV33QP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Ezbb5DL7vYM5VDTjq2Wafn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 04 Jul 2026 13:40:42 +0000</pubDate>                                                                                                                                <updated>Sat, 04 Jul 2026 13:42:57 +0000</updated>
                                                                                                                                            <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ dave.leclair@futurenet.com (Dave LeClair) ]]></author>                    <dc:creator><![CDATA[ Dave LeClair ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/fyx7qYdxPMTNBhdnMfNmaB.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Managing News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Ezbb5DL7vYM5VDTjq2Wafn-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon Fire HD 10]]></media:description>                                                            <media:text><![CDATA[Amazon Fire HD 10]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon Fire HD 10]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Ezbb5DL7vYM5VDTjq2Wafn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon released its most recent update to the <a href="https://www.tomsguide.com/reviews/amazon-fire-hd-10-2023">Fire HD 10 tablet in 2023</a>, and it was starting to feel pretty dated with only 3GB of RAM under the hood. Amazon, deciding to forgo the fanfare, has quietly released a <a href="https://www.amazon.com/dp/B0GVTPKJVT?" target="_blank" rel="nofollow">new version of the tablet with an extra 1GB of RAM</a>, bringing it more in line with modern budget-friendly tablets.</p><p>Of course, with a new model and more memory comes a slightly higher price tag. Instead of $139.99, Amazon has pushed the price to $154.99. While $15 isn't necessarily enough to break the bank, for an <a href="https://www.tomsguide.com/best-picks/best-cheap-tablets">affordable tablet</a> like this, it could be the difference between being within someone's budget and not.</p><p>There's a bit of confusion on Amazon's website. You can see the new Fire HD 10 on the company's website, and everything looks normal there. But if you go to the <a href="https://www.amazon.com/dp/B0BHZT5S12" target="_blank" rel="nofollow">older model</a>, it says, "You’re viewing the newest model of this product — see what's new" right on the front page.</p><div class="product"><a data-dimension112="d3465fbb-18ce-4da1-9770-28a6200d1fcc" data-action="Deal Block" data-label="Fire HD 10 (4GB version)" data-dimension48="Fire HD 10 (4GB version)" data-dimension25="$154" href="https://www.amazon.com/dp/B0GVTPKJVT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:62.13%;"><img id="B64PduMnXMUfe2yrjFngQQ" name="Fire HD 10 (4GB version)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/B64PduMnXMUfe2yrjFngQQ.png" mos="" align="middle" fullscreen="" width="1500" height="932" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/dp/B0GVTPKJVT" target="_blank" rel="nofollow" data-dimension112="d3465fbb-18ce-4da1-9770-28a6200d1fcc" data-action="Deal Block" data-label="Fire HD 10 (4GB version)" data-dimension48="Fire HD 10 (4GB version)" data-dimension25="$154">Fire HD 10 (4GB version): $154</a></strong><br>This is the correct model to buy if you want the most available RAM on Amazon's large-screen, affordable tablet. It is $15 more than the 2023 version, but with the extra memory, it's worth it to ensure the device can run the (somewhat limited) selection of apps available on Amazon tablets for the long haul.<a class="view-deal button" href="https://www.amazon.com/dp/B0GVTPKJVT" target="_blank" rel="nofollow" data-dimension112="d3465fbb-18ce-4da1-9770-28a6200d1fcc" data-action="Deal Block" data-label="Fire HD 10 (4GB version)" data-dimension48="Fire HD 10 (4GB version)" data-dimension25="$154">View Deal</a></p></div><p>Lots of potential buyers aren't looking at the latest tech news to see when Amazon quietly launches upgraded tablets, so they might just search for Fire HD 10 (or even a cheap tablet) on Amazon and stumble on the three-year-old version and think it's the newest one. That extra 1GB of RAM could significantly improve overall performance. </p><p>It's possible Amazon still considers the 2023 version to be the newest model, since it's the only one that offers 3GB of RAM, and it's showing the 4GB version as a separate model, not a replacement, but that would be an odd distinction to have between models, and I have to assume the 3GB version will be phased out.</p><p>Both tablets have 32GB of storage, and the <a href="https://www.amazon.com/dp/B0BHZWT2FR" target="_blank" rel="nofollow">64GB upgrade is only available on the older model</a>. Perhaps Amazon has decided that the extra space isn't needed in a tablet at this low price point. </p><p>If you're in the market for an affordable Amazon device, and you think you'll benefit from the extra memory (and I'm pretty sure you will), be sure to get the <em>actual </em>latest version. Hopefully, Amazon removes the "newest model" tag from the 2023 Fire HD 10 to avoid confusion, as I'm sure this was just an error and not an attempt to trick shoppers. But even if it's a mistake, it could still lead to confusion and wasted money. </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/opinion/i-use-these-3-tricks-with-all-my-tablets-so-they-dont-just-feel-like-a-bigger-phone">I use these 3 tricks with all my tablets so they don’t just feel like a bigger phone</a></li><li><a href="https://www.tomsguide.com/best-picks/best-tablets-under-dollar500">These are the best budget tablets under $500</a></li><li><a href="https://www.tomsguide.com/computing/tablets/samsung-galaxy-tab-s11-ultra-vs-ipad-pro-m5-which-tablet-should-you-buy">Samsung Galaxy Tab S11 Ultra vs. iPad Pro M5 — which tablet should you buy?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video movies to stream this weekend (July 3-5) ]]></title>
                                                                                                <dc:content><![CDATA[ <p><a href="https://www.tomsguide.com/entertainment/streaming/prime-video"><strong>Prime Video</strong></a> is a great <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> for finding your next favorite movie. While Amazon doesn't have the deepest library of original movies, it adds dozens of movies to its streaming service each month. In fact, it <a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-69-new-movies-and-shows-here-are-the-5-im-streaming-first">just added 69 new movies and shows on July 1</a> alone.</p><p>This week, I've scoured the list of what's on Prime, and I've landed on three must-watch films. At the top of the list is "<strong>Project Hail Mary</strong>," which is making its Prime Video debut this weekend. Then, there's "<strong>Gladiator</strong>," a movie that needs no excuse to be watched. Finally, I'm ending things on a high note with "<strong>Tropic Thunder</strong>," which absolutely would not get made today, yet remains a comedy classic.</p><p>So, here are the three new to Prime Video movies that you need to be streaming this weekend. If you need more recommendations, check out our full guide to <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-july-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">everything new on Prime Video in July 2026</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="project-hail-mary-2026-3">'Project Hail Mary' (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/m08TxIsFTRI" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Science fiction movie</p><p><strong>What's it about? </strong>"<a href="https://www.tomsguide.com/entertainment/movies/project-hail-mary-review-ryan-gosling-shines-in-the-best-movie-of-the-year-so-far">Project Hail Mary</a>" stars Ryan Gosling as Grace, a school teacher who awakes to find himself in space, where he meets the alien, Rocky (James Ortiz). Together, they try to solve why an alien dubbed "Astrophage" is killing nearly every sun in the galaxy, while Grace starts to remember who he is and how he ended up as part of Project Hail Mary.</p><p><strong>Why you need to watch it: </strong>This was my best movie of 2026 until it was finally beaten out by "<a href="https://www.tomsguide.com/entertainment/movies/the-invite-review">The Invite</a>" at the end of June. It's an incredible display of technical filmmaking skill, anchored by Oscar-worthy performances from Gosling and Ortiz, who is both the puppeteer for the alien Rocky and the voice.</p><p><em>Stream </em><a href="https://www.amazon.com/" target="_blank" rel="nofollow"><em>"Project Hail Mary" on Prime Video</em></a><em> now</em></p><h2 id="gladiator-2000">'Gladiator' (2000)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/P5ieIbInFpg" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Epic historical fiction movie</p><p><strong>What's it about? </strong>"Gladiator" tells the tale of Maximus Decimus Meridius (Russell Crowe). Commander of the Armies of the North, General of the Felix Legions. Loyal servant to the true emperor, Marcus Aurelius (Richard Harris). Father to a murdered son (Giorgio Cantarini), husband to a murdered wife (Ginnina Facio). He will have his vengeance, in this life or the next.</p><p><strong>Why you need to watch it: </strong>This movie is always worth a rewatch. If you've never seen it before, go watch it now. If you don't like it, I'll give you your money back (but not really).</p><p><em>Stream </em><a href="https://www.amazon.com/" target="_blank" rel="nofollow"><em>"Gladiator" on Prime Video</em></a><em> now</em></p><h2 id="tropic-thunder-2008">'Tropic Thunder' (2008)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/9Pl4JNnqNaE" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Action comedy movie</p><p><strong>What's it about? </strong>"Tropic Thunder" stars Ben Stiller as action star Tugg Speedman, who, along with Jeff Portnoy (Jack Black), Kirk Lazarus (Robert Downey Jr.) and many other (fictional) stars, heads to Vietnam to film a war movie. But when the film's director (Steve Coogan) explodes, stepping on a land mine, and Tugg gets captured by rebels, everything becomes chaos.</p><p><strong>Why you need to watch it: </strong>This movie is, simply put, hysterical. The cast is excellent, especially Downey Jr., whose Kirk Lazarus is in Blackface as Lincoln Osiris for nearly the entire movie. Even though it's a satirical performance, it almost certainly would stop this movie from getting made today, despite earning the Marvel star an Oscar nomination.</p><p><em>Stream </em><a href="https://www.amazon.com/" target="_blank" rel="nofollow"><em>"Tropic Thunder" on Prime Video</em></a><em> now</em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-july-2026">Missed it in theaters? Here's every movie finally arriving on streaming in July 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-just-added-tk-new-shows-and-movies-heres-5-id-stream-right-now-july-1-2026">Netflix just added 37 new shows and movies — here's 5 I'd stream right now</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/minions-and-monsters-is-no-toy-story-5-but-youll-still-have-a-blast">'Minions and Monsters' is no 'Toy Story 5,' but you'll still have a blast</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-movies-to-stream-this-weekend-july-3-5-2026</link>
                                                                            <description>
                            <![CDATA[ Prime Video is always adding more movies, and these three recently added films are worthy of a spot in your watchlist this weekend. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">q3T6fjLFeAp4cdsgAQx6tP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jei6mM4DzGfkzn9S6Ezz7U-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Jul 2026 14:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Movies]]></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/jpeg" url="https://cdn.mos.cms.futurecdn.net/jei6mM4DzGfkzn9S6Ezz7U-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a yellow popcorn background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a yellow popcorn background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a yellow popcorn background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jei6mM4DzGfkzn9S6Ezz7U-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/entertainment/streaming/prime-video"><strong>Prime Video</strong></a> is a great <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> for finding your next favorite movie. While Amazon doesn't have the deepest library of original movies, it adds dozens of movies to its streaming service each month. In fact, it <a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-69-new-movies-and-shows-here-are-the-5-im-streaming-first">just added 69 new movies and shows on July 1</a> alone.</p><p>This week, I've scoured the list of what's on Prime, and I've landed on three must-watch films. At the top of the list is "<strong>Project Hail Mary</strong>," which is making its Prime Video debut this weekend. Then, there's "<strong>Gladiator</strong>," a movie that needs no excuse to be watched. Finally, I'm ending things on a high note with "<strong>Tropic Thunder</strong>," which absolutely would not get made today, yet remains a comedy classic.</p><p>So, here are the three new to Prime Video movies that you need to be streaming this weekend. If you need more recommendations, check out our full guide to <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-july-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">everything new on Prime Video in July 2026</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="project-hail-mary-2026-3">'Project Hail Mary' (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/m08TxIsFTRI" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Science fiction movie</p><p><strong>What's it about? </strong>"<a href="https://www.tomsguide.com/entertainment/movies/project-hail-mary-review-ryan-gosling-shines-in-the-best-movie-of-the-year-so-far">Project Hail Mary</a>" stars Ryan Gosling as Grace, a school teacher who awakes to find himself in space, where he meets the alien, Rocky (James Ortiz). Together, they try to solve why an alien dubbed "Astrophage" is killing nearly every sun in the galaxy, while Grace starts to remember who he is and how he ended up as part of Project Hail Mary.</p><p><strong>Why you need to watch it: </strong>This was my best movie of 2026 until it was finally beaten out by "<a href="https://www.tomsguide.com/entertainment/movies/the-invite-review">The Invite</a>" at the end of June. It's an incredible display of technical filmmaking skill, anchored by Oscar-worthy performances from Gosling and Ortiz, who is both the puppeteer for the alien Rocky and the voice.</p><p><em>Stream </em><a href="https://www.amazon.com/" target="_blank" rel="nofollow"><em>"Project Hail Mary" on Prime Video</em></a><em> now</em></p><h2 id="gladiator-2000">'Gladiator' (2000)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/P5ieIbInFpg" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Epic historical fiction movie</p><p><strong>What's it about? </strong>"Gladiator" tells the tale of Maximus Decimus Meridius (Russell Crowe). Commander of the Armies of the North, General of the Felix Legions. Loyal servant to the true emperor, Marcus Aurelius (Richard Harris). Father to a murdered son (Giorgio Cantarini), husband to a murdered wife (Ginnina Facio). He will have his vengeance, in this life or the next.</p><p><strong>Why you need to watch it: </strong>This movie is always worth a rewatch. If you've never seen it before, go watch it now. If you don't like it, I'll give you your money back (but not really).</p><p><em>Stream </em><a href="https://www.amazon.com/" target="_blank" rel="nofollow"><em>"Gladiator" on Prime Video</em></a><em> now</em></p><h2 id="tropic-thunder-2008">'Tropic Thunder' (2008)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/9Pl4JNnqNaE" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Action comedy movie</p><p><strong>What's it about? </strong>"Tropic Thunder" stars Ben Stiller as action star Tugg Speedman, who, along with Jeff Portnoy (Jack Black), Kirk Lazarus (Robert Downey Jr.) and many other (fictional) stars, heads to Vietnam to film a war movie. But when the film's director (Steve Coogan) explodes, stepping on a land mine, and Tugg gets captured by rebels, everything becomes chaos.</p><p><strong>Why you need to watch it: </strong>This movie is, simply put, hysterical. The cast is excellent, especially Downey Jr., whose Kirk Lazarus is in Blackface as Lincoln Osiris for nearly the entire movie. Even though it's a satirical performance, it almost certainly would stop this movie from getting made today, despite earning the Marvel star an Oscar nomination.</p><p><em>Stream </em><a href="https://www.amazon.com/" target="_blank" rel="nofollow"><em>"Tropic Thunder" on Prime Video</em></a><em> now</em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/missed-it-in-theaters-heres-every-movie-finally-arriving-on-streaming-in-july-2026">Missed it in theaters? Here's every movie finally arriving on streaming in July 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-just-added-tk-new-shows-and-movies-heres-5-id-stream-right-now-july-1-2026">Netflix just added 37 new shows and movies — here's 5 I'd stream right now</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/minions-and-monsters-is-no-toy-story-5-but-youll-still-have-a-blast">'Minions and Monsters' is no 'Toy Story 5,' but you'll still have a blast</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon could follow in Apple's footsteps by building its own processors — here's what that means for future Kindles and Fire TVs ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With AI causing skyrocketing production and data costs across the industry, Amazon could be taking the Apple route of bringing processor design in-house in an attempt to save money.</p><p>The leak comes from supply chain analyst <a href="https://x.com/mingchikuo/status/2072530907941175631" target="_blank">Ming-Chi Kuo</a> who claims that Amazon is "moving away from externally sourced processors and adopting a COT (customer-owned model)." According to Kuo, this decision was made because of the rapid expansion of AI compute and Amazon is responding by streamlining and changing things in its "non-AI businesses."</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:4399px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="j2wxLq5wc5pHWe758SdqCF" name="kindle colorsoft 2026 5" alt="the kindle colorsoft 2026 photographed in direct sunlight" src="https://cdn.mos.cms.futurecdn.net/j2wxLq5wc5pHWe758SdqCF.jpg" mos="" align="middle" fullscreen="" width="4399" height="2475" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>Part of that is a gradual shift away from external sourcing and taking control of processor development. Kuo says that Amazon is tapping AIchip for back-end design and testing with this strategy starting in earnest in 2027.</p><p>AIchip is 23 year old companny based out of Taipei, Taiwan that designs silicon for other companies, specifically application-specific integrated cricuit (ASIC) chips. In general, these chips are designed, as the name implies for very specific functions. In recent years AIchip has developed 3nm chips used in AI servers for customers that include Amazon and Intel, per<a href="https://www.taipeitimes.com/News/biz/archives/2025/11/07/2003846767" target="_blank"> Taipei Times</a>.</p><p>Kuo claims that silicon designed by AIchip could appear in Amazon's devices, including the Kindle, Fire TV, Echo, Blink, Ring and Alexa-enabled products. </p><h2 id="why-it-matters">Why it matters</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3442px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XZh9AXumiewa2tpxR6bpwe" name="Apple-Silicon-M5-feature-v2-5" alt="Graphic of a wafer of Apple M2 chips seen from above" src="https://cdn.mos.cms.futurecdn.net/XZh9AXumiewa2tpxR6bpwe.jpg" mos="" align="middle" fullscreen="" width="3442" height="1936" attribution="" endorsement="" class="inline"></p></div></div></figure><p>If Kuo's claims turn out to be true, this could take Amazon down a more Apple path. Until 2020, Apple used Intel silicon in its Macs before <a href="https://www.tomsguide.com/computing/cpus/apples-m-series-chip-gamble-5-years-later-how-ditching-intel-revolutionized-computing-and-whats-next">introducing the M1 CPU</a> in November of that year.</p><p>Meanwhile, the company had been using its own in-house A-series chips in the iPhone and iPad since 2010 with the introduction of the A4 chip. That silicon debuted on the iPhone 4 and the original iPad. </p><p>Designing the chip in-house, even if itis built by partners like Samsung TSMC, gives Apple more control over integration and optimization leading to improved performance.</p><h2 id="what-amazon-is-already-doing">What Amazon is already doing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ozuX3sU7ddiZaEUUmFw2pC" name="Echo Dot Max and Studio.jpg" alt="Echo Dot Max and Studio" src="https://cdn.mos.cms.futurecdn.net/ozuX3sU7ddiZaEUUmFw2pC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p>Notably, Amazon may have already started this transition with the new <a href="https://www.tomsguide.com/audio/smart-speakers/amazon-unveils-new-echo-dot-max-and-studio-speakers-with-atmos-and-alexa-support">Echo speakers launched in October 2025</a>. Those speakers feature two custom-designed chips; the AZ3 or the AZ3 Pro, which are specifically meant for ambient AI tasks. </p><p>Per an <a href="https://www.aboutamazon.com/news/devices/amazon-new-echo-devices-alexa-plus" target="_blank">Amazon blog post</a>, the Echo Dot Max uses the AZ3 for detecting conversations, which is how the Echo enables users from anywhere in the room to talk to Alexa Plus AI. The Echo Studio, Echo Show 8 and Echo Show 11 all have the AZ3 Pro, which adds support for more language models and "vision transformers." </p><p>Tom's Guide reached out to Amazon to confirm Kuo's report and was told no comment.</p><h2 id="panos-panay-confirms-custom-chips">Panos Panay confirms custom chips</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:50.95%;"><img id="Kfyy5WnhmpwunL5q6MTncf" name="panos-surface.jpeg" alt="Panos Panay at surface event" src="https://cdn.mos.cms.futurecdn.net/Kfyy5WnhmpwunL5q6MTncf.jpeg" mos="" align="middle" fullscreen="" width="2000" height="1019" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>However, today, Amazon's hardware head Panos Panay indicated to <a href="https://www.cnbc.com/2026/07/02/amazon-ai-chips-devices.html" target="_blank">CNBC </a>on its "The Tech Download" podcasts that the company is designing its own AI chips. </p><p>“On some of the more critical devices right now, our focus is end-to-end silicon, because to your point," Panay said and pointed out the Echo devices released last year and the Fire TV. "We definitely need to think about how that end-to-end delivery of hardware comes together," he added. </p><p>Per CNBC, the focus seems to be on custom AI chips but also Panay said that the company is developing a "whole roadmap of on-the-go devices." He claimed that "you won't have to wait long" to see these new devices.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/amazon-put-identity-theft-victims-through-a-kafkaesque-ordeal-ftc-issues-usd2-5-million-fine-over-denying-requests">'Amazon put identity theft victims through a Kafkaesque ordeal': FTC issues $2.5 million fine over denying requests</a></li><li><a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">The best Kindles: Our top picks tested and rated</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming-devices/amazon-kills-fire-stick-sideloading-apparently-malware-and-piracy-are-to-blame">Amazon kills Fire Stick sideloading — apparently, malware and piracy are to blame</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/amazon-could-follow-in-apples-footsteps-by-building-its-own-processors-heres-what-that-means-for-future-kindles-and-fire-tvs</link>
                                                                            <description>
                            <![CDATA[ A supply analyst is claiming that Amazon is looking to bring processor design in-house to save money. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MKAQHFmpGxp8gqrSxiVw9o</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9C2G7Q42d87CR9vwz8eabU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 19:46:59 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></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/9C2G7Q42d87CR9vwz8eabU-1280-80.jpg">
                                                            <media:credit><![CDATA[Bluestok / Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon sign outside a building]]></media:description>                                                            <media:text><![CDATA[Amazon sign outside a building]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon sign outside a building]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9C2G7Q42d87CR9vwz8eabU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With AI causing skyrocketing production and data costs across the industry, Amazon could be taking the Apple route of bringing processor design in-house in an attempt to save money.</p><p>The leak comes from supply chain analyst <a href="https://x.com/mingchikuo/status/2072530907941175631" target="_blank">Ming-Chi Kuo</a> who claims that Amazon is "moving away from externally sourced processors and adopting a COT (customer-owned model)." According to Kuo, this decision was made because of the rapid expansion of AI compute and Amazon is responding by streamlining and changing things in its "non-AI businesses."</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:4399px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="j2wxLq5wc5pHWe758SdqCF" name="kindle colorsoft 2026 5" alt="the kindle colorsoft 2026 photographed in direct sunlight" src="https://cdn.mos.cms.futurecdn.net/j2wxLq5wc5pHWe758SdqCF.jpg" mos="" align="middle" fullscreen="" width="4399" height="2475" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>Part of that is a gradual shift away from external sourcing and taking control of processor development. Kuo says that Amazon is tapping AIchip for back-end design and testing with this strategy starting in earnest in 2027.</p><p>AIchip is 23 year old companny based out of Taipei, Taiwan that designs silicon for other companies, specifically application-specific integrated cricuit (ASIC) chips. In general, these chips are designed, as the name implies for very specific functions. In recent years AIchip has developed 3nm chips used in AI servers for customers that include Amazon and Intel, per<a href="https://www.taipeitimes.com/News/biz/archives/2025/11/07/2003846767" target="_blank"> Taipei Times</a>.</p><p>Kuo claims that silicon designed by AIchip could appear in Amazon's devices, including the Kindle, Fire TV, Echo, Blink, Ring and Alexa-enabled products. </p><h2 id="why-it-matters">Why it matters</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3442px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XZh9AXumiewa2tpxR6bpwe" name="Apple-Silicon-M5-feature-v2-5" alt="Graphic of a wafer of Apple M2 chips seen from above" src="https://cdn.mos.cms.futurecdn.net/XZh9AXumiewa2tpxR6bpwe.jpg" mos="" align="middle" fullscreen="" width="3442" height="1936" attribution="" endorsement="" class="inline"></p></div></div></figure><p>If Kuo's claims turn out to be true, this could take Amazon down a more Apple path. Until 2020, Apple used Intel silicon in its Macs before <a href="https://www.tomsguide.com/computing/cpus/apples-m-series-chip-gamble-5-years-later-how-ditching-intel-revolutionized-computing-and-whats-next">introducing the M1 CPU</a> in November of that year.</p><p>Meanwhile, the company had been using its own in-house A-series chips in the iPhone and iPad since 2010 with the introduction of the A4 chip. That silicon debuted on the iPhone 4 and the original iPad. </p><p>Designing the chip in-house, even if itis built by partners like Samsung TSMC, gives Apple more control over integration and optimization leading to improved performance.</p><h2 id="what-amazon-is-already-doing">What Amazon is already doing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ozuX3sU7ddiZaEUUmFw2pC" name="Echo Dot Max and Studio.jpg" alt="Echo Dot Max and Studio" src="https://cdn.mos.cms.futurecdn.net/ozuX3sU7ddiZaEUUmFw2pC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p>Notably, Amazon may have already started this transition with the new <a href="https://www.tomsguide.com/audio/smart-speakers/amazon-unveils-new-echo-dot-max-and-studio-speakers-with-atmos-and-alexa-support">Echo speakers launched in October 2025</a>. Those speakers feature two custom-designed chips; the AZ3 or the AZ3 Pro, which are specifically meant for ambient AI tasks. </p><p>Per an <a href="https://www.aboutamazon.com/news/devices/amazon-new-echo-devices-alexa-plus" target="_blank">Amazon blog post</a>, the Echo Dot Max uses the AZ3 for detecting conversations, which is how the Echo enables users from anywhere in the room to talk to Alexa Plus AI. The Echo Studio, Echo Show 8 and Echo Show 11 all have the AZ3 Pro, which adds support for more language models and "vision transformers." </p><p>Tom's Guide reached out to Amazon to confirm Kuo's report and was told no comment.</p><h2 id="panos-panay-confirms-custom-chips">Panos Panay confirms custom chips</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:50.95%;"><img id="Kfyy5WnhmpwunL5q6MTncf" name="panos-surface.jpeg" alt="Panos Panay at surface event" src="https://cdn.mos.cms.futurecdn.net/Kfyy5WnhmpwunL5q6MTncf.jpeg" mos="" align="middle" fullscreen="" width="2000" height="1019" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>However, today, Amazon's hardware head Panos Panay indicated to <a href="https://www.cnbc.com/2026/07/02/amazon-ai-chips-devices.html" target="_blank">CNBC </a>on its "The Tech Download" podcasts that the company is designing its own AI chips. </p><p>“On some of the more critical devices right now, our focus is end-to-end silicon, because to your point," Panay said and pointed out the Echo devices released last year and the Fire TV. "We definitely need to think about how that end-to-end delivery of hardware comes together," he added. </p><p>Per CNBC, the focus seems to be on custom AI chips but also Panay said that the company is developing a "whole roadmap of on-the-go devices." He claimed that "you won't have to wait long" to see these new devices.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/online-security/amazon-put-identity-theft-victims-through-a-kafkaesque-ordeal-ftc-issues-usd2-5-million-fine-over-denying-requests">'Amazon put identity theft victims through a Kafkaesque ordeal': FTC issues $2.5 million fine over denying requests</a></li><li><a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">The best Kindles: Our top picks tested and rated</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming-devices/amazon-kills-fire-stick-sideloading-apparently-malware-and-piracy-are-to-blame">Amazon kills Fire Stick sideloading — apparently, malware and piracy are to blame</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Amazon put identity theft victims through a Kafkaesque ordeal': FTC issues $2.5 million fine over denying requests ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Federal Trade Commission is fining Amazon $2.25 million over allegations that the <strong>retail giant regularly denied records requests from identity theft victims</strong>. The U.S. agency accused Amazon of violating the Fair Credit Reporting Act. </p><p>Per an <a href="https://www.ftc.gov/news-events/news/press-releases/2026/06/ftc-requires-amazon-pay-225-million-resolve-charges-it-knowingly-violated-fair-credit-reporting-act">FTC press release</a>, a complaint was filed by the Department of Justice as a referral from the FTC. It alleged that Amazon failed to comply with <a href="https://www.ftc.gov/business-guidance/resources/businesses-must-provide-victims-law-enforcement-transaction-records-relating-identity-theft" target="_blank">Section 609(e) of the FCRA</a>, which requires companies to provide victims of identity theft with records about transactions made in their name within 30 days of a consumer's request. </p><h2 id="ftc-accusations-against-amazon">FTC accusations against Amazon</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1050px;"><p class="vanilla-image-block" style="padding-top:65.81%;"><img id="8TpRNq27mEgGpZN8JRsuUD" name="ftc-hq-loc.jpg" alt="Federal Trade Commission building" src="https://cdn.mos.cms.futurecdn.net/8TpRNq27mEgGpZN8JRsuUD.jpg" mos="" align="middle" fullscreen="" width="1050" height="691" attribution="" endorsement="" class="inline"></p></div></div></figure><p>Amazon apparently did not have a written policy for responding to 609(e) requests until last year.</p><div><blockquote><p>Amazon often put identity theft victims through a Kafkaesque ordeal by demanding they identify the thief who stole their information before Amazon would release the records.</p><p>Christopher Mufarrige, FTC</p></blockquote></div><p>“Amazon often put identity theft victims through a Kafkaesque ordeal by demanding they identify the thief who stole their information before Amazon would release the records the law entitles them to—records that could help victims protect themselves and recover from the fraudulent conduct,” said Christopher Mufarrige, Director of the FTC’s Bureau of Consumer Protection said in the release.</p><p><strong>The complaint claims that customers who reached out to Amazon were often told that the requested records could not be provided for "security" or "privacy" reasons. </strong>In one provided example, a consumer tried to get business records related to unauthorized charges from a fraudulent account. However, Amazon reportedly refused for security reasons unless the consumer "guessed the name on the [fraudulent] account," which they were unable to do.</p><h2 id="penalties-and-resolution">Penalties and resolution</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="n7naznf6XXby7f2TzxcSt3" name="Amazon Tips.jpg" alt="Amazon app logo" src="https://cdn.mos.cms.futurecdn.net/n7naznf6XXby7f2TzxcSt3.jpg" mos="" align="middle" fullscreen="" width="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>Alongside the $2.25 million civial penalty, <strong>the </strong><a href="https://www.ftc.gov/system/files/ftc_gov/pdf/Amazon-ConsentMotionforOrder.pdf" target="_blank"><strong>DOJ's proposed order</strong></a><strong> requires Amazon to provide records lawfully requested by identity theft victim</strong>s and law enforcement agencies. It also requires the company to provide notice to customers about how they can request FCRA records.</p><p>Additionally, Amazon is required to contact any customers who requested records since April 2024. </p><p><strong>An Amazon spokesperson told Tom's Guide that it has implemented process improvements and resolved the matter with the FTC.</strong></p><p>“We are committed to providing customers with their detailed account information when they need it most. We've resolved this matter with the FTC and have implemented process improvements for customers who believe they may be victims of identity theft. Customers who need assistance requesting their records can visit our <a href="https://www.amazon.com/gp/help/customer/display.html?nodeId=TJxMd8vqN3YHz8DNEo" target="_blank">Help Page</a> to learn more."</p><h2 id="how-to-contact-amazon-for-identity-theft-records">How to contact Amazon for Identity Theft records</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XQaBKuYTokum8CcLXPetj3" name="Amazon sale.jpg" alt="Amazon Summer Sale" src="https://cdn.mos.cms.futurecdn.net/XQaBKuYTokum8CcLXPetj3.jpg" mos="" align="middle" fullscreen="" width="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>Amazon has a portal for Identity theft called "<a href="https://account-status.amazon.com/uaa-account-unauthorized-activity-report" target="_blank">Report Suspicious Activity</a>." There you can report unrecognized orders, chargers to your payment methods that aren't from your Amazon account and other unauthorized activity.</p><p><strong>You can request records relating to fraudulent transactions via the </strong><a href="https://www.amazon.com/hz/privacy-central/data-requests/preview.html" target="_blank"><strong>Request Your Data</strong></a><strong> portal. </strong>If that's not enough you can also send an email or physical mail: </p><p><strong>By Email: </strong>fcra-requests@amazon.com</p><p><strong>By Mail: </strong>Amazon Legal Department <br>Attn: FCRA Records Requests <br>P.O. Box 80161Seattle, WA 98108-9990</p><p>You will need to provide a copy of a government ID, a copy of a police report concerning identity theft, or a government-issued Identity Theft Report, found at <a href="https://www.identitytheft.gov/" target="_blank">IdentityTheft.gov</a>. You'll also need relevant details about the fraudulent transaction and contact information so Amazon can reach out.</p><p>Amazon says that it will fulfill your requests within 30 days unless more information is needed.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming-devices/amazon-kills-fire-stick-sideloading-apparently-malware-and-piracy-are-to-blame">Amazon kills Fire Stick sideloading — apparently, malware and piracy are to blame</a></li><li><a href="https://www.tomsguide.com/sales-events/amazon-has-a-hidden-button-that-connects-you-with-a-real-customer-service-agent-heres-where-to-find-it">Amazon has a hidden button that connects you with a real customer service agent — here's where to find it</a></li><li><a href="https://www.tomsguide.com/ai/i-never-shop-on-amazon-without-chatgpt-heres-how-i-use-it-to-find-the-best-products">Still shopping blind on Amazon? This ChatGPT trick helps me avoid bad buys — and it works every time</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/online-security/amazon-put-identity-theft-victims-through-a-kafkaesque-ordeal-ftc-issues-usd2-5-million-fine-over-denying-requests</link>
                                                                            <description>
                            <![CDATA[ The Federal Trade Commission accused Amazon of making it difficult for identity theft victims to actually get records of fraudulent transactions. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">EADeR4L7JTYdAtzNK7K7rQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wmVm3TePyjJDn24ewHmcBh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 01 Jul 2026 20:48:38 +0000</pubDate>                                                                                                                                <updated>Wed, 01 Jul 2026 20:58:49 +0000</updated>
                                                                                                                                            <category><![CDATA[Online Security]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Internet]]></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/wmVm3TePyjJDn24ewHmcBh-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon logo on a building]]></media:description>                                                            <media:text><![CDATA[Amazon logo on a building]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon logo on a building]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wmVm3TePyjJDn24ewHmcBh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Federal Trade Commission is fining Amazon $2.25 million over allegations that the <strong>retail giant regularly denied records requests from identity theft victims</strong>. The U.S. agency accused Amazon of violating the Fair Credit Reporting Act. </p><p>Per an <a href="https://www.ftc.gov/news-events/news/press-releases/2026/06/ftc-requires-amazon-pay-225-million-resolve-charges-it-knowingly-violated-fair-credit-reporting-act">FTC press release</a>, a complaint was filed by the Department of Justice as a referral from the FTC. It alleged that Amazon failed to comply with <a href="https://www.ftc.gov/business-guidance/resources/businesses-must-provide-victims-law-enforcement-transaction-records-relating-identity-theft" target="_blank">Section 609(e) of the FCRA</a>, which requires companies to provide victims of identity theft with records about transactions made in their name within 30 days of a consumer's request. </p><h2 id="ftc-accusations-against-amazon">FTC accusations against Amazon</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1050px;"><p class="vanilla-image-block" style="padding-top:65.81%;"><img id="8TpRNq27mEgGpZN8JRsuUD" name="ftc-hq-loc.jpg" alt="Federal Trade Commission building" src="https://cdn.mos.cms.futurecdn.net/8TpRNq27mEgGpZN8JRsuUD.jpg" mos="" align="middle" fullscreen="" width="1050" height="691" attribution="" endorsement="" class="inline"></p></div></div></figure><p>Amazon apparently did not have a written policy for responding to 609(e) requests until last year.</p><div><blockquote><p>Amazon often put identity theft victims through a Kafkaesque ordeal by demanding they identify the thief who stole their information before Amazon would release the records.</p><p>Christopher Mufarrige, FTC</p></blockquote></div><p>“Amazon often put identity theft victims through a Kafkaesque ordeal by demanding they identify the thief who stole their information before Amazon would release the records the law entitles them to—records that could help victims protect themselves and recover from the fraudulent conduct,” said Christopher Mufarrige, Director of the FTC’s Bureau of Consumer Protection said in the release.</p><p><strong>The complaint claims that customers who reached out to Amazon were often told that the requested records could not be provided for "security" or "privacy" reasons. </strong>In one provided example, a consumer tried to get business records related to unauthorized charges from a fraudulent account. However, Amazon reportedly refused for security reasons unless the consumer "guessed the name on the [fraudulent] account," which they were unable to do.</p><h2 id="penalties-and-resolution">Penalties and resolution</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="n7naznf6XXby7f2TzxcSt3" name="Amazon Tips.jpg" alt="Amazon app logo" src="https://cdn.mos.cms.futurecdn.net/n7naznf6XXby7f2TzxcSt3.jpg" mos="" align="middle" fullscreen="" width="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>Alongside the $2.25 million civial penalty, <strong>the </strong><a href="https://www.ftc.gov/system/files/ftc_gov/pdf/Amazon-ConsentMotionforOrder.pdf" target="_blank"><strong>DOJ's proposed order</strong></a><strong> requires Amazon to provide records lawfully requested by identity theft victim</strong>s and law enforcement agencies. It also requires the company to provide notice to customers about how they can request FCRA records.</p><p>Additionally, Amazon is required to contact any customers who requested records since April 2024. </p><p><strong>An Amazon spokesperson told Tom's Guide that it has implemented process improvements and resolved the matter with the FTC.</strong></p><p>“We are committed to providing customers with their detailed account information when they need it most. We've resolved this matter with the FTC and have implemented process improvements for customers who believe they may be victims of identity theft. Customers who need assistance requesting their records can visit our <a href="https://www.amazon.com/gp/help/customer/display.html?nodeId=TJxMd8vqN3YHz8DNEo" target="_blank">Help Page</a> to learn more."</p><h2 id="how-to-contact-amazon-for-identity-theft-records">How to contact Amazon for Identity Theft records</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XQaBKuYTokum8CcLXPetj3" name="Amazon sale.jpg" alt="Amazon Summer Sale" src="https://cdn.mos.cms.futurecdn.net/XQaBKuYTokum8CcLXPetj3.jpg" mos="" align="middle" fullscreen="" width="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>Amazon has a portal for Identity theft called "<a href="https://account-status.amazon.com/uaa-account-unauthorized-activity-report" target="_blank">Report Suspicious Activity</a>." There you can report unrecognized orders, chargers to your payment methods that aren't from your Amazon account and other unauthorized activity.</p><p><strong>You can request records relating to fraudulent transactions via the </strong><a href="https://www.amazon.com/hz/privacy-central/data-requests/preview.html" target="_blank"><strong>Request Your Data</strong></a><strong> portal. </strong>If that's not enough you can also send an email or physical mail: </p><p><strong>By Email: </strong>fcra-requests@amazon.com</p><p><strong>By Mail: </strong>Amazon Legal Department <br>Attn: FCRA Records Requests <br>P.O. Box 80161Seattle, WA 98108-9990</p><p>You will need to provide a copy of a government ID, a copy of a police report concerning identity theft, or a government-issued Identity Theft Report, found at <a href="https://www.identitytheft.gov/" target="_blank">IdentityTheft.gov</a>. You'll also need relevant details about the fraudulent transaction and contact information so Amazon can reach out.</p><p>Amazon says that it will fulfill your requests within 30 days unless more information is needed.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming-devices/amazon-kills-fire-stick-sideloading-apparently-malware-and-piracy-are-to-blame">Amazon kills Fire Stick sideloading — apparently, malware and piracy are to blame</a></li><li><a href="https://www.tomsguide.com/sales-events/amazon-has-a-hidden-button-that-connects-you-with-a-real-customer-service-agent-heres-where-to-find-it">Amazon has a hidden button that connects you with a real customer service agent — here's where to find it</a></li><li><a href="https://www.tomsguide.com/ai/i-never-shop-on-amazon-without-chatgpt-heres-how-i-use-it-to-find-the-best-products">Still shopping blind on Amazon? This ChatGPT trick helps me avoid bad buys — and it works every time</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon kills Fire Stick sideloading — apparently, malware and piracy are to blame ]]></title>
                                                                                                <dc:content><![CDATA[ <p>In the back half of 2025, Amazon introduced its new proprietary, Linux-based operating system, <a href="https://www.tomsguide.com/entertainment/streaming-devices/amazons-new-usd40-fire-stick-is-the-illegal-streamers-nightmare-heres-why">Vega OS </a>which replaces the Fire OS. The old platform was an Android fork based on the Android Open Source Project. </p><p>Controversially, the new OS is more locked down lacking sideloading support. In a sprawling interview with the UK-based <a href="https://www.cordbusters.co.uk/amazon-fire-tv-boss-vega-sideloading-freely/" target="_blank">Cord Busters</a>, Amazon's vice president of Fire TV, Aidan Marcuss, finally explains why the switch was made.</p><h2 id="an-opportunity-to-innovate">An opportunity to 'innovate'</h2><p>Marcuss told Cord Busters that Vega OS is an opportunity for Amazon to "innovate and deliver more capabilities, even on the least expensive devices.” He also said that it would make things more secure and private for users, which was "sort of utmost in my mind." </p><p>That's a somewhat ironic statement since Vega OS blocks the ability to sideload third-party adblockers, in addition to launchers.</p><p>“Apps that facilitate piracy, and other apps, can carry malware,” Marcuss said when asked if sideloading actually causes harm. Marcuss also said that there is “a good amount of evidence that apps can carry unwanted code and behavior on them when they’re sideloaded.”</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMVmNW"></div>                            </div>                            <script src="https://kwizly.com/embed/eMVmNW.js" async></script><h2 id="piracy-and-malware-are-legit">Piracy and malware are legit</h2><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="U8acSqAjfR4FTCZqNtQpQi" name="Piracy" alt="White keyboard key with a black skull and swords pirate symbol" src="https://cdn.mos.cms.futurecdn.net/U8acSqAjfR4FTCZqNtQpQi.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: Sitade / Getty Images)</span></figcaption></figure><p>For the unfamiliar, sideloading is the ability for Fire Sticks owners to add modified Android apps to the streaming device. When Vega OS was introduced in October 2025, we noted that it would be <a href="https://www.tomsguide.com/entertainment/streaming-devices/amazons-new-usd40-fire-stick-is-the-illegal-streamers-nightmare-heres-why">the illegal streamer's nightmare</a>.</p><p>Notably, soccer streamers like <a href="https://www.nytimes.com/athletic/6161947/2025/02/26/sports-streaming-piracy-premier-league/" target="_blank">DAZN and Sky Sports</a>, which stream top-league soccer matches, have accused Fire Sticks of enabling piracy. In May 2025, Enders Analysis, a media research firm, <a href="https://www.endersanalysis.com/reports/video-piracy-big-tech-clearly-unwilling-address-problem" target="_blank">released a report</a> that specifically blamed the Fire Stick for easily enabling streaming piracy.</p><p>Additionally, malware and fraud have been a problem. In November, <a href="https://www.malwarebytes.com/blog/news/2025/11/illegal-streaming-is-costing-people-real-money-research-finds" target="_blank">Malwarebytes reported</a> that 1 in 3 people who illegally stream in the UK have been victims of fraud or scams. The Fire TV focused <a href="https://www.aftvnews.com/additional-streaming-piracy-apps-blocked-by-amazon-on-fire-tv-devices/">AFTVNews</a>  found a number of blacklisted apps that could "put your personal data risk." The <a href="https://www.amazonforum.com/s/question/0D56Q00008WBcJ8SAL/cryptocurrency-malware-virus-on-fire-tv-stick-4k" target="_blank">Amazon support forums </a>are littered with posts about strange cryptocurrency malware or other strange malware.</p><p>That said, the blacklist also features apps that let users get around the Fire homescreen, which is increasingly an ad fest. </p><h2 id="vega-os-isn-t-quite-ready">Vega OS isn't quite ready</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TaRoJjZujqHfqqVSYaYKX5" name="Amazon Fire TV 4K Select-12" alt="Wall mounted TV streaming with Amazon Fire TV Stick 4K Select" src="https://cdn.mos.cms.futurecdn.net/TaRoJjZujqHfqqVSYaYKX5.jpg" mos="" align="middle" fullscreen="" width="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>Vega OS isn't as robust as Fire OS lacking support for things like Dolby Vision or USB storage. As we found in our review of the <a href="https://www.tomsguide.com/tvs/amazon-fire-tv-stick-4k-select-streaming-stick-review#section-fire-tv-select-review-performance-and-interface">Fire TV 4K Streaming Stick Select</a> it isn't quite ready for primetime. </p><p>"it feels more like a proof-of-concept at this point rather than a full release when it comes to app integration and other assorted features," we said at the time.</p><p>Cord Busters asked Marcuss about the difference between the 3,000 supported apps on Vega OS Fire sticks versus 40,000 on Fire OS ones.</p><p>“No customer is actually downloading 50,000 apps. The question is whether the apps they want to watch, the content that they’re looking for are there,” Marcuss said. He added that customers can stream “the vast, vast, vast majority of content” on Vega-OS Fire Sticks. </p><p>For most people, the difference between Vega and Fire OS won't matter, but as with <a href="https://www.tomsguide.com/gaming/playstation/playstation-is-officially-killing-physical-discs-heres-when-they-disappear-and-what-that-means-for-you">many decisions to close down platforms</a> recently, it's more about taking away the choice, not whether or not people are using it.</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/sales-events/amazon-has-a-hidden-button-that-connects-you-with-a-real-customer-service-agent-heres-where-to-find-it">Amazon has a hidden button that connects you with a real customer service agent — here's where to find it</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-dark-romance-with-timothee-chalamet-playing-a-cannibal-june-30-july-6">3 new to Prime Video thriller movies to stream this week — including a dark romance with Timothée Chalamet playing a cannibal (June 30-July 6)</a></li><li><a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">The best Kindles in 2026: Our top picks tested and rated</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/streaming-devices/amazon-kills-fire-stick-sideloading-apparently-malware-and-piracy-are-to-blame</link>
                                                                            <description>
                            <![CDATA[ Amazon explains why it made the switch from Fire OS to Vega OS on its streaming devices. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">L6pu3WVZT2wCoe8kieHuPn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Q5RUVzBq77zy5pyVx8JMHa-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 01 Jul 2026 18:06:50 +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/Q5RUVzBq77zy5pyVx8JMHa-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon Fire Stick TV]]></media:description>                                                            <media:text><![CDATA[Amazon Fire Stick TV]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon Fire Stick TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Q5RUVzBq77zy5pyVx8JMHa-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In the back half of 2025, Amazon introduced its new proprietary, Linux-based operating system, <a href="https://www.tomsguide.com/entertainment/streaming-devices/amazons-new-usd40-fire-stick-is-the-illegal-streamers-nightmare-heres-why">Vega OS </a>which replaces the Fire OS. The old platform was an Android fork based on the Android Open Source Project. </p><p>Controversially, the new OS is more locked down lacking sideloading support. In a sprawling interview with the UK-based <a href="https://www.cordbusters.co.uk/amazon-fire-tv-boss-vega-sideloading-freely/" target="_blank">Cord Busters</a>, Amazon's vice president of Fire TV, Aidan Marcuss, finally explains why the switch was made.</p><h2 id="an-opportunity-to-innovate">An opportunity to 'innovate'</h2><p>Marcuss told Cord Busters that Vega OS is an opportunity for Amazon to "innovate and deliver more capabilities, even on the least expensive devices.” He also said that it would make things more secure and private for users, which was "sort of utmost in my mind." </p><p>That's a somewhat ironic statement since Vega OS blocks the ability to sideload third-party adblockers, in addition to launchers.</p><p>“Apps that facilitate piracy, and other apps, can carry malware,” Marcuss said when asked if sideloading actually causes harm. Marcuss also said that there is “a good amount of evidence that apps can carry unwanted code and behavior on them when they’re sideloaded.”</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMVmNW"></div>                            </div>                            <script src="https://kwizly.com/embed/eMVmNW.js" async></script><h2 id="piracy-and-malware-are-legit">Piracy and malware are legit</h2><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="U8acSqAjfR4FTCZqNtQpQi" name="Piracy" alt="White keyboard key with a black skull and swords pirate symbol" src="https://cdn.mos.cms.futurecdn.net/U8acSqAjfR4FTCZqNtQpQi.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: Sitade / Getty Images)</span></figcaption></figure><p>For the unfamiliar, sideloading is the ability for Fire Sticks owners to add modified Android apps to the streaming device. When Vega OS was introduced in October 2025, we noted that it would be <a href="https://www.tomsguide.com/entertainment/streaming-devices/amazons-new-usd40-fire-stick-is-the-illegal-streamers-nightmare-heres-why">the illegal streamer's nightmare</a>.</p><p>Notably, soccer streamers like <a href="https://www.nytimes.com/athletic/6161947/2025/02/26/sports-streaming-piracy-premier-league/" target="_blank">DAZN and Sky Sports</a>, which stream top-league soccer matches, have accused Fire Sticks of enabling piracy. In May 2025, Enders Analysis, a media research firm, <a href="https://www.endersanalysis.com/reports/video-piracy-big-tech-clearly-unwilling-address-problem" target="_blank">released a report</a> that specifically blamed the Fire Stick for easily enabling streaming piracy.</p><p>Additionally, malware and fraud have been a problem. In November, <a href="https://www.malwarebytes.com/blog/news/2025/11/illegal-streaming-is-costing-people-real-money-research-finds" target="_blank">Malwarebytes reported</a> that 1 in 3 people who illegally stream in the UK have been victims of fraud or scams. The Fire TV focused <a href="https://www.aftvnews.com/additional-streaming-piracy-apps-blocked-by-amazon-on-fire-tv-devices/">AFTVNews</a>  found a number of blacklisted apps that could "put your personal data risk." The <a href="https://www.amazonforum.com/s/question/0D56Q00008WBcJ8SAL/cryptocurrency-malware-virus-on-fire-tv-stick-4k" target="_blank">Amazon support forums </a>are littered with posts about strange cryptocurrency malware or other strange malware.</p><p>That said, the blacklist also features apps that let users get around the Fire homescreen, which is increasingly an ad fest. </p><h2 id="vega-os-isn-t-quite-ready">Vega OS isn't quite ready</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TaRoJjZujqHfqqVSYaYKX5" name="Amazon Fire TV 4K Select-12" alt="Wall mounted TV streaming with Amazon Fire TV Stick 4K Select" src="https://cdn.mos.cms.futurecdn.net/TaRoJjZujqHfqqVSYaYKX5.jpg" mos="" align="middle" fullscreen="" width="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>Vega OS isn't as robust as Fire OS lacking support for things like Dolby Vision or USB storage. As we found in our review of the <a href="https://www.tomsguide.com/tvs/amazon-fire-tv-stick-4k-select-streaming-stick-review#section-fire-tv-select-review-performance-and-interface">Fire TV 4K Streaming Stick Select</a> it isn't quite ready for primetime. </p><p>"it feels more like a proof-of-concept at this point rather than a full release when it comes to app integration and other assorted features," we said at the time.</p><p>Cord Busters asked Marcuss about the difference between the 3,000 supported apps on Vega OS Fire sticks versus 40,000 on Fire OS ones.</p><p>“No customer is actually downloading 50,000 apps. The question is whether the apps they want to watch, the content that they’re looking for are there,” Marcuss said. He added that customers can stream “the vast, vast, vast majority of content” on Vega-OS Fire Sticks. </p><p>For most people, the difference between Vega and Fire OS won't matter, but as with <a href="https://www.tomsguide.com/gaming/playstation/playstation-is-officially-killing-physical-discs-heres-when-they-disappear-and-what-that-means-for-you">many decisions to close down platforms</a> recently, it's more about taking away the choice, not whether or not people are using it.</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/sales-events/amazon-has-a-hidden-button-that-connects-you-with-a-real-customer-service-agent-heres-where-to-find-it">Amazon has a hidden button that connects you with a real customer service agent — here's where to find it</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-dark-romance-with-timothee-chalamet-playing-a-cannibal-june-30-july-6">3 new to Prime Video thriller movies to stream this week — including a dark romance with Timothée Chalamet playing a cannibal (June 30-July 6)</a></li><li><a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">The best Kindles in 2026: Our top picks tested and rated</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 new to Prime Video thriller movies to stream this week — including a dark romance with Timothée Chalamet playing a cannibal (June 30-July 6) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Fans of thriller movies are spoilt for choice on Prime Video this week. The streaming service typically adds dozens of movies to its library on the first of each new month, and with July arriving this week, get ready to top up your watchlist with some very compelling thrillers. </p><p>With so many new arrivals on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>, it can be rather overwhelming picking out the gems. That’s why I’ve combed through the recent additions for you and picked out three must-watch thriller movies. These include a chilling survival drama based on a true story, a warped romance starring Timothée Chalamet and a hilarious crime-fueled thriller from the director of “The Hangover” and “Joker” (also, “Joker 2,” but let's ignore that one).</p><p>These are three new to Prime Video thriller movies worth adding to your watchlist over the coming days.</p><h2 id="alive-1993">'Alive' (1993)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/3P5N0kd6pYY" allowfullscreen></iframe></div></div><p>“Alive” is one of the multiple movies about the real-life experience of a Uruguayan sports team that crashed in the Andes Mountains and had to survive for more than two months in the hostile region. While I’d argue 2023’s “Society of the Snow” is the <em>best</em> feature film dramatisation of this story that captivated the world, “Alive” is no slouch and, in this survival thriller starring Ethan Hawke and Josh Hamilton, successfully chronicles the hardships endured by these men thrown into a frozen nightmare. </p><p>Flying over the Andes mountain range on October 13, 1972, the members of the Stella Maris College's Old Christians Rugby Team are stranded in the snow-blanketed region after a plane crash. To survive the harsh conditions, they are forced to take extreme measures and even contemplate the unthinkable: eating their deceased teammates. Eventually, a small group sets off on a perilous trek in the hopes of finding rescue. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Alive-Ethan-Hawke/dp/B005FDWAXM" target="_blank" rel="nofollow"><em><strong>"Alive" on Prime Video</strong></em></a><em><strong> starting July 1</strong></em></p><h2 id="bones-and-all-2022">'Bones and All' (2022)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/0Nu7Z9AxGNg" allowfullscreen></iframe></div></div><p>“Bones and All” offers up Timothée Chalamet as you’ve never seen him before, and I don’t just mean because his trademark curls have been dyed red. In this dark thriller that mashes together a host of tones, including romance and horror, Chalamet plays a young man with an uncontrollable appetite for human flesh. It's not only a skin-crawling movie, but also a surprisingly tender one, with a sweet (but doomed) love story at its core.</p><p>The flick opens with the adolescent experience of Maren (Taylor Russell). Abandoned by her father on her 18th birthday as he’s unable to cope with her hunger for human flesh, Maren becomes a drifter and meets Lee (Chalamet). The two become companions and then lovers. But their odyssey across America leads to a confrontation with Sully (Mark Rylance), a warped “eater” obsessed with Maren. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GYJDNG39" target="_blank" rel="nofollow"><em><strong>"Bones and All" on Prime Video</strong></em></a><em><strong> starting July 1</strong></em></p><h2 id="war-dogs-2016">War Dogs (2016)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Rwh9c_E3dJk" allowfullscreen></iframe></div></div><p>One of my more memorable movie-watching experiences was watching a PG-cut of “War Dogs” on a plane. The R-rated flick had been censored to remove all the curse words. This crime thriller comes from “The Hangover” and “Joker” director Todd Phillips, so let’s just say there is <em>a lot</em> of cursing. This actually made the movie absolutely hilarious, but not for the intended reason. Fortunately, Prime Video is adding the uncensored version this week. So you can enjoy it with all the f-bombs very much intact! </p><p>Inspired by a true story, “War Dogs” centers on David Packouz (Miles Teller) and Efraim Diveroli (Jonah Hill), two small-time hustlers who discover that military equipment contracts are posted publicly for anybody to bid on. So, they create their own arms-dealing company and start selling hundreds of millions of dollars worth of ammunition to the American government. Before long, they find themselves in over their heads and in hot water.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B01KGRXSVO/" target="_blank" rel="nofollow"><em><strong>"War Dogs" on Prime Video</strong></em></a><em><strong> starting July 1</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-july-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">New on Prime Video in July 2026</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-cancel-prime-video">How to cancel your Prime Video subscription</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-june-29-july-5">Prime Video top 10 movies — here’s the 3 worth watching</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-dark-romance-with-timothee-chalamet-playing-a-cannibal-june-30-july-6</link>
                                                                            <description>
                            <![CDATA[ Prime Video is dropping dozens of movies this week, and I've picked out a trio of exciting thrillers worth adding to your watchlist now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bBhrFYL7uuqgzR3FK53sSS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JBy4JwfMvxZAJ2z6VKQGeK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Jun 2026 09:58:28 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/JBy4JwfMvxZAJ2z6VKQGeK-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a blue pink film reel background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a blue pink film reel background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a blue pink film reel background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JBy4JwfMvxZAJ2z6VKQGeK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Fans of thriller movies are spoilt for choice on Prime Video this week. The streaming service typically adds dozens of movies to its library on the first of each new month, and with July arriving this week, get ready to top up your watchlist with some very compelling thrillers. </p><p>With so many new arrivals on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>, it can be rather overwhelming picking out the gems. That’s why I’ve combed through the recent additions for you and picked out three must-watch thriller movies. These include a chilling survival drama based on a true story, a warped romance starring Timothée Chalamet and a hilarious crime-fueled thriller from the director of “The Hangover” and “Joker” (also, “Joker 2,” but let's ignore that one).</p><p>These are three new to Prime Video thriller movies worth adding to your watchlist over the coming days.</p><h2 id="alive-1993">'Alive' (1993)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/3P5N0kd6pYY" allowfullscreen></iframe></div></div><p>“Alive” is one of the multiple movies about the real-life experience of a Uruguayan sports team that crashed in the Andes Mountains and had to survive for more than two months in the hostile region. While I’d argue 2023’s “Society of the Snow” is the <em>best</em> feature film dramatisation of this story that captivated the world, “Alive” is no slouch and, in this survival thriller starring Ethan Hawke and Josh Hamilton, successfully chronicles the hardships endured by these men thrown into a frozen nightmare. </p><p>Flying over the Andes mountain range on October 13, 1972, the members of the Stella Maris College's Old Christians Rugby Team are stranded in the snow-blanketed region after a plane crash. To survive the harsh conditions, they are forced to take extreme measures and even contemplate the unthinkable: eating their deceased teammates. Eventually, a small group sets off on a perilous trek in the hopes of finding rescue. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Alive-Ethan-Hawke/dp/B005FDWAXM" target="_blank" rel="nofollow"><em><strong>"Alive" on Prime Video</strong></em></a><em><strong> starting July 1</strong></em></p><h2 id="bones-and-all-2022">'Bones and All' (2022)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/0Nu7Z9AxGNg" allowfullscreen></iframe></div></div><p>“Bones and All” offers up Timothée Chalamet as you’ve never seen him before, and I don’t just mean because his trademark curls have been dyed red. In this dark thriller that mashes together a host of tones, including romance and horror, Chalamet plays a young man with an uncontrollable appetite for human flesh. It's not only a skin-crawling movie, but also a surprisingly tender one, with a sweet (but doomed) love story at its core.</p><p>The flick opens with the adolescent experience of Maren (Taylor Russell). Abandoned by her father on her 18th birthday as he’s unable to cope with her hunger for human flesh, Maren becomes a drifter and meets Lee (Chalamet). The two become companions and then lovers. But their odyssey across America leads to a confrontation with Sully (Mark Rylance), a warped “eater” obsessed with Maren. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GYJDNG39" target="_blank" rel="nofollow"><em><strong>"Bones and All" on Prime Video</strong></em></a><em><strong> starting July 1</strong></em></p><h2 id="war-dogs-2016">War Dogs (2016)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Rwh9c_E3dJk" allowfullscreen></iframe></div></div><p>One of my more memorable movie-watching experiences was watching a PG-cut of “War Dogs” on a plane. The R-rated flick had been censored to remove all the curse words. This crime thriller comes from “The Hangover” and “Joker” director Todd Phillips, so let’s just say there is <em>a lot</em> of cursing. This actually made the movie absolutely hilarious, but not for the intended reason. Fortunately, Prime Video is adding the uncensored version this week. So you can enjoy it with all the f-bombs very much intact! </p><p>Inspired by a true story, “War Dogs” centers on David Packouz (Miles Teller) and Efraim Diveroli (Jonah Hill), two small-time hustlers who discover that military equipment contracts are posted publicly for anybody to bid on. So, they create their own arms-dealing company and start selling hundreds of millions of dollars worth of ammunition to the American government. Before long, they find themselves in over their heads and in hot water.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B01KGRXSVO/" target="_blank" rel="nofollow"><em><strong>"War Dogs" on Prime Video</strong></em></a><em><strong> starting July 1</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-july-2026-top-picks-and-all-the-new-movies-and-shows-to-watch">New on Prime Video in July 2026</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-cancel-prime-video">How to cancel your Prime Video subscription</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-june-29-july-5">Prime Video top 10 movies — here’s the 3 worth watching</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ New on Prime Video in July 2026: Top picks and all the new movies and shows to watch ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It’s officially summer, which means the biggest streaming services are rolling out fresh content to keep everyone entertained during these warmer months, <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> being one of them. </p><p>Prime Video has just released its full July 2026 lineup, so I’ve included the top picks we already know about, along with new library titles set to drop at the beginning of the month. This month's releases include the “Legally Blonde” prequel series “Elle,” which follows the titular character in her high school years. There’s also an action-packed comedy series starring Hannah Waddingham and the second season of an animated superhero show. </p><p>Check out my top recommendations and everything currently scheduled to arrive on Prime Video in July 2026.</p><h3 class="article-body__section" id="section-new-on-prime-video-in-july-2026-top-picks"><span>New on Prime Video in July 2026: Top picks</span></h3><h2 id="elle-july-1">‘Elle’ (July 1)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/6KsT3K5ynrU" allowfullscreen></iframe></div></div><p>“Elle” functions as an official TV prequel to the iconic 2001 film “Legally Blonde,” taking place six years before the events of the movie. Executive producer Reese Witherspoon actually revealed that she was directly inspired to create the spinoff after watching the massive success of Netflix’s “Wednesday,” realizing that audiences would love to see how an iconic character's distinct personality was forged during their high school years. It already seems like a bright, breezy, and fun piece of summer TV.</p><p>The show follows teenage Elle Woods (Lexi Minetree) in 1995, years before she becomes the confident law student audiences know from the films. After her family relocates from Bel-Air to Seattle, Elle finds herself starting over at a new high school, where she must form new friendships and get through the everyday chaos of adolescence. As she adjusts to her new surroundings, Elle relies on the support of her parents and close friends while discovering the experiences that help shape her future. </p><p><em><strong>Stream "Elle" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXC14CMG" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from July 1</strong></em></p><h2 id="ride-or-die-july-15">‘Ride or Die’ (July 15)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/QFGAxkTRAG8" allowfullscreen></iframe></div></div><p>If you’re in the mood for a buddy action-comedy series, you’ll want “Ride or Die” on your watchlist. The creators explicitly set out to build a massive, blockbuster-scale action series anchored entirely by a platonic female friendship between two women in their 50s. Judging by the trailer, it aims to be a loud and high-energy popcorn thrill ride that thrives entirely on the electric chemistry between Octavia Spencer and Hannah Waddingham.</p><p>Debbie Claybourne (Octavia Spencer) is a woman whose life is thrown into chaos when she discovers that her best friend of two decades, Judith Burton (Hannah Waddingham), has been hiding a shocking secret: she's an international assassin. When one of Judith's missions goes disastrously wrong and a dangerous figure from her past resurfaces, the pair is forced to flee across Europe together. The lifelong friends must rely on each other to survive an increasingly unpredictable adventure.</p><p><em><strong>Stream "Ride or Die" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H1MBNDTL" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from July 15</strong></em></p><h2 id="batman-caped-crusader-season-2-july-31">‘Batman: Caped Crusader’ season 2 (July 31)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/pNhijtUqyeg" allowfullscreen></iframe></div></div><p>Another big series on Prime Video this month is the second season of “Batman: Caped Crusader,” which stands as a spiritual successor to the legendary 1990s “Batman: The Animated Series,” bringing back original co-creator Bruce Timm alongside modern blockbuster masterminds Matt Reeves and J.J. Abrams to produce the show. This series follows a young, deeply psychologically isolated Bruce Wayne in his early years as a masked vigilante.</p><p>Set in a shadowy version of Gotham City, “Batman: Caped Crusader” season 2 follows Bruce Wayne (Hamish Linklater) as he continues his war on crime while facing a new wave of dangerous criminals. As Batman digs deeper into the city's criminal underworld, he encounters notorious figures including Edward Nygma (Dave Franco), the Mad Hatter (Laraine Newman), Roxy Rocket, and the Joker (John DiMaggio), each bringing new challenges that test his skills as both a detective and vigilante. </p><p><em><strong>Stream "Batman: Caped Crusader" season 2 on </strong></em><a href="https://www.amazon.com/Batman-Caped-Crusader-Season-1/dp/B0CYFCLQ6B" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from July 31</strong></em></p><h3 class="article-body__section" id="section-new-shows-on-prime-video-in-july-2026"><span>New shows on Prime Video in July 2026</span></h3><p><strong>July 1</strong></p><ul><li>Elle (2026)</li><li>Everybody Hates Chris S1-4 (2005)</li><li>Gilmore Girls S1-7 (2000)</li></ul><p><strong>July 3</strong></p><ul><li>The Loyalty Game (2026)</li></ul><p><strong>July 7</strong></p><ul><li>The Ghost In The Shell (2026)</li></ul><p><strong>July 9</strong></p><ul><li>From Old Country Bumpkin to Master Swordsman S2 (2026)</li></ul><p><strong>July 15</strong></p><ul><li>Ride or Die (2026)</li></ul><p><strong>July 17</strong></p><ul><li>Jesy Nelson: Life Changing (2026)</li><li>Young Farts Trailer Parts (2026)</li></ul><p><strong>July 31</strong></p><ul><li>Batman: Caped Crusader S2 (2026)</li></ul><h3 class="article-body__section" id="section-new-movies-on-prime-video-in-july-2026"><span>New movies on Prime Video in July 2026</span></h3><p><strong>July 1</strong></p><ul><li>1984 (1985)</li><li>A Fish Called Wanda (1988)</li><li>A Fistful Of Dollars (1967)</li><li>A Good Person (2023)</li><li>About My Father (2023)</li><li>Alive (1993)</li><li>Backdraft (1991)</li><li>Backdraft 2 (2019)</li><li>Bones And All (2022)</li><li>Bottoms (2023)</li><li>Capote (2006)</li><li>Couple’s Retreat (2009)</li><li>Dante's Peak (1997)</li><li>Death Race (2008)</li><li>Dudley Do-Right (1999)</li><li>Fiddler On The Roof (1971)</li><li>For a Few Dollars More (1967)</li><li>Gladiator (2000)</li><li>Homefront (2013)</li><li>How to Lose a Guy in 10 Days (2003)</li><li>How to Train Your Dragon (2010)</li><li>How to Train Your Dragon 2 (2014)</li><li>Ice Age (2002)</li><li>Ice Age: The Meltdown (2006)</li><li>Jinn (2014)</li><li>Judgment At Nuremberg (1961)</li><li>Jujutsu Kaisen 0 (2022)</li><li>Landscape With Invisible Hand (2023)</li><li>Lars and the Real Girl (2007)</li><li>Leave It to Beaver (1997)</li><li>Leaving Las Vegas (1996)</li><li>Leviathan (1989)</li><li>Lions for Lambs (2007)</li><li>Maine (2018)</li><li>Man in the Moon (1991)</li><li>Miami Vice (2006)</li><li>Moonfall (2022)</li><li>Much Ado About Nothing (1993)</li><li>On The Count Of Three (2022)</li><li>Original Sin (2001)</li><li>Percy Jackson: Sea Of Monsters (2013)</li><li>Road House (1989)</li><li>Ronin (1998)</li><li>Saving Private Ryan (1998)</li><li>Showgirls (1995)</li><li>Support Your Local Gunfighter (1971)</li><li>Support Your Local Sheriff (1969)</li><li>Surrounded (2023)</li><li>The Adventures Of Priscilla Queen of the Desert (1994)</li><li>The Boy Next Door (2015)</li><li>The Flintstones (1994)</li><li>The Flintstones In Viva Rock Vegas (2000)</li><li>The Good, the Bad, and the Ugly (1967)</li><li>The Magnificent Seven (1960)</li><li>The Magnificent Seven (2016)</li><li>The Martian (2015)</li><li>The Young Messiah (2016)</li><li>Three Amigos! (1986)</li><li>Three Thousand Years Of Longing (2022)</li><li>Till (2022)</li><li>To Live And Die In L.A. (1985)</li><li>Tropic Thunder (2008)</li><li>Uncharted (2022)</li><li>Unlovable (2018)</li><li>War Dogs (2016)</li><li>World War Z (2013</li></ul><p><strong>July 8</strong></p><ul><li>65 (2023)</li></ul><p><strong>July 17</strong></p><ul><li>Do Not Enter (2026)</li><li>The Amateur (2025)</li></ul><p><strong>July 24</strong></p><ul><li>The Wild Robot (2024)</li></ul><p><strong>July 31</strong></p><ul><li>Primate (2026)</li></ul><h3 class="article-body__section" id="section-live-sports"><span>Live sports</span></h3><p><strong>Yankees</strong></p><ul><li><strong>July 8 at 6:40 p.m. ET: </strong>New York Yankees at Tampa Bay Rays</li><li><strong>July 29 at 7:40 p.m. ET:</strong> New York Yankees at Chicago White Sox</li></ul><p><strong>WNBA</strong></p><ul><li><strong>July 2 at 8 p.m. ET: </strong>Dallas Wings at Connecticut Sun</li><li><strong>July 9 at 8 p.m. ET: </strong>Seattle Storm at Atlanta Dream</li><li><strong>July 9 at 10 p.m. ET: </strong>Indiana Fever at Phoenix Mercury</li><li><strong>July 16 at 8 p.m. ET: </strong>New York Liberty at Dallas Wings</li><li><strong>July 30 at 8 p.m. ET: </strong>Connecticut Sun at Chicago Sky</li><li><strong>July 30 at 10 p.m. ET: </strong>New York Liberty at Las Vegas Aces</li></ul><p><strong>NWSL</strong></p><ul><li><strong>July 3 at 10 p.m. ET:</strong> Angel City FC vs. Orlando Pride</li><li><strong>July 10 at 8 p.m. ET: </strong>Orlando Pride vs. Kansas City Current</li><li><strong>July 17 at 8 p.m. ET: </strong>Kansas City Current vs. San Diego Wave</li><li><strong>July 24 at 10 p.m. ET:</strong> Portland Thorns vs. Gotham FC</li><li><strong>July 31 at 8 p.m. ET: </strong>NC Courage vs. Orlando Pride</li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evLolO"></div>                            </div>                            <script src="https://kwizly.com/embed/evLolO.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/movies/10-best-summer-movies-of-the-decade-ranked">10 best summer movies of the decade, ranked</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-best-prime-video-movies-to-stream-now-before-they-leave-in-june-2026">5 Prime Video movies to stream before they leave in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-one-of-them-is-a-classic-masterpiece-ranked-among-the-best-films-ever-made-june-23-29">3 new to Prime Video thriller movies to stream this week</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-july-2026-top-picks-and-all-the-new-movies-and-shows-to-watch</link>
                                                                            <description>
                            <![CDATA[ Our guide to the best new movies and shows you can stream on Prime Video in July 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NZ86YJBsqA344Pi3jnqcen</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RvHiYSZStp5ddxKpjxjF7C-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 28 Jun 2026 04:01:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ alix.blackburn@futurenet.com (Alix Blackburn) ]]></author>                    <dc:creator><![CDATA[ Alix Blackburn ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8UxyT2McanNFLYwQ6wC7di.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/RvHiYSZStp5ddxKpjxjF7C-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock; Prime Video]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a red-orange background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a red-orange background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a red-orange background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RvHiYSZStp5ddxKpjxjF7C-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It’s officially summer, which means the biggest streaming services are rolling out fresh content to keep everyone entertained during these warmer months, <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> being one of them. </p><p>Prime Video has just released its full July 2026 lineup, so I’ve included the top picks we already know about, along with new library titles set to drop at the beginning of the month. This month's releases include the “Legally Blonde” prequel series “Elle,” which follows the titular character in her high school years. There’s also an action-packed comedy series starring Hannah Waddingham and the second season of an animated superhero show. </p><p>Check out my top recommendations and everything currently scheduled to arrive on Prime Video in July 2026.</p><h3 class="article-body__section" id="section-new-on-prime-video-in-july-2026-top-picks"><span>New on Prime Video in July 2026: Top picks</span></h3><h2 id="elle-july-1">‘Elle’ (July 1)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/6KsT3K5ynrU" allowfullscreen></iframe></div></div><p>“Elle” functions as an official TV prequel to the iconic 2001 film “Legally Blonde,” taking place six years before the events of the movie. Executive producer Reese Witherspoon actually revealed that she was directly inspired to create the spinoff after watching the massive success of Netflix’s “Wednesday,” realizing that audiences would love to see how an iconic character's distinct personality was forged during their high school years. It already seems like a bright, breezy, and fun piece of summer TV.</p><p>The show follows teenage Elle Woods (Lexi Minetree) in 1995, years before she becomes the confident law student audiences know from the films. After her family relocates from Bel-Air to Seattle, Elle finds herself starting over at a new high school, where she must form new friendships and get through the everyday chaos of adolescence. As she adjusts to her new surroundings, Elle relies on the support of her parents and close friends while discovering the experiences that help shape her future. </p><p><em><strong>Stream "Elle" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXC14CMG" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from July 1</strong></em></p><h2 id="ride-or-die-july-15">‘Ride or Die’ (July 15)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/QFGAxkTRAG8" allowfullscreen></iframe></div></div><p>If you’re in the mood for a buddy action-comedy series, you’ll want “Ride or Die” on your watchlist. The creators explicitly set out to build a massive, blockbuster-scale action series anchored entirely by a platonic female friendship between two women in their 50s. Judging by the trailer, it aims to be a loud and high-energy popcorn thrill ride that thrives entirely on the electric chemistry between Octavia Spencer and Hannah Waddingham.</p><p>Debbie Claybourne (Octavia Spencer) is a woman whose life is thrown into chaos when she discovers that her best friend of two decades, Judith Burton (Hannah Waddingham), has been hiding a shocking secret: she's an international assassin. When one of Judith's missions goes disastrously wrong and a dangerous figure from her past resurfaces, the pair is forced to flee across Europe together. The lifelong friends must rely on each other to survive an increasingly unpredictable adventure.</p><p><em><strong>Stream "Ride or Die" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H1MBNDTL" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from July 15</strong></em></p><h2 id="batman-caped-crusader-season-2-july-31">‘Batman: Caped Crusader’ season 2 (July 31)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/pNhijtUqyeg" allowfullscreen></iframe></div></div><p>Another big series on Prime Video this month is the second season of “Batman: Caped Crusader,” which stands as a spiritual successor to the legendary 1990s “Batman: The Animated Series,” bringing back original co-creator Bruce Timm alongside modern blockbuster masterminds Matt Reeves and J.J. Abrams to produce the show. This series follows a young, deeply psychologically isolated Bruce Wayne in his early years as a masked vigilante.</p><p>Set in a shadowy version of Gotham City, “Batman: Caped Crusader” season 2 follows Bruce Wayne (Hamish Linklater) as he continues his war on crime while facing a new wave of dangerous criminals. As Batman digs deeper into the city's criminal underworld, he encounters notorious figures including Edward Nygma (Dave Franco), the Mad Hatter (Laraine Newman), Roxy Rocket, and the Joker (John DiMaggio), each bringing new challenges that test his skills as both a detective and vigilante. </p><p><em><strong>Stream "Batman: Caped Crusader" season 2 on </strong></em><a href="https://www.amazon.com/Batman-Caped-Crusader-Season-1/dp/B0CYFCLQ6B" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from July 31</strong></em></p><h3 class="article-body__section" id="section-new-shows-on-prime-video-in-july-2026"><span>New shows on Prime Video in July 2026</span></h3><p><strong>July 1</strong></p><ul><li>Elle (2026)</li><li>Everybody Hates Chris S1-4 (2005)</li><li>Gilmore Girls S1-7 (2000)</li></ul><p><strong>July 3</strong></p><ul><li>The Loyalty Game (2026)</li></ul><p><strong>July 7</strong></p><ul><li>The Ghost In The Shell (2026)</li></ul><p><strong>July 9</strong></p><ul><li>From Old Country Bumpkin to Master Swordsman S2 (2026)</li></ul><p><strong>July 15</strong></p><ul><li>Ride or Die (2026)</li></ul><p><strong>July 17</strong></p><ul><li>Jesy Nelson: Life Changing (2026)</li><li>Young Farts Trailer Parts (2026)</li></ul><p><strong>July 31</strong></p><ul><li>Batman: Caped Crusader S2 (2026)</li></ul><h3 class="article-body__section" id="section-new-movies-on-prime-video-in-july-2026"><span>New movies on Prime Video in July 2026</span></h3><p><strong>July 1</strong></p><ul><li>1984 (1985)</li><li>A Fish Called Wanda (1988)</li><li>A Fistful Of Dollars (1967)</li><li>A Good Person (2023)</li><li>About My Father (2023)</li><li>Alive (1993)</li><li>Backdraft (1991)</li><li>Backdraft 2 (2019)</li><li>Bones And All (2022)</li><li>Bottoms (2023)</li><li>Capote (2006)</li><li>Couple’s Retreat (2009)</li><li>Dante's Peak (1997)</li><li>Death Race (2008)</li><li>Dudley Do-Right (1999)</li><li>Fiddler On The Roof (1971)</li><li>For a Few Dollars More (1967)</li><li>Gladiator (2000)</li><li>Homefront (2013)</li><li>How to Lose a Guy in 10 Days (2003)</li><li>How to Train Your Dragon (2010)</li><li>How to Train Your Dragon 2 (2014)</li><li>Ice Age (2002)</li><li>Ice Age: The Meltdown (2006)</li><li>Jinn (2014)</li><li>Judgment At Nuremberg (1961)</li><li>Jujutsu Kaisen 0 (2022)</li><li>Landscape With Invisible Hand (2023)</li><li>Lars and the Real Girl (2007)</li><li>Leave It to Beaver (1997)</li><li>Leaving Las Vegas (1996)</li><li>Leviathan (1989)</li><li>Lions for Lambs (2007)</li><li>Maine (2018)</li><li>Man in the Moon (1991)</li><li>Miami Vice (2006)</li><li>Moonfall (2022)</li><li>Much Ado About Nothing (1993)</li><li>On The Count Of Three (2022)</li><li>Original Sin (2001)</li><li>Percy Jackson: Sea Of Monsters (2013)</li><li>Road House (1989)</li><li>Ronin (1998)</li><li>Saving Private Ryan (1998)</li><li>Showgirls (1995)</li><li>Support Your Local Gunfighter (1971)</li><li>Support Your Local Sheriff (1969)</li><li>Surrounded (2023)</li><li>The Adventures Of Priscilla Queen of the Desert (1994)</li><li>The Boy Next Door (2015)</li><li>The Flintstones (1994)</li><li>The Flintstones In Viva Rock Vegas (2000)</li><li>The Good, the Bad, and the Ugly (1967)</li><li>The Magnificent Seven (1960)</li><li>The Magnificent Seven (2016)</li><li>The Martian (2015)</li><li>The Young Messiah (2016)</li><li>Three Amigos! (1986)</li><li>Three Thousand Years Of Longing (2022)</li><li>Till (2022)</li><li>To Live And Die In L.A. (1985)</li><li>Tropic Thunder (2008)</li><li>Uncharted (2022)</li><li>Unlovable (2018)</li><li>War Dogs (2016)</li><li>World War Z (2013</li></ul><p><strong>July 8</strong></p><ul><li>65 (2023)</li></ul><p><strong>July 17</strong></p><ul><li>Do Not Enter (2026)</li><li>The Amateur (2025)</li></ul><p><strong>July 24</strong></p><ul><li>The Wild Robot (2024)</li></ul><p><strong>July 31</strong></p><ul><li>Primate (2026)</li></ul><h3 class="article-body__section" id="section-live-sports"><span>Live sports</span></h3><p><strong>Yankees</strong></p><ul><li><strong>July 8 at 6:40 p.m. ET: </strong>New York Yankees at Tampa Bay Rays</li><li><strong>July 29 at 7:40 p.m. ET:</strong> New York Yankees at Chicago White Sox</li></ul><p><strong>WNBA</strong></p><ul><li><strong>July 2 at 8 p.m. ET: </strong>Dallas Wings at Connecticut Sun</li><li><strong>July 9 at 8 p.m. ET: </strong>Seattle Storm at Atlanta Dream</li><li><strong>July 9 at 10 p.m. ET: </strong>Indiana Fever at Phoenix Mercury</li><li><strong>July 16 at 8 p.m. ET: </strong>New York Liberty at Dallas Wings</li><li><strong>July 30 at 8 p.m. ET: </strong>Connecticut Sun at Chicago Sky</li><li><strong>July 30 at 10 p.m. ET: </strong>New York Liberty at Las Vegas Aces</li></ul><p><strong>NWSL</strong></p><ul><li><strong>July 3 at 10 p.m. ET:</strong> Angel City FC vs. Orlando Pride</li><li><strong>July 10 at 8 p.m. ET: </strong>Orlando Pride vs. Kansas City Current</li><li><strong>July 17 at 8 p.m. ET: </strong>Kansas City Current vs. San Diego Wave</li><li><strong>July 24 at 10 p.m. ET:</strong> Portland Thorns vs. Gotham FC</li><li><strong>July 31 at 8 p.m. ET: </strong>NC Courage vs. Orlando Pride</li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evLolO"></div>                            </div>                            <script src="https://kwizly.com/embed/evLolO.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/movies/10-best-summer-movies-of-the-decade-ranked">10 best summer movies of the decade, ranked</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-best-prime-video-movies-to-stream-now-before-they-leave-in-june-2026">5 Prime Video movies to stream before they leave in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-one-of-them-is-a-classic-masterpiece-ranked-among-the-best-films-ever-made-june-23-29">3 new to Prime Video thriller movies to stream this week</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video shows to binge-watch this weekend (June 26-28) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Between the swoon-worthy romantic series "Every Year After" and new installments of "The Legend of Vox Machina" and "Clarkson's Farm," we're coming off a great month for television on <a href="https://www.tomsguide.com/uk/entertainment/streaming/prime-video">Prime Video</a>. But we're not done just yet! The final weekend of June will still find some TV treasures primed and ready on the Amazon <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service.</a></p><p>Given that Prime Video has such an extensive library, with new TV titles and film releases being added to the platform on a monthly basis, we here are Tom's Guide have decided to make things easier for you and narrowed the list down to a trio of worthy shows that we think you should check out next. </p><p>Yes, there's more romance in store, this time in the form of South Korean workplace rom-com "See You at Work Tomorrow." And if you're a sports fan, we have a double dose of fun via a new four-part tennis docuseries and a fresh installment of Eli Manning's athlete-focused prank show. Here are the 3 best new to Prime Video shows to binge-watch this weekend.</p><h2 id="aces-the-atp-no-1-club">'ACES: The ATP No. 1 Club'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Esj4PeFiQ6w" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Sports docuseries</p><p><strong>What it's about: </strong>In five decades, only 29 men have reached No. 1 in the Association of Tennis Professionals (ATP) rankings—this new four-part doc looks at the journey of those talented athletes and explores "the obsession, sacrifice, and resilience behind that rare achievement," per Prime Video, revealing the "defining matches, rivalries, and personal costs that shaped these champions."</p><p><strong>Why you should watch it: </strong>Sure, it seems like the entire world has soccer on the brain at the moment, but between Wimbledon and the U.S. Open, tennis will soon be the talk of the sports-loving town. And this docuseries will certainly get you in the courtside mood, with talking-head interviews from tennis legends like John McEnroe, Björn Borg, Pete Sampras, Andre Agassi, Roger Federer, Rafael Nadal and Novak Djokovic, as well as current stars Carlos Alcaraz and Jannik Sinner.</p><p><em><strong>Stream '</strong></em><a href="https://www.primevideo.com/region/na/detail/0FT5BVEK47EUPXZH8GYYBZUZYT" target="_blank" rel="nofollow"><em><strong>Aces: The ATP No.1 Club' on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="see-you-at-work-tomorrow">'See You at Work Tomorrow'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/kBGgK8F3CSU" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Workplace romance</p><p><strong>What it's about: </strong>Based on the 2020 Kakao webtoon "Back to Work!" by McQueen Studio, this South Korean rom-com centers on Cha Ji-yoon (Park Ji-hyun), a seventh-year product planner who is exhausted in both her professional and personal life, especially after suffering a painful breakup. However, that burnout gets a bit of a boost when, due to a departmental reorg, she begins working under Kang Si-woo (Seo In-guk), who is known to have a cold, Mr. Darcy-esque rigidity. Soon, though, the coworkers find themselves sharing some unexpected chemistry. </p><p><strong>Why you should watch it: </strong>If it's heart and humor you're after in your weekend watch, this office-set romance has plenty of both. Directed by Cho Eun-sol and written by Kim Kyung-min, the 12-episode first season blends witty workplace satire with palpable romantic tension.</p><p><em><strong>Watch </strong></em><a href="https://www.primevideo.com/region/na/detail/0NKUDJIM5VAE9079ZGUUVI3SS4" target="_blank" rel="nofollow"><em><strong>"See You at Work Tomorrow" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="eli-manning-presents-the-undercovers">'Eli Manning Presents: The Undercovers'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/hqjwmW4JIFA" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Prank comedy</p><p><strong>What it's about: </strong>In this sports comedy docuseries, football icon Eli Manning recruits fellow famous athletes to don heavy prosthetics and ridiculous disguises to prank and surprise their most diehard fans. In the newest installment, which hit Prime Video on June 11, the former NFL quarterback has roped in NASCAR champion Ryan Blaney to go undercover at the Team Penske Race Shop in Mooresville, North Carolina.</p><p><strong>Why you should watch it: </strong>Even if you're not a sports fan, there's still infectious joy to be felt watching big-time fans get the surprise of their life in this lighthearted, unscripted series. But if you <em>do </em>follow professional athletes, you'll get an extra kick out of watching the likes of linebacker Micah Parsons acting like an awkward waiter or wide receiver Justin Jefferson pretending to be a nature photographer. </p><p><em><strong>Stream "</strong></em><a href="https://www.primevideo.com/region/na/detail/0NQ2T4I0OK30WSADW946B4RZ9A/ref=atv_sr_fle_c_sra5ba81_1_1_1?sr=1-1&pageTypeIdSource=ASIN&pageTypeId=B0FYR6829N&qid=1782482483365" target="_blank" rel="nofollow"><em><strong>Eli Manning Presents: The Undercovers" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 movies for free — no Prime membership required</a></li><li><strong></strong><a href="https://www.tomsguide.com/entertainment/prime-video/5-best-prime-video-movies-to-stream-now-before-they-leave-in-june-2026">5 best Prime Video movies to stream now before they leave in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/spike-lee-is-having-the-ultimate-knicks-championship-summer-but-his-greatest-new-york-movie-leaves-prime-video-in-days">Spike Lee is having the ultimate Knicks championship summer, but his greatest New York movie leaves Prime Video in days</a></li></ul><div data-model-name="Amazon Prime Video,Hulu,Netflix,Paramount Plus,Peacock TV,Disney+,Apple TV" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-shows-to-binge-watch-this-weekend-june-26-28</link>
                                                                            <description>
                            <![CDATA[ Planning to binge-watch something new this weekend? Here's our weekly guide to the best new to Prime Video series you should be streaming right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WdbntBEeujaL4jHWjn2btk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 15:29:51 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></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/aozP98atByMPCDdiMyJSPC-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on teal bubbles background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on teal bubbles background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on teal bubbles background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Between the swoon-worthy romantic series "Every Year After" and new installments of "The Legend of Vox Machina" and "Clarkson's Farm," we're coming off a great month for television on <a href="https://www.tomsguide.com/uk/entertainment/streaming/prime-video">Prime Video</a>. But we're not done just yet! The final weekend of June will still find some TV treasures primed and ready on the Amazon <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service.</a></p><p>Given that Prime Video has such an extensive library, with new TV titles and film releases being added to the platform on a monthly basis, we here are Tom's Guide have decided to make things easier for you and narrowed the list down to a trio of worthy shows that we think you should check out next. </p><p>Yes, there's more romance in store, this time in the form of South Korean workplace rom-com "See You at Work Tomorrow." And if you're a sports fan, we have a double dose of fun via a new four-part tennis docuseries and a fresh installment of Eli Manning's athlete-focused prank show. Here are the 3 best new to Prime Video shows to binge-watch this weekend.</p><h2 id="aces-the-atp-no-1-club">'ACES: The ATP No. 1 Club'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Esj4PeFiQ6w" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Sports docuseries</p><p><strong>What it's about: </strong>In five decades, only 29 men have reached No. 1 in the Association of Tennis Professionals (ATP) rankings—this new four-part doc looks at the journey of those talented athletes and explores "the obsession, sacrifice, and resilience behind that rare achievement," per Prime Video, revealing the "defining matches, rivalries, and personal costs that shaped these champions."</p><p><strong>Why you should watch it: </strong>Sure, it seems like the entire world has soccer on the brain at the moment, but between Wimbledon and the U.S. Open, tennis will soon be the talk of the sports-loving town. And this docuseries will certainly get you in the courtside mood, with talking-head interviews from tennis legends like John McEnroe, Björn Borg, Pete Sampras, Andre Agassi, Roger Federer, Rafael Nadal and Novak Djokovic, as well as current stars Carlos Alcaraz and Jannik Sinner.</p><p><em><strong>Stream '</strong></em><a href="https://www.primevideo.com/region/na/detail/0FT5BVEK47EUPXZH8GYYBZUZYT" target="_blank" rel="nofollow"><em><strong>Aces: The ATP No.1 Club' on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="see-you-at-work-tomorrow">'See You at Work Tomorrow'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/kBGgK8F3CSU" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Workplace romance</p><p><strong>What it's about: </strong>Based on the 2020 Kakao webtoon "Back to Work!" by McQueen Studio, this South Korean rom-com centers on Cha Ji-yoon (Park Ji-hyun), a seventh-year product planner who is exhausted in both her professional and personal life, especially after suffering a painful breakup. However, that burnout gets a bit of a boost when, due to a departmental reorg, she begins working under Kang Si-woo (Seo In-guk), who is known to have a cold, Mr. Darcy-esque rigidity. Soon, though, the coworkers find themselves sharing some unexpected chemistry. </p><p><strong>Why you should watch it: </strong>If it's heart and humor you're after in your weekend watch, this office-set romance has plenty of both. Directed by Cho Eun-sol and written by Kim Kyung-min, the 12-episode first season blends witty workplace satire with palpable romantic tension.</p><p><em><strong>Watch </strong></em><a href="https://www.primevideo.com/region/na/detail/0NKUDJIM5VAE9079ZGUUVI3SS4" target="_blank" rel="nofollow"><em><strong>"See You at Work Tomorrow" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="eli-manning-presents-the-undercovers">'Eli Manning Presents: The Undercovers'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/hqjwmW4JIFA" allowfullscreen></iframe></div></div><p><strong>Genre: </strong>Prank comedy</p><p><strong>What it's about: </strong>In this sports comedy docuseries, football icon Eli Manning recruits fellow famous athletes to don heavy prosthetics and ridiculous disguises to prank and surprise their most diehard fans. In the newest installment, which hit Prime Video on June 11, the former NFL quarterback has roped in NASCAR champion Ryan Blaney to go undercover at the Team Penske Race Shop in Mooresville, North Carolina.</p><p><strong>Why you should watch it: </strong>Even if you're not a sports fan, there's still infectious joy to be felt watching big-time fans get the surprise of their life in this lighthearted, unscripted series. But if you <em>do </em>follow professional athletes, you'll get an extra kick out of watching the likes of linebacker Micah Parsons acting like an awkward waiter or wide receiver Justin Jefferson pretending to be a nature photographer. </p><p><em><strong>Stream "</strong></em><a href="https://www.primevideo.com/region/na/detail/0NQ2T4I0OK30WSADW946B4RZ9A/ref=atv_sr_fle_c_sra5ba81_1_1_1?sr=1-1&pageTypeIdSource=ASIN&pageTypeId=B0FYR6829N&qid=1782482483365" target="_blank" rel="nofollow"><em><strong>Eli Manning Presents: The Undercovers" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 movies for free — no Prime membership required</a></li><li><strong></strong><a href="https://www.tomsguide.com/entertainment/prime-video/5-best-prime-video-movies-to-stream-now-before-they-leave-in-june-2026">5 best Prime Video movies to stream now before they leave in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/spike-lee-is-having-the-ultimate-knicks-championship-summer-but-his-greatest-new-york-movie-leaves-prime-video-in-days">Spike Lee is having the ultimate Knicks championship summer, but his greatest New York movie leaves Prime Video in days</a></li></ul><div data-model-name="Amazon Prime Video,Hulu,Netflix,Paramount Plus,Peacock TV,Disney+,Apple TV" data-widget-type="multimodelreview" data-widget-title="Today's best streaming service deals" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Grill smarter, not harder — these top 12 Prime Day grilling essential deals are up to 50% off right now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Grilling season is here! And whether you enjoy hosting summer barbecues or preparing for a big 4th July cookout, you’ll need all the right essentials to level up your grilling game. </p><p>Plus, it is even better when you can score major savings during the <a href="https://www.tomsguide.com/live/news/prime-day-2026-handpicked-editor-recommended-deals-live#live">Prime Day deals</a>. I've just tracked down some absolute steals featuring massive discounts of up to 50% right now. All these products promise to make grilling a breeze. </p><p>So, whether you want a premium grilling tool set or a heavy-duty cast-iron press to make smash burgers, here are the offers that I'm adding to my shopping cart today. Either way, you're bound to wow your cookout guests.</p>        <div class="featured_product_block featured_block_hero" data-id="a99fdfb8-667b-40be-b691-21d7c6c7a8eb">            <a href="https://www.amazon.com/Resistant-Grilling-Silicone-Non-Slip-Barbecue/dp/B07YTVMRV4" data-model-name="Comsmart BBQ Gloves" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/cq9fA3TsKEg59K663tM7V8.jpg" alt="Comsmart, Comsmart Bbq Gloves, 1472 Degree F Heat Resistant Grilling Gloves Silicone Non-Slip Oven Gloves Long Kitchen Gloves for Barbecue, Cooking, Baking, Cutting"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Comsmart</div>                                        <div class="featured__title">Comsmart BBQ Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="1fbe9687-1be4-4ddb-a3ea-5a2a499784c8">            <a href="https://www.amazon.com/dp/B0DD3S7WDZ" data-model-name="Vovoly Extra Wide Griddle Scraper" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/aewh7saHuUBHEqLcbBm5Lo.jpg" alt="Vovoly, Vovoly Extra Wide Griddle Scraper, 5.5''x5.5'' Smashed Burger Scraper Grill Scraper Spatula Burger Turner - Full Tang Wooden Handle Professional Grade Grill Accessories, Knife Grade Stainless Steel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Vovoly</div>                                        <div class="featured__title">Vovoly Extra Wide Griddle Scraper</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="38fdba6d-7e68-4fa8-86cf-805f5d2b5f16">            <a href="https://www.amazon.com/dp/B0C3V4XD9X" data-model-name="Shizzo Shallow Grill Basket Set" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/UnpSZGjzLa4PE87U65ZSCR.jpg" alt="SHIZZO, Shizzo Shallow Grill Basket Set, Grilling Accessories Barbecue Bbq, Stainless Steel Folding Portable Outdoor Camping Rack for Fish, Shrimp, Vegetables, Cooking Accessories, Gift for Family, Freinds"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>SHIZZO</div>                                        <div class="featured__title">Shizzo Shallow Grill Basket Set</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="2ca2eec4-de5c-4232-865d-e5c650d597f9">            <a href="https://www.amazon.com/Cuisinart-CISB-111-Smashed-Burger-Press/dp/B07SZFHKVZ" data-model-name="Cuisinart 6.5" Cast Iron Smashed Burger Press" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/g6t2j7cx3B3jDW7RkqfXTN.jpg" alt="Cuisinart, Cuisinart 6.5" Cast Iron Smashed Burger Press, Round Flat Edge Grill Press for Crispy Smash Burgers, Burger Tool for Grill and Griddle Accessories, for Bbqs and Tailgates"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Cuisinart</div>                                        <div class="featured__title">Cuisinart 6.5" Cast Iron Smashed Burger Press</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a55cd508-92ff-4d3b-9b8a-2f78d9aa6620">            <a href="https://www.amazon.com/dp/B075NC2MYB" data-model-name="Grillart Grill Brush and Scraper " data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/aPGKsfLnZE2ThFyUF9LVFS.jpg" alt="GRILLART, Grillart Grill Brush and Scraper Bbq Brush for Grill, Safe 18" Stainless Steel Woven Wire 3 in 1 Bristles Grill Cleaning Brush, Br-4516"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>GRILLART</div>                                        <div class="featured__title">Grillart Grill Brush and Scraper </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="8d543a4c-33bb-4f8a-ada1-65c348720570">            <a href="https://www.amazon.com/dp/B0D87SH9ZB" data-model-name="Shizzo Rolling Grill Basket" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/P6R7sxyAzpNBQihcS5KVGN.jpg" alt="SHIZZO, Shizzo Rolling Grill Basket, Removable Wooden Handle, Extra Sturdy Cylinder Grilling Basket, Food Grade Stainless Steel, Portable Outdoor Camping Accessories Bbq Net Rack, Cooking Griller for Fish, Vegetables, and More - Gifts for Men Dad Husband - Set of 2"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>SHIZZO</div>                                        <div class="featured__title">Shizzo Rolling Grill Basket</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d7a3896c-2366-407a-ae78-7966b665a193">            <a href="https://www.amazon.com/dp/B09BHJWV2Q" data-model-name="Hulisen Smashed Burger Kit: Press, Grill Spatula and Spice Shaker " data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/47nUg4GaheZzagXiSn33YW.jpg" alt="HULISEN, Hulisen Smashed Burger Kit, Stainless Steel Burger Press, Grill Spatula and Spice Dredge Shaker - Burger Smasher Griddle Accessories Kit for Flat Top Griddle Grill Cooking, Gift Package"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>HULISEN</div>                                        <div class="featured__title">Hulisen Smashed Burger Kit: Press, Grill Spatula and Spice Shaker </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="cb0817e2-fe06-4bc9-b8e8-c326162f1b01">            <a href="https://www.amazon.com/Scrub-Daddy-Grill-Brush-BBQ/dp/B09SVK9YBB" data-model-name="Scrub Daddy Bbq Daddy Grill Brush " data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/Cn36GCk3nKtxMmRggkiozL.jpg" alt="Scrub Daddy, Scrub Daddy Bbq Daddy Grill Brush for Outdoor Grill - Bristle Free Grill Brush With Steel Grill Scraper + Scrub Brush - Temperature Controlled Scrubbing Power for Grill Cleaning (1 Count)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Scrub Daddy</div>                                        <div class="featured__title">Scrub Daddy Bbq Daddy Grill Brush </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="0d08f11c-d651-457c-ab7a-0a55f478c16d">            <a href="https://www.amazon.com/gp/aw/d/B0DNMTK56N" data-model-name="Thermomaven Digital Meat Thermometer" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/hgDfjtprY8EmAFVsjDoHMG.jpg" alt="ThermoMaven, Thermomaven Professional Meat Thermometer Digital, Ultra-Fast 0.5 Sec Instant Read, Nist Certified ±0.5°f Accuracy, Ip67 Waterproof, Auto-Rotating Backlit Display, Lift-To-Wake, for Bbq/cooking/candy"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>ThermoMaven</div>                                        <div class="featured__title">Thermomaven Digital Meat Thermometer</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="01cbeb4e-2e76-4523-9179-b1213c11fc21">            <a href="https://www.amazon.com/Kaluns-Stainless-Luxurious-barbequing-Professional/dp/B079J4KT8H" data-model-name="Kaluns Grilling Accessories" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/XdGiRZYHSx2nmPMZz3UAeK.jpg" alt="Kaluns, Kaluns Grilling Accessories, Dad Gifts for Fathers Day, Grilling Gifts, Heavy Duty Stainless Steel Bbq Tool Set for Outdoor Grill With Aluminum Case and Apron, Birthday Gifts for Men Women"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Kaluns</div>                                        <div class="featured__title">Kaluns Grilling Accessories</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="eaea6b5d-db09-4bca-875c-69bc16f3429d">            <a href="https://www.amazon.com/Cutluxe-Slicing-Carving-Knife-Ergonomic/dp/B07VLW8677/" data-model-name="Cutluxe 12-Inch Brisket Knife" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:125.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/PEvigrLJjynDcXqgudWkuY.jpg" alt="Cutluxe Brisket Knife – 12" Carving & Slicing Knife for Meat & Bbq – Razor Sharp German Steel, Sheath Included, Ergonomic Full Tang Handle Design, Grilling Gifts for Men – Artisan Series"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Cutluxe</div>                                        <div class="featured__title">Cutluxe 12-Inch Brisket Knife</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="67d03b93-6e19-4462-b915-8c6e6536dad9">            <a href="https://www.amazon.com/GRILLART-BBQ-Tools-Grill-Set/dp/B09GB5YCHH" data-model-name="Grillart BBQ Grill Tools Set" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/PCbGug4oV6uEb59S37yfL5.jpg" alt="GRILLART, Grillart Bbq Tools Grill Tools Set -18inch Grilling Tools Bbq Set - Grill Accessories W/bbq Tongs, Spatula, Fork, Brush- Stainless Grill Kit Grilling Set - Gift Ideas Bbq Accessories Gifts for Men Dad"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>GRILLART</div>                                        <div class="featured__title">Grillart BBQ Grill Tools Set</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div><h2 id="home-appliances">HOME APPLIANCES</h2><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-home-appliance-deals"><span>We're tracking all the best Prime Day home appliance deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Home+Appliances&price=50_&min_discount_ratio=0.95&offer_type=all&rows=4&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.&show_countdown=true&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-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');                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')}`                });              }            });          }        }        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 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');            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/home/grill-smarter-not-harder-these-top-12-prime-day-grilling-essential-deals-are-up-to-50-percent-off-right-now</link>
                                                                            <description>
                            <![CDATA[ Having a summer cookout? I’ve just found 12 Prime Day deals perfect for levelling up my summer cookouts. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2RRc4Ko3f3s2k2MCmeLrmE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Q2y9CLfuaBCBTmCdYSCby9-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 13:31:25 +0000</pubDate>                                                                                                                                <updated>Fri, 26 Jun 2026 14:31:31 +0000</updated>
                                                                                                                                            <category><![CDATA[Home]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cynthia Lawrence ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/CCuSgQpd5NyZ46CgoF9cva.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Q2y9CLfuaBCBTmCdYSCby9-1280-80.jpg">
                                                            <media:credit><![CDATA[Cuisinart, Comsmart, Vovoly / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of BBQ essentials.]]></media:description>                                                            <media:text><![CDATA[A selection of BBQ essentials.]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of BBQ essentials.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Q2y9CLfuaBCBTmCdYSCby9-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Grilling season is here! And whether you enjoy hosting summer barbecues or preparing for a big 4th July cookout, you’ll need all the right essentials to level up your grilling game. </p><p>Plus, it is even better when you can score major savings during the <a href="https://www.tomsguide.com/live/news/prime-day-2026-handpicked-editor-recommended-deals-live#live">Prime Day deals</a>. I've just tracked down some absolute steals featuring massive discounts of up to 50% right now. All these products promise to make grilling a breeze. </p><p>So, whether you want a premium grilling tool set or a heavy-duty cast-iron press to make smash burgers, here are the offers that I'm adding to my shopping cart today. Either way, you're bound to wow your cookout guests.</p>        <div class="featured_product_block featured_block_hero" data-id="a99fdfb8-667b-40be-b691-21d7c6c7a8eb">            <a href="https://www.amazon.com/Resistant-Grilling-Silicone-Non-Slip-Barbecue/dp/B07YTVMRV4" data-model-name="Comsmart BBQ Gloves" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/cq9fA3TsKEg59K663tM7V8.jpg" alt="Comsmart, Comsmart Bbq Gloves, 1472 Degree F Heat Resistant Grilling Gloves Silicone Non-Slip Oven Gloves Long Kitchen Gloves for Barbecue, Cooking, Baking, Cutting"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Comsmart</div>                                        <div class="featured__title">Comsmart BBQ Gloves</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="1fbe9687-1be4-4ddb-a3ea-5a2a499784c8">            <a href="https://www.amazon.com/dp/B0DD3S7WDZ" data-model-name="Vovoly Extra Wide Griddle Scraper" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/aewh7saHuUBHEqLcbBm5Lo.jpg" alt="Vovoly, Vovoly Extra Wide Griddle Scraper, 5.5''x5.5'' Smashed Burger Scraper Grill Scraper Spatula Burger Turner - Full Tang Wooden Handle Professional Grade Grill Accessories, Knife Grade Stainless Steel"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Vovoly</div>                                        <div class="featured__title">Vovoly Extra Wide Griddle Scraper</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="38fdba6d-7e68-4fa8-86cf-805f5d2b5f16">            <a href="https://www.amazon.com/dp/B0C3V4XD9X" data-model-name="Shizzo Shallow Grill Basket Set" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/UnpSZGjzLa4PE87U65ZSCR.jpg" alt="SHIZZO, Shizzo Shallow Grill Basket Set, Grilling Accessories Barbecue Bbq, Stainless Steel Folding Portable Outdoor Camping Rack for Fish, Shrimp, Vegetables, Cooking Accessories, Gift for Family, Freinds"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>SHIZZO</div>                                        <div class="featured__title">Shizzo Shallow Grill Basket Set</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="2ca2eec4-de5c-4232-865d-e5c650d597f9">            <a href="https://www.amazon.com/Cuisinart-CISB-111-Smashed-Burger-Press/dp/B07SZFHKVZ" data-model-name="Cuisinart 6.5" Cast Iron Smashed Burger Press" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/g6t2j7cx3B3jDW7RkqfXTN.jpg" alt="Cuisinart, Cuisinart 6.5" Cast Iron Smashed Burger Press, Round Flat Edge Grill Press for Crispy Smash Burgers, Burger Tool for Grill and Griddle Accessories, for Bbqs and Tailgates"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Cuisinart</div>                                        <div class="featured__title">Cuisinart 6.5" Cast Iron Smashed Burger Press</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a55cd508-92ff-4d3b-9b8a-2f78d9aa6620">            <a href="https://www.amazon.com/dp/B075NC2MYB" data-model-name="Grillart Grill Brush and Scraper " data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/aPGKsfLnZE2ThFyUF9LVFS.jpg" alt="GRILLART, Grillart Grill Brush and Scraper Bbq Brush for Grill, Safe 18" Stainless Steel Woven Wire 3 in 1 Bristles Grill Cleaning Brush, Br-4516"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>GRILLART</div>                                        <div class="featured__title">Grillart Grill Brush and Scraper </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="8d543a4c-33bb-4f8a-ada1-65c348720570">            <a href="https://www.amazon.com/dp/B0D87SH9ZB" data-model-name="Shizzo Rolling Grill Basket" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/P6R7sxyAzpNBQihcS5KVGN.jpg" alt="SHIZZO, Shizzo Rolling Grill Basket, Removable Wooden Handle, Extra Sturdy Cylinder Grilling Basket, Food Grade Stainless Steel, Portable Outdoor Camping Accessories Bbq Net Rack, Cooking Griller for Fish, Vegetables, and More - Gifts for Men Dad Husband - Set of 2"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>SHIZZO</div>                                        <div class="featured__title">Shizzo Rolling Grill Basket</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d7a3896c-2366-407a-ae78-7966b665a193">            <a href="https://www.amazon.com/dp/B09BHJWV2Q" data-model-name="Hulisen Smashed Burger Kit: Press, Grill Spatula and Spice Shaker " data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/47nUg4GaheZzagXiSn33YW.jpg" alt="HULISEN, Hulisen Smashed Burger Kit, Stainless Steel Burger Press, Grill Spatula and Spice Dredge Shaker - Burger Smasher Griddle Accessories Kit for Flat Top Griddle Grill Cooking, Gift Package"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>HULISEN</div>                                        <div class="featured__title">Hulisen Smashed Burger Kit: Press, Grill Spatula and Spice Shaker </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="cb0817e2-fe06-4bc9-b8e8-c326162f1b01">            <a href="https://www.amazon.com/Scrub-Daddy-Grill-Brush-BBQ/dp/B09SVK9YBB" data-model-name="Scrub Daddy Bbq Daddy Grill Brush " data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/Cn36GCk3nKtxMmRggkiozL.jpg" alt="Scrub Daddy, Scrub Daddy Bbq Daddy Grill Brush for Outdoor Grill - Bristle Free Grill Brush With Steel Grill Scraper + Scrub Brush - Temperature Controlled Scrubbing Power for Grill Cleaning (1 Count)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Scrub Daddy</div>                                        <div class="featured__title">Scrub Daddy Bbq Daddy Grill Brush </div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="0d08f11c-d651-457c-ab7a-0a55f478c16d">            <a href="https://www.amazon.com/gp/aw/d/B0DNMTK56N" data-model-name="Thermomaven Digital Meat Thermometer" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/hgDfjtprY8EmAFVsjDoHMG.jpg" alt="ThermoMaven, Thermomaven Professional Meat Thermometer Digital, Ultra-Fast 0.5 Sec Instant Read, Nist Certified ±0.5°f Accuracy, Ip67 Waterproof, Auto-Rotating Backlit Display, Lift-To-Wake, for Bbq/cooking/candy"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>ThermoMaven</div>                                        <div class="featured__title">Thermomaven Digital Meat Thermometer</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="01cbeb4e-2e76-4523-9179-b1213c11fc21">            <a href="https://www.amazon.com/Kaluns-Stainless-Luxurious-barbequing-Professional/dp/B079J4KT8H" data-model-name="Kaluns Grilling Accessories" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/XdGiRZYHSx2nmPMZz3UAeK.jpg" alt="Kaluns, Kaluns Grilling Accessories, Dad Gifts for Fathers Day, Grilling Gifts, Heavy Duty Stainless Steel Bbq Tool Set for Outdoor Grill With Aluminum Case and Apron, Birthday Gifts for Men Women"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Kaluns</div>                                        <div class="featured__title">Kaluns Grilling Accessories</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="eaea6b5d-db09-4bca-875c-69bc16f3429d">            <a href="https://www.amazon.com/Cutluxe-Slicing-Carving-Knife-Ergonomic/dp/B07VLW8677/" data-model-name="Cutluxe 12-Inch Brisket Knife" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:125.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/PEvigrLJjynDcXqgudWkuY.jpg" alt="Cutluxe Brisket Knife – 12" Carving & Slicing Knife for Meat & Bbq – Razor Sharp German Steel, Sheath Included, Ergonomic Full Tang Handle Design, Grilling Gifts for Men – Artisan Series"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Cutluxe</div>                                        <div class="featured__title">Cutluxe 12-Inch Brisket Knife</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="67d03b93-6e19-4462-b915-8c6e6536dad9">            <a href="https://www.amazon.com/GRILLART-BBQ-Tools-Grill-Set/dp/B09GB5YCHH" data-model-name="Grillart BBQ Grill Tools Set" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/PCbGug4oV6uEb59S37yfL5.jpg" alt="GRILLART, Grillart Bbq Tools Grill Tools Set -18inch Grilling Tools Bbq Set - Grill Accessories W/bbq Tongs, Spatula, Fork, Brush- Stainless Grill Kit Grilling Set - Gift Ideas Bbq Accessories Gifts for Men Dad"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>GRILLART</div>                                        <div class="featured__title">Grillart BBQ Grill Tools Set</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div><h2 id="home-appliances">HOME APPLIANCES</h2><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-home-appliance-deals"><span>We're tracking all the best Prime Day home appliance deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Home+Appliances&price=50_&min_discount_ratio=0.95&offer_type=all&rows=4&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.&show_countdown=true&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-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');                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')}`                });              }            });          }        }        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 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');            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[ 3 new to Prime Video thriller movies to stream this week — one of them is a classic masterpiece ranked among the best films ever made (June 23-29) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’m always on the hunt for thriller movies across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, including Prime Video. I consider the genre a personal favorite, and it’s clear I’m not alone in my love of any movie packed with action, suspense, excitement, tension, and maybe a good twist or two. </p><p>Prime Video clearly understands that many of its subscribers demand good thriller movies, so it regularly adds new options to its content library. Case in point, the <a href="https://www.youtube.com/watch?v=TEN-2uTi2c0">Prime Video June 2026 slate</a> is packed with thrillers. To save you the hassle of browsing the dozens of recent arrivals yourself, I’ve combed through the slate and found three thrillers to watch this week.</p><p>My latest picks include movies fronted by two of the genre’s most popular stars, Liam Neeson and Gerard Butler, as well as a certified Hollywood classic. The latter may be more of a legal drama, but I guarantee you’ll find it engrossing and deeply compelling. These are the three new to Prime Video thriller movies to add to your streaming watchlist this week.</p><div class="product"><a data-dimension112="58e2e683-44e5-4db7-9bf2-adc4aa644831" data-action="Deal Block" data-label="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension48="Prime Video add-on subscriptions: deals from $1/month @ Amazon" href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ndGtwi34pjSnVsVuuKMjEV" name="prime-video-logo-2025" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ndGtwi34pjSnVsVuuKMjEV.png" mos="" align="middle" fullscreen="" width="2048" height="2048" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Prime Video add-on subscriptions: </strong><a href="https://www.amazon.com/gp/video/addons" target="_blank" rel="nofollow" data-dimension112="58e2e683-44e5-4db7-9bf2-adc4aa644831" data-action="Deal Block" data-label="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension48="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension25=""><strong>deals from $1/month @ Amazon</strong></a> <br>Prime Day streaming deals<a href="https://www.tomsguide.com/entertainment/prime-video/i-found-the-3-prime-video-black-friday-deals-worth-your-hard-earned-cash"> </a>are officially live, letting you stream more but spend less. Whether you’re looking to bundle multiple channels or grab a standalone add-on subscription, there’s something for everyone, including Starz, Apple TV and MGM+. With over 20 options available, you can enjoy blockbuster movies, hit shows, and exclusive content for a fraction of the usual price. <a class="view-deal button" href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow" data-dimension112="58e2e683-44e5-4db7-9bf2-adc4aa644831" data-action="Deal Block" data-label="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension48="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension25="">View Deal</a></p></div><h2 id="12-angry-men-1957">‘12 Angry Men’ (1957)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/TEN-2uTi2c0" allowfullscreen></iframe></div></div><p>I’m slightly stretching the definition of a thriller to include this one, but then again, “12 Angry Men” is just as electrifying and compelling as anything else I’ve watched in the thriller genre. It’s a masterclass in screenwriting, with one of cinema’s greatest-ever scripts. It’s no slouch in other crucial departments either. Sidney Lumet’s legal drama is regularly cited as one of the best and most influential movies ever made, and it deserves every ounce of adulation it's received over the decades. </p><p>Set in the sweltering heat of a New York City courthouse during the sticky summer season, 12 jurors convene to determine the guilt of a young boy accused of murdering his father. The men might not be the ones on trial, but as their discussion unfolds, each one’s character is thoroughly examined. Initially, 11 of the jurors believe the boy is guilty without question, and it’s up to Henry Fonda’s Juror No. 8 to present the alternative case.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0BRHJCCH2" target="_blank" rel="nofollow"><em><strong>"12 Angry Men" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="a-walk-among-the-tombstones-2014">'A Walk Among the Tombstones' (2014)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aTKBowDjMQg" allowfullscreen></iframe></div></div><p>Liam Neeson-fronted action-thrillers are a comfort watch to me. Yes, it’s a little odd to consider movies filled with violence, criminals, and usually a gruff protagonist comforting, but Neeson had made a name for himself in the genre by bringing predictable (but usually enjoyable) thrills to the table. In fact, “A Walk Among the Tombstones” is one of Neeson’s better action-thrillers, giving Neeson a role with a little more meat on the bone. </p><p>Matt Scudder (Neeson) is a retired NYPD detective, now working as a private investigator. When he’s approached by a wealthy drug dealer (Dan Stevens), he’s hired for a complex case. The dealer’s wife was kidnapped, and despite the requested ransom being paid, she was still brutally murdered. He wants her killers found and brought to justice. As Scudder investigates the grisly killing, he sinks into New York’s criminal underworld, soon encountering Ray (David Harbour), a sadistic criminal.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Walk-Among-Tombstones-Liam-Neeson/dp/B00QHMEDLC" target="_blank" rel="nofollow"><em><strong>"A Walk Among the Tombstones" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eM76lO"></div>                            </div>                            <script src="https://kwizly.com/embed/eM76lO.js" async></script><h2 id="plane-2023">‘Plane’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/M25zXBIUVr0" allowfullscreen></iframe></div></div><p>“Plane” is a no-nonsense thriller that leans into its own predictability. Even the movie’s title is extremely matter-of-fact, and I appreciate it when a film has a self-aware streak. This 2023 action-thriller doesn’t have genre reinvention on its agenda and instead aims to please with Gerard Butler playing a suitably kick-butt action hero and Mike Colter offering strong support. I’m just disappointed the sequel, tentatively titled “Boat,” got canned just a couple of weeks before production was due to begin.</p><p>In “Plane,” Butler plays Brodie Torrance, a pilot forced into an emergency landing when lightning threatens the safety of his plane and passengers. The snag is that the aircraft has touched down in a war-torn region, and the survivors are immediately taken hostage. Torrance has no choice but to team up with an accused murderer, Louis Gaspare (Colter), who was on the airplane in FBI custody. They’re an unlikely team, ready to save the day.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FP45BB2L" target="_blank" rel="nofollow"><em><strong>"Plane" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month#section-new-movies-on-prime-video-in-june-2026">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/live/news/prime-day-streaming-deals-and-sales-live-2026">Best Prime Day streaming deals 2026 live</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-june-22-28">Prime Video top 10 movies — here’s the 3 worth watching</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-one-of-them-is-a-classic-masterpiece-ranked-among-the-best-films-ever-made-june-23-29</link>
                                                                            <description>
                            <![CDATA[ I've scoured Prime Video's new arrivals to find a trio of thrillers worth watching this week, including a neo-noir mystery with Liam Neeson. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">oY7khmBMw9BwnvRCSZQSvS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 12:45:26 +0000</pubDate>                                                                                                                                <updated>Tue, 23 Jun 2026 18:49:46 +0000</updated>
                                                                                                                                            <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo ]]></media:description>                                                            <media:text><![CDATA[Prime Video logo ]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’m always on the hunt for thriller movies across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, including Prime Video. I consider the genre a personal favorite, and it’s clear I’m not alone in my love of any movie packed with action, suspense, excitement, tension, and maybe a good twist or two. </p><p>Prime Video clearly understands that many of its subscribers demand good thriller movies, so it regularly adds new options to its content library. Case in point, the <a href="https://www.youtube.com/watch?v=TEN-2uTi2c0">Prime Video June 2026 slate</a> is packed with thrillers. To save you the hassle of browsing the dozens of recent arrivals yourself, I’ve combed through the slate and found three thrillers to watch this week.</p><p>My latest picks include movies fronted by two of the genre’s most popular stars, Liam Neeson and Gerard Butler, as well as a certified Hollywood classic. The latter may be more of a legal drama, but I guarantee you’ll find it engrossing and deeply compelling. These are the three new to Prime Video thriller movies to add to your streaming watchlist this week.</p><div class="product"><a data-dimension112="58e2e683-44e5-4db7-9bf2-adc4aa644831" data-action="Deal Block" data-label="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension48="Prime Video add-on subscriptions: deals from $1/month @ Amazon" href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ndGtwi34pjSnVsVuuKMjEV" name="prime-video-logo-2025" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ndGtwi34pjSnVsVuuKMjEV.png" mos="" align="middle" fullscreen="" width="2048" height="2048" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Prime Video add-on subscriptions: </strong><a href="https://www.amazon.com/gp/video/addons" target="_blank" rel="nofollow" data-dimension112="58e2e683-44e5-4db7-9bf2-adc4aa644831" data-action="Deal Block" data-label="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension48="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension25=""><strong>deals from $1/month @ Amazon</strong></a> <br>Prime Day streaming deals<a href="https://www.tomsguide.com/entertainment/prime-video/i-found-the-3-prime-video-black-friday-deals-worth-your-hard-earned-cash"> </a>are officially live, letting you stream more but spend less. Whether you’re looking to bundle multiple channels or grab a standalone add-on subscription, there’s something for everyone, including Starz, Apple TV and MGM+. With over 20 options available, you can enjoy blockbuster movies, hit shows, and exclusive content for a fraction of the usual price. <a class="view-deal button" href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow" data-dimension112="58e2e683-44e5-4db7-9bf2-adc4aa644831" data-action="Deal Block" data-label="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension48="Prime Video add-on subscriptions: deals from $1/month @ Amazon" data-dimension25="">View Deal</a></p></div><h2 id="12-angry-men-1957">‘12 Angry Men’ (1957)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/TEN-2uTi2c0" allowfullscreen></iframe></div></div><p>I’m slightly stretching the definition of a thriller to include this one, but then again, “12 Angry Men” is just as electrifying and compelling as anything else I’ve watched in the thriller genre. It’s a masterclass in screenwriting, with one of cinema’s greatest-ever scripts. It’s no slouch in other crucial departments either. Sidney Lumet’s legal drama is regularly cited as one of the best and most influential movies ever made, and it deserves every ounce of adulation it's received over the decades. </p><p>Set in the sweltering heat of a New York City courthouse during the sticky summer season, 12 jurors convene to determine the guilt of a young boy accused of murdering his father. The men might not be the ones on trial, but as their discussion unfolds, each one’s character is thoroughly examined. Initially, 11 of the jurors believe the boy is guilty without question, and it’s up to Henry Fonda’s Juror No. 8 to present the alternative case.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0BRHJCCH2" target="_blank" rel="nofollow"><em><strong>"12 Angry Men" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="a-walk-among-the-tombstones-2014">'A Walk Among the Tombstones' (2014)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aTKBowDjMQg" allowfullscreen></iframe></div></div><p>Liam Neeson-fronted action-thrillers are a comfort watch to me. Yes, it’s a little odd to consider movies filled with violence, criminals, and usually a gruff protagonist comforting, but Neeson had made a name for himself in the genre by bringing predictable (but usually enjoyable) thrills to the table. In fact, “A Walk Among the Tombstones” is one of Neeson’s better action-thrillers, giving Neeson a role with a little more meat on the bone. </p><p>Matt Scudder (Neeson) is a retired NYPD detective, now working as a private investigator. When he’s approached by a wealthy drug dealer (Dan Stevens), he’s hired for a complex case. The dealer’s wife was kidnapped, and despite the requested ransom being paid, she was still brutally murdered. He wants her killers found and brought to justice. As Scudder investigates the grisly killing, he sinks into New York’s criminal underworld, soon encountering Ray (David Harbour), a sadistic criminal.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Walk-Among-Tombstones-Liam-Neeson/dp/B00QHMEDLC" target="_blank" rel="nofollow"><em><strong>"A Walk Among the Tombstones" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eM76lO"></div>                            </div>                            <script src="https://kwizly.com/embed/eM76lO.js" async></script><h2 id="plane-2023">‘Plane’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/M25zXBIUVr0" allowfullscreen></iframe></div></div><p>“Plane” is a no-nonsense thriller that leans into its own predictability. Even the movie’s title is extremely matter-of-fact, and I appreciate it when a film has a self-aware streak. This 2023 action-thriller doesn’t have genre reinvention on its agenda and instead aims to please with Gerard Butler playing a suitably kick-butt action hero and Mike Colter offering strong support. I’m just disappointed the sequel, tentatively titled “Boat,” got canned just a couple of weeks before production was due to begin.</p><p>In “Plane,” Butler plays Brodie Torrance, a pilot forced into an emergency landing when lightning threatens the safety of his plane and passengers. The snag is that the aircraft has touched down in a war-torn region, and the survivors are immediately taken hostage. Torrance has no choice but to team up with an accused murderer, Louis Gaspare (Colter), who was on the airplane in FBI custody. They’re an unlikely team, ready to save the day.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FP45BB2L" target="_blank" rel="nofollow"><em><strong>"Plane" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month#section-new-movies-on-prime-video-in-june-2026">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/live/news/prime-day-streaming-deals-and-sales-live-2026">Best Prime Day streaming deals 2026 live</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-june-22-28">Prime Video top 10 movies — here’s the 3 worth watching</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I asked ChatGPT to help me score big on Prime Day — these 5 money-saving tips are better than I expected ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Amazon Prime Day prep has become an annual tradition for me.</p><p>Every year, I spend the weekend before the big sale scouting early discounts and building a wish list of items I hope to snag at the lowest possible prices. Over the years, Prime Day has helped me amass a sizable collection of video games, anime Blu-rays and Marvel and DC graphic novels — and this year is no different.</p><p>But this time, I decided to bring ChatGPT along for the hunt.</p><p>With AI tools becoming increasingly useful for shopping and research, I wanted to see whether ChatGPT could uncover deals I might have overlooked or point me toward products I didn't even know were on sale.</p><p>The results surprised me. Not only did the chatbot offer practical strategies for finding the best Prime Day bargains, but it also surfaced several deeply discounted items that made their way into my shopping cart almost immediately.</p><h2 id="prepping-for-prime-day-sales-with-this-essential-advice">Prepping for Prime Day sales with this essential advice</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zVXmup3WZAZQTPVh9GeTK7" name="Prime Day 2026" alt="Prime Day 2026 ad" src="https://cdn.mos.cms.futurecdn.net/zVXmup3WZAZQTPVh9GeTK7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p>To get this money-saving mission underway, I presented this prompt to ChatGPT to see how it could assist me:</p><p>“I'm into video games, anime on Blu-ray, and graphic novels from Marvel Comics & DC Comics. What are the best ways to prepare for Amazon Prime Day and find the best sales for those types of items during that sale period?”</p><p>The chatbot initially responded with a piece of advice that set me up nicely: <em>For the categories you're interested in—video games, anime Blu-rays, and Marvel/DC graphic novels—Prime Day rewards preparation more than impulse buying. The biggest savings often go to people who build watchlists weeks in advance and know the "normal" prices before the sale starts.</em></p><p>After taking note of its suggestion to build a watchlist of all the items I’m looking to buy before and during Amazon Prime Day, I also jotted down ChatGPT’s five tips on how to locate the best prices imaginable:</p><ul><li><strong>Track Historical Prices: </strong><em>One of the biggest Prime Day mistakes is assuming every "deal" is actually a deal. Use sites/tools like camelcamelcamel and Keepa. These tools show Amazon price history.</em></li><li><strong>Follow Deal Communities: </strong><em>Prime Day moves fast, and some of the best deals disappear within minutes. Stay updated on them by following sources such as Wario64 on X, Cheap A** Gamer, Slickdeals and IGN Deals. For your interests specifically, these sources are often faster than Amazon's own deal pages.</em></li><li><strong>Set a Budget by Category: </strong><em>A collector's trap is buying too many "good deals." Try something like a $150 budget for video games, a $100 budget for anime Blu-rays, and an $80 budget for graphic novels, for example. Then rank your purchases for each category under must-have, nice-to-have and only-if-heavily-discounted. This prevents regret purchases.</em></li><li><strong>Focus on the First 12 Hours: </strong><em>The strongest deals are often midnight launch deals, Lightning Deals and limited inventory offers. If there's a specific omnibus, collector's edition or anime box set you've been waiting for, check as soon as Prime Day starts.</em></li><li><strong>Set Up Prime Day Alerts Through Alexa:</strong><em><strong> </strong></em><em>Alexa can notify you about discounts on items in your Wish List, Cart or Buy Later collection up to 24 hours in advance or track target prices for specific products. Open the Alexa app, go to More, select Settings, tap on Notifications, proceed to Amazon Shopping and turn on Deal Recommendations.</em></li></ul><h2 id="putting-those-tips-into-action">Putting those tips into action</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cnCyefvhMdEkyVQQttapdM" name="Prime Day deals" alt="Smartphone displaying Prime Day on its screen with $100 dollar bills as the backdrop" src="https://cdn.mos.cms.futurecdn.net/cnCyefvhMdEkyVQQttapdM.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>With all of those money-saving tips in the back of my mind, my search for the best Amazon Prime Day sales I could find became a much more streamlined process. Plus, I came upon a bunch of amazing deals that went live before the Amazon Prime Day madness officially kicked in:</p><ul><li><strong>Borderlands 4 - PS5: </strong><a href="https://www.amazon.com/Borderlands-4-PlayStation-5/dp/B0FDBL8L41/ref=sr_1_1?crid=2U5DYAQLRFVTI&dib=eyJ2IjoiMSJ9.xL7GGcMGJfKE784YOTdwtq-2BF4oXgNVriZ6lb79Qp4urCQbxB3QP1PBNUXeQ6EV6xuuwg9RLWkzlXWtp5LW9uHHUIVFTwjTFwmfiqrBwM-hl6cZYQsnw7zt4HPThDflruzfdO52TzT7ZQDqUGmuSAVQCp_J9kH2MI4_kyEht-xVuTPD4x2i5NzOiX8X8VJr_Il383mT5LvaA5H0PNbQazoP1bom0BCRWfyIIsI6lAo.birlPKUKaEctabctKHyQcdY17j1eSpdvmRitWmbmTrk&dib_tag=se&keywords=borderlands%2B4%2Bxbox%2Bseries%2Bx&qid=1782152292&sprefix=borderlands%2B4%2Bxbox%2Caps%2C131&sr=8-1&th=1" target="_blank" rel="nofollow">was $49.99 now $34.99</a></li><li><strong>Cyberpunk 2077: Ultimate Edition - Nintendo Switch 2: </strong><a href="https://www.amazon.com/Cyberpunk-2077-Nintendo-Switch-2/dp/B0F64Q8C97/ref=sr_1_1?crid=2BV7BPXGOTV6&dib=eyJ2IjoiMSJ9.AyV7ji6BuhWYp6ObHXbI8vmSmWkhg5GmqB7Lgu4hgy8Ma7R-C_4QTdoj1nvcTwwBskG4_Hjr5GruMGufg_s7DdOZid4fi55wmdPE52T3H2RC__R_1wTCxIaLHdLrVQVAD-JGO038l8bxCbjaw7jxy-K6QxBvNMDjGplg2RbZ8Q6eUqjJk1eT66oKHR5XxZlEFO5ZAh4Ms0Lb9Qs7GYGbWqS4Nj8QGLf67Dcx1WUPd-0.6g0GnTR3rmXe87thxnUXd4zMKb4zbYnIhc96N2cIEwY&dib_tag=se&keywords=cyberpunk%2B2077%2Bswitch%2B2&qid=1782152381&sprefix=cyberpunk%2B2077%2Caps%2C132&sr=8-1&th=1" target="_blank" rel="nofollow">was $69.99 now $57.99</a></li><li><strong>Akira - 4K & Blu-ray [4K UHD]: </strong><a href="https://www.amazon.com/Akira-Movie-4K-UHD/dp/B09JXWP8N1/ref=sr_1_1?crid=1ST3TR27THSG9&dib=eyJ2IjoiMSJ9.nfCSjcRtAJfhMeZpBGGrf9BCbZaqdHTLVUq0qLT-_BSOShYURIKZ6VZVNp0C8utVL3TrDU7onWVFAZrUXUORp3pepMQQgDK-o0BpytmHkUqpEhqRfApnxGLv5SJBfQLVxHSlwgWO5OcV3mBxaLwdIY8GRlzjdtrj4YK8k4DhvJkX1pzqj2fJv8Xs-rKoBWHt_49M77UMFR_MQw2XdI6zZpuZRhwUBfjlLypsQf4VwjQ.n38LspVgED7RNjahB3WQiaZ5O32Apz6e8RBJNKs0bZs&dib_tag=se&keywords=akira+4k&qid=1782143562&sprefix=akira%2Caps%2C124&sr=8-1" target="_blank" rel="nofollow">was $29.98 now $11.99</a></li><li><strong>Bayonetta [Blu-ray & DVD]: </strong><a href="https://www.amazon.com/Bayonetta-Bloody-Anime-Movie-Blu-ray/dp/B00LXGL7EI/ref=sr_1_1?crid=HGT04EGDGXS7&dib=eyJ2IjoiMSJ9.1qh0EDqYEHvdF2PwMb2QuEaaxjWgfF1cwxnBNhAhy_3ChJsemo2fXZSEa2kxBc-H-iXi2RVr0ubD8YnmXiJ7Wg.XQbgs_Pky5cr0bp5nMks8XVFkWFkIyJoXWmTM-TtA9M&dib_tag=se&keywords=bayonetta+blu+ray&qid=1782152096&sprefix=%2Caps%2C93&sr=8-1" target="_blank" rel="nofollow">was $19.98 now $12.82</a></li><li><strong>Samurai 7: The Complete Series [Blu-ray]: </strong><a href="https://www.amazon.com/Samurai-Complete-Blu-ray-Colleen-Clinkenbeard/dp/B07KLFLYHM/ref=sr_1_1?crid=2TJXDMABF5UTS&dib=eyJ2IjoiMSJ9.nqalIS7-3HeH4Nov8Z-xKRjzpWkTTzYqLy631mECvSBTYuXNl99gF2BI0cicxuUWnUqk5Yw5NJPIO3_BcJ9lvO83LbRVnVkDIi-764YWvCMzCE3ENVqLs28NNkkK3KCeZ8r6znQRMJ-HlbuSKvO-4TFJTr86aSAgFmiiB5oKTAGtmTaNQ4pwm4jQhd_84x_IKvMpbcxZ8LJuP-JGAMCgNua8-l1ALgcVuM6PDPScUvQ.JNey3ibKztwngE7Aitqv4KQk4JdvYhUSEjODcNPdhfw&dib_tag=se&keywords=samurai+7+complete+series&qid=1782152171&sprefix=samurai+7+the+c%2Caps%2C128&sr=8-1" target="_blank" rel="nofollow">was $49.98 now $34.99</a></li><li><strong>Daredevil: Born Again [Marvel Premier Collection]: </strong><a href="https://www.amazon.com/Daredevil-Again-Marvel-Premier-Collection/dp/1302965980/ref=sr_1_1?crid=3GXSUQWA8ND72&dib=eyJ2IjoiMSJ9.ee0FPTGjFEJ3Xyx-mGj6B-xWrDbYdnLzXxm4qYYFPbWs_s5MNDsdURg_2p7Wz3wCq3-UWbGDbLYuE4OxgJkXNwr2vvK97-5z3asT2xb5jfdlW7nzVvTdLXv5ek2SmmCen_xu3WcDgjKup0zZgwkpMyuYUVZWowqLqc7BHg0oCLAwLX32zRyv9Sg2VcmdEvTKwAgG2ultWx3R6xW-jd89UwkNpLe-KcjYf12D2zlH2sA.ksb0PWDUZBIOc325h2AzycZkFf9OtvLzamDEXlAML3I&dib_tag=se&keywords=daredevil+born+again+marvel+premier+collection&qid=1782152477&sprefix=daredevil+born+again+marvel+pr%2Caps%2C140&sr=8-1" target="_blank" rel="nofollow">was $14.99 now $11.27</a><strong> </strong>(with Amazon Prime)</li><li><strong>Wolverine: Old Man Logan [Marvel Premier Collection]: </strong><a href="https://www.amazon.com/Wolverine-Logan-Marvel-Premier-Collection/dp/1302965581/ref=sr_1_1?crid=398PJ7O9Y2Q38&dib=eyJ2IjoiMSJ9.AeMXqtqAxZQNqDeGIhaKeWE-CMZVcJE97kmh_PfVWyw4x9KVBcyFah1KWO2MVpgtZ4JQvfqhks9cHFyT-zmjMzzXsdpoIsP9aa9N8n8YMUAA0L8_ec6YC64wWZU7VXFSkfjs6MrrQBgvlTqTYsXHnUf47rzWH6qvtGE0CiiwbQxFxryXfHGelDeSKdnBzStt2ePuVHRUqzdcpxZhonuLiqGs6rFNGyEdqvUXHGICPsM.N40GQ9dkmAr8T0ZkElHJ3rLrn73q-5pHe5eSEMoJW_A&dib_tag=se&keywords=wolverine+old+man+logan+marvel+premier+collection&qid=1782152559&sprefix=wolverine+old+man+logan+marvel+premier+collection%2Caps%2C109&sr=8-1" target="_blank" rel="nofollow">was $14.99 now $12.82</a><strong> </strong>(with Amazon Prime)</li></ul><h2 id="the-takeaway-2">The takeaway</h2><p>Patience isn’t one of my best traits—the act of impulse buying has a hold over me that’s just too hard to ignore. </p><p>But for this year’s Amazon Prime Day routine, I didn’t rush to buy everything I saw for sale, kept ChatGPT’s money-saving advice close to mind and followed every step it laid out to discover the best deals imaginable. </p><p>That plan worked to perfection and made two video games, three anime Blu-rays and graphic novels a part of my growing collection of physical goods I’ll be cherishing forever.</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/that-viral-jeff-bezos-quote-about-ai-and-water-isnt-real-heres-what-actually-happened" target="_blank">That viral Jeff Bezos quote about AI and water isn't real — here's what actually happened</a></li><li><a href="https://www.tomsguide.com/ai/tiktoks-ai-slop-problem-is-spiraling-out-of-control-and-kids-are-getting-the-worst-of-it" target="_blank">TikTok’s AI slop problem is spiraling out of control — and kids are getting the worst of it</a></li><li><a href="https://www.tomsguide.com/ai/i-used-chatgpt-to-discover-my-hidden-strengths-and-it-changed-my-perspective-on-work" target="_blank">I used ChatGPT to discover my hidden strengths — and it changed my perspective on work</a></li></ul><div data-widget-type="comparison" data-model-name="Samsung Galaxy S26" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-asked-chatgpt-to-help-me-score-big-on-prime-day-these-5-money-saving-tips-are-better-than-i-expected</link>
                                                                            <description>
                            <![CDATA[ I asked ChatGPT to help me discover the best ways to find the best Prime Day deals — and it gave me a bunch of useful money-saving tips. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3CrBQDnoCzQSEiWQvCzgra</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CazrfECG9STYnXWWdabvjd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM.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/CazrfECG9STYnXWWdabvjd-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon Prime Day stock image]]></media:description>                                                            <media:text><![CDATA[Amazon Prime Day stock image]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon Prime Day stock image]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CazrfECG9STYnXWWdabvjd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon Prime Day prep has become an annual tradition for me.</p><p>Every year, I spend the weekend before the big sale scouting early discounts and building a wish list of items I hope to snag at the lowest possible prices. Over the years, Prime Day has helped me amass a sizable collection of video games, anime Blu-rays and Marvel and DC graphic novels — and this year is no different.</p><p>But this time, I decided to bring ChatGPT along for the hunt.</p><p>With AI tools becoming increasingly useful for shopping and research, I wanted to see whether ChatGPT could uncover deals I might have overlooked or point me toward products I didn't even know were on sale.</p><p>The results surprised me. Not only did the chatbot offer practical strategies for finding the best Prime Day bargains, but it also surfaced several deeply discounted items that made their way into my shopping cart almost immediately.</p><h2 id="prepping-for-prime-day-sales-with-this-essential-advice">Prepping for Prime Day sales with this essential advice</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zVXmup3WZAZQTPVh9GeTK7" name="Prime Day 2026" alt="Prime Day 2026 ad" src="https://cdn.mos.cms.futurecdn.net/zVXmup3WZAZQTPVh9GeTK7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p>To get this money-saving mission underway, I presented this prompt to ChatGPT to see how it could assist me:</p><p>“I'm into video games, anime on Blu-ray, and graphic novels from Marvel Comics & DC Comics. What are the best ways to prepare for Amazon Prime Day and find the best sales for those types of items during that sale period?”</p><p>The chatbot initially responded with a piece of advice that set me up nicely: <em>For the categories you're interested in—video games, anime Blu-rays, and Marvel/DC graphic novels—Prime Day rewards preparation more than impulse buying. The biggest savings often go to people who build watchlists weeks in advance and know the "normal" prices before the sale starts.</em></p><p>After taking note of its suggestion to build a watchlist of all the items I’m looking to buy before and during Amazon Prime Day, I also jotted down ChatGPT’s five tips on how to locate the best prices imaginable:</p><ul><li><strong>Track Historical Prices: </strong><em>One of the biggest Prime Day mistakes is assuming every "deal" is actually a deal. Use sites/tools like camelcamelcamel and Keepa. These tools show Amazon price history.</em></li><li><strong>Follow Deal Communities: </strong><em>Prime Day moves fast, and some of the best deals disappear within minutes. Stay updated on them by following sources such as Wario64 on X, Cheap A** Gamer, Slickdeals and IGN Deals. For your interests specifically, these sources are often faster than Amazon's own deal pages.</em></li><li><strong>Set a Budget by Category: </strong><em>A collector's trap is buying too many "good deals." Try something like a $150 budget for video games, a $100 budget for anime Blu-rays, and an $80 budget for graphic novels, for example. Then rank your purchases for each category under must-have, nice-to-have and only-if-heavily-discounted. This prevents regret purchases.</em></li><li><strong>Focus on the First 12 Hours: </strong><em>The strongest deals are often midnight launch deals, Lightning Deals and limited inventory offers. If there's a specific omnibus, collector's edition or anime box set you've been waiting for, check as soon as Prime Day starts.</em></li><li><strong>Set Up Prime Day Alerts Through Alexa:</strong><em><strong> </strong></em><em>Alexa can notify you about discounts on items in your Wish List, Cart or Buy Later collection up to 24 hours in advance or track target prices for specific products. Open the Alexa app, go to More, select Settings, tap on Notifications, proceed to Amazon Shopping and turn on Deal Recommendations.</em></li></ul><h2 id="putting-those-tips-into-action">Putting those tips into action</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cnCyefvhMdEkyVQQttapdM" name="Prime Day deals" alt="Smartphone displaying Prime Day on its screen with $100 dollar bills as the backdrop" src="https://cdn.mos.cms.futurecdn.net/cnCyefvhMdEkyVQQttapdM.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>With all of those money-saving tips in the back of my mind, my search for the best Amazon Prime Day sales I could find became a much more streamlined process. Plus, I came upon a bunch of amazing deals that went live before the Amazon Prime Day madness officially kicked in:</p><ul><li><strong>Borderlands 4 - PS5: </strong><a href="https://www.amazon.com/Borderlands-4-PlayStation-5/dp/B0FDBL8L41/ref=sr_1_1?crid=2U5DYAQLRFVTI&dib=eyJ2IjoiMSJ9.xL7GGcMGJfKE784YOTdwtq-2BF4oXgNVriZ6lb79Qp4urCQbxB3QP1PBNUXeQ6EV6xuuwg9RLWkzlXWtp5LW9uHHUIVFTwjTFwmfiqrBwM-hl6cZYQsnw7zt4HPThDflruzfdO52TzT7ZQDqUGmuSAVQCp_J9kH2MI4_kyEht-xVuTPD4x2i5NzOiX8X8VJr_Il383mT5LvaA5H0PNbQazoP1bom0BCRWfyIIsI6lAo.birlPKUKaEctabctKHyQcdY17j1eSpdvmRitWmbmTrk&dib_tag=se&keywords=borderlands%2B4%2Bxbox%2Bseries%2Bx&qid=1782152292&sprefix=borderlands%2B4%2Bxbox%2Caps%2C131&sr=8-1&th=1" target="_blank" rel="nofollow">was $49.99 now $34.99</a></li><li><strong>Cyberpunk 2077: Ultimate Edition - Nintendo Switch 2: </strong><a href="https://www.amazon.com/Cyberpunk-2077-Nintendo-Switch-2/dp/B0F64Q8C97/ref=sr_1_1?crid=2BV7BPXGOTV6&dib=eyJ2IjoiMSJ9.AyV7ji6BuhWYp6ObHXbI8vmSmWkhg5GmqB7Lgu4hgy8Ma7R-C_4QTdoj1nvcTwwBskG4_Hjr5GruMGufg_s7DdOZid4fi55wmdPE52T3H2RC__R_1wTCxIaLHdLrVQVAD-JGO038l8bxCbjaw7jxy-K6QxBvNMDjGplg2RbZ8Q6eUqjJk1eT66oKHR5XxZlEFO5ZAh4Ms0Lb9Qs7GYGbWqS4Nj8QGLf67Dcx1WUPd-0.6g0GnTR3rmXe87thxnUXd4zMKb4zbYnIhc96N2cIEwY&dib_tag=se&keywords=cyberpunk%2B2077%2Bswitch%2B2&qid=1782152381&sprefix=cyberpunk%2B2077%2Caps%2C132&sr=8-1&th=1" target="_blank" rel="nofollow">was $69.99 now $57.99</a></li><li><strong>Akira - 4K & Blu-ray [4K UHD]: </strong><a href="https://www.amazon.com/Akira-Movie-4K-UHD/dp/B09JXWP8N1/ref=sr_1_1?crid=1ST3TR27THSG9&dib=eyJ2IjoiMSJ9.nfCSjcRtAJfhMeZpBGGrf9BCbZaqdHTLVUq0qLT-_BSOShYURIKZ6VZVNp0C8utVL3TrDU7onWVFAZrUXUORp3pepMQQgDK-o0BpytmHkUqpEhqRfApnxGLv5SJBfQLVxHSlwgWO5OcV3mBxaLwdIY8GRlzjdtrj4YK8k4DhvJkX1pzqj2fJv8Xs-rKoBWHt_49M77UMFR_MQw2XdI6zZpuZRhwUBfjlLypsQf4VwjQ.n38LspVgED7RNjahB3WQiaZ5O32Apz6e8RBJNKs0bZs&dib_tag=se&keywords=akira+4k&qid=1782143562&sprefix=akira%2Caps%2C124&sr=8-1" target="_blank" rel="nofollow">was $29.98 now $11.99</a></li><li><strong>Bayonetta [Blu-ray & DVD]: </strong><a href="https://www.amazon.com/Bayonetta-Bloody-Anime-Movie-Blu-ray/dp/B00LXGL7EI/ref=sr_1_1?crid=HGT04EGDGXS7&dib=eyJ2IjoiMSJ9.1qh0EDqYEHvdF2PwMb2QuEaaxjWgfF1cwxnBNhAhy_3ChJsemo2fXZSEa2kxBc-H-iXi2RVr0ubD8YnmXiJ7Wg.XQbgs_Pky5cr0bp5nMks8XVFkWFkIyJoXWmTM-TtA9M&dib_tag=se&keywords=bayonetta+blu+ray&qid=1782152096&sprefix=%2Caps%2C93&sr=8-1" target="_blank" rel="nofollow">was $19.98 now $12.82</a></li><li><strong>Samurai 7: The Complete Series [Blu-ray]: </strong><a href="https://www.amazon.com/Samurai-Complete-Blu-ray-Colleen-Clinkenbeard/dp/B07KLFLYHM/ref=sr_1_1?crid=2TJXDMABF5UTS&dib=eyJ2IjoiMSJ9.nqalIS7-3HeH4Nov8Z-xKRjzpWkTTzYqLy631mECvSBTYuXNl99gF2BI0cicxuUWnUqk5Yw5NJPIO3_BcJ9lvO83LbRVnVkDIi-764YWvCMzCE3ENVqLs28NNkkK3KCeZ8r6znQRMJ-HlbuSKvO-4TFJTr86aSAgFmiiB5oKTAGtmTaNQ4pwm4jQhd_84x_IKvMpbcxZ8LJuP-JGAMCgNua8-l1ALgcVuM6PDPScUvQ.JNey3ibKztwngE7Aitqv4KQk4JdvYhUSEjODcNPdhfw&dib_tag=se&keywords=samurai+7+complete+series&qid=1782152171&sprefix=samurai+7+the+c%2Caps%2C128&sr=8-1" target="_blank" rel="nofollow">was $49.98 now $34.99</a></li><li><strong>Daredevil: Born Again [Marvel Premier Collection]: </strong><a href="https://www.amazon.com/Daredevil-Again-Marvel-Premier-Collection/dp/1302965980/ref=sr_1_1?crid=3GXSUQWA8ND72&dib=eyJ2IjoiMSJ9.ee0FPTGjFEJ3Xyx-mGj6B-xWrDbYdnLzXxm4qYYFPbWs_s5MNDsdURg_2p7Wz3wCq3-UWbGDbLYuE4OxgJkXNwr2vvK97-5z3asT2xb5jfdlW7nzVvTdLXv5ek2SmmCen_xu3WcDgjKup0zZgwkpMyuYUVZWowqLqc7BHg0oCLAwLX32zRyv9Sg2VcmdEvTKwAgG2ultWx3R6xW-jd89UwkNpLe-KcjYf12D2zlH2sA.ksb0PWDUZBIOc325h2AzycZkFf9OtvLzamDEXlAML3I&dib_tag=se&keywords=daredevil+born+again+marvel+premier+collection&qid=1782152477&sprefix=daredevil+born+again+marvel+pr%2Caps%2C140&sr=8-1" target="_blank" rel="nofollow">was $14.99 now $11.27</a><strong> </strong>(with Amazon Prime)</li><li><strong>Wolverine: Old Man Logan [Marvel Premier Collection]: </strong><a href="https://www.amazon.com/Wolverine-Logan-Marvel-Premier-Collection/dp/1302965581/ref=sr_1_1?crid=398PJ7O9Y2Q38&dib=eyJ2IjoiMSJ9.AeMXqtqAxZQNqDeGIhaKeWE-CMZVcJE97kmh_PfVWyw4x9KVBcyFah1KWO2MVpgtZ4JQvfqhks9cHFyT-zmjMzzXsdpoIsP9aa9N8n8YMUAA0L8_ec6YC64wWZU7VXFSkfjs6MrrQBgvlTqTYsXHnUf47rzWH6qvtGE0CiiwbQxFxryXfHGelDeSKdnBzStt2ePuVHRUqzdcpxZhonuLiqGs6rFNGyEdqvUXHGICPsM.N40GQ9dkmAr8T0ZkElHJ3rLrn73q-5pHe5eSEMoJW_A&dib_tag=se&keywords=wolverine+old+man+logan+marvel+premier+collection&qid=1782152559&sprefix=wolverine+old+man+logan+marvel+premier+collection%2Caps%2C109&sr=8-1" target="_blank" rel="nofollow">was $14.99 now $12.82</a><strong> </strong>(with Amazon Prime)</li></ul><h2 id="the-takeaway-2">The takeaway</h2><p>Patience isn’t one of my best traits—the act of impulse buying has a hold over me that’s just too hard to ignore. </p><p>But for this year’s Amazon Prime Day routine, I didn’t rush to buy everything I saw for sale, kept ChatGPT’s money-saving advice close to mind and followed every step it laid out to discover the best deals imaginable. </p><p>That plan worked to perfection and made two video games, three anime Blu-rays and graphic novels a part of my growing collection of physical goods I’ll be cherishing forever.</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/that-viral-jeff-bezos-quote-about-ai-and-water-isnt-real-heres-what-actually-happened" target="_blank">That viral Jeff Bezos quote about AI and water isn't real — here's what actually happened</a></li><li><a href="https://www.tomsguide.com/ai/tiktoks-ai-slop-problem-is-spiraling-out-of-control-and-kids-are-getting-the-worst-of-it" target="_blank">TikTok’s AI slop problem is spiraling out of control — and kids are getting the worst of it</a></li><li><a href="https://www.tomsguide.com/ai/i-used-chatgpt-to-discover-my-hidden-strengths-and-it-changed-my-perspective-on-work" target="_blank">I used ChatGPT to discover my hidden strengths — and it changed my perspective on work</a></li></ul><div data-widget-type="comparison" data-model-name="Samsung Galaxy S26" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ That viral Jeff Bezos quote about AI and water isn't real — here's what actually happened ]]></title>
                                                                                                <dc:content><![CDATA[ <p>A viral quote attributed to Jeff Bezos has <a href="https://www.instagram.com/p/DZu8trmR89Y/?utm_source=ig_web_copy_link&igsh=NTc4MTIwNjQ2YQ==" target="_blank">been spreading across social media</a>, sparking outrage among people already worried about the environmental impact of artificial intelligence.</p><p>The quote claimed that water should be prioritized for AI systems over human needs and appeared to suggest that future AI infrastructure was more important than the people affected by it.</p><p>It was shocking, not to mention dystopian. And it was exactly the kind of thing critics fear tech billionaires might actually believe. But here's the kicker: <strong>Jeff Bezos never said it.</strong></p><p>A fact-check by <a href="https://www.thequint.com/news/webqoof/amazon-jeff-bezos-water-consumption-ai-human-needs-fact-check" target="_blank">The Quint</a> found that the viral quote was fabricated and does not appear in footage from Bezos' appearance at VivaTech 2026 in Paris. Despite that, the claim spread widely across social media.</p><h2 id="what-bezos-actually-said">What Bezos actually said</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ho_ZmwgvDdM" allowfullscreen></iframe></div></div><ul><li><strong>Blue Origin's long-term vision</strong> — Bezos focused heavily on his space company, discussing rockets, lunar missions, and plans for sustained human activity beyond Earth.</li><li><strong>A 'Moon-first' strategy</strong> — He described the Moon as the next major step for exploration and development before larger ambitions deeper into the solar system.</li><li><strong>Space-based industry</strong> — Bezos argued that heavy industry and polluting manufacturing could eventually be moved off Earth and into space.</li><li><strong>Protecting Earth</strong> — He described Earth as a unique "garden planet" and suggested that using space resources, including materials from asteroids, could help preserve the environment.</li><li><strong>Advanced computing and innovation</strong> — He discussed how breakthroughs in computing, manufacturing, and automation could enable future space development.</li><li><strong>Artificial General Intelligence (AGI)</strong> — Bezos referenced efforts to develop more capable AI systems that could accelerate scientific discovery, innovation, and manufacturing.</li><li><strong>AI and jobs</strong> — He acknowledged concerns about AI replacing workers but argued that technological revolutions historically create new kinds of jobs and opportunities rather than eliminating work entirely.</li><li><strong>Responsible AI development</strong> — Bezos said AI should be treated as a powerful tool, with efforts focused on preventing harmful uses while still allowing innovation to continue.</li></ul><p>The fake quote appears to have spread following comments Bezos made about artificial intelligence during VivaTech 2026. Yet,  <strong>No comments about prioritizing AI over humans was ever made.</strong> At no point in the session did Bezos say that water, energy, or other resources should be diverted from people to AI systems.</p><p>During the event, Bezos discussed AI's potential impact on the workforce and argued that artificial intelligence could ultimately <a href="https://www.tomsguide.com/ai/jeff-bezos-predicts-an-optimistic-future-where-ai-wont-lead-to-mass-unemployment-ai-is-going-to-create-a-labor-shortage">create labor shortages </a>rather than<a href="https://www.tomsguide.com/ai/microsoft-reveals-the-40-jobs-ai-is-most-likely-to-replace-and-40-that-are-safe-for-now"> widespread unemployment</a>. He also addressed concerns about the <a href="https://www.tomsguide.com/ai/i-kept-hearing-that-ai-data-centers-are-draining-towns-dry-so-i-looked-at-the-evidence">resources required to power AI systems, including water consumption</a>.</p><p>His actual comments centered on putting AI water usage into a broader context rather than arguing that AI should take priority over human needs. That's a <a href="https://www.tomsguide.com/ai/this-ai-data-center-will-be-bigger-than-2-000-walmarts-and-dump-23-atom-bombs-worth-of-energy-into-the-environment-every-day-and-locals-are-terrified">position some people may disagree with</a>. But it is very different from claiming that communities should sacrifice access to water so AI data centers can continue expanding. And then, somewhere between those two ideas, a fictional quote was born.</p><h2 id="why-people-believed-it">Why people believed it</h2><p>The most interesting part of this story is that many people immediately accepted the quote to be real. Because the fabricated statement tapped into a growing anxiety surrounding artificial intelligence and the massive infrastructure required to support it, people believed it. </p><p>Companies including Amazon, Google, Microsoft, Meta and OpenAI are <a href="https://www.tomsguide.com/ai/big-tech-is-pouring-usd650-billion-into-ai-and-its-about-to-affect-almost-everything-you-use">investing billions of dollars into new data centers</a>. Those facilities require enormous amounts of electricity and, in many cases, large quantities of water for cooling.</p><p>Communities across the United States and around the world have raised concerns about how these facilities could affect local resources. <a href="https://www.tomsguide.com/ai/erin-brockovich-just-launched-an-ai-data-center-map-and-it-highlights-a-growing-problem-tech-giants-are-avoiding">Environmental groups </a>have also questioned the long-term sustainability of AI's rapid expansion. Against that backdrop, a quote suggesting that a tech billionaire would prioritize AI over people didn't seem impossible to many readers. In other words, the misinformation succeeded because it fit an existing narrative.</p><h2 id="bottom-line-4">Bottom line </h2><p>False information often spreads fastest when it contains just enough truth to feel plausible. AI data centers really do consume water, and communities really are debating whether new facilities should be approved. And tech leaders really are making increasingly bold claims about the future of artificial intelligence. But we all know the dangers of misinformation.</p><p>When a fabricated quote combines realistic elements, it can become difficult to distinguish fact from fiction, especially when it appears in a screenshot that looks authentic.</p><p>Ironically, this story reveals less about Jeff Bezos than it does about public perception of the AI industry. Although the quote itself was fake, the concerns that made it believable are very real.</p><p>As AI infrastructure continues expanding and debates about energy, water, and environmental impact become more heated, stories like this will likely become more common.</p><p>At Tom's Guide, we'll continue separating fact from fiction, breaking down viral AI claims, and helping readers understand what's really happening behind the headlines.</p><a href="https://follow.it/articles-by-amanda-caswell-tom-s-guide?leanpub" class="button button--large button--primary">Follow Amanda Caswell and stay ahead of the AI curve</a><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-asked-gemini-what-was-slowing-down-my-windows-pc-heres-what-it-found">I asked Gemini what was slowing down my Windows PC — here’s what it found</a></li><li><a href="https://www.tomsguide.com/ai/what-is-google-zero-and-why-your-favorite-websites-are-panicking-about-ai">What is Google Zero — and why your favorite websites are panicking about AI</a></li><li><a href="https://www.tomsguide.com/ai/apple-is-ending-support-for-16-devices-heres-the-chatgpt-prompt-that-tells-you-what-to-do-next">Apple is ending support for 16 devices — here’s the ChatGPT prompt that tells you what to do next</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/that-viral-jeff-bezos-quote-about-ai-and-water-isnt-real-heres-what-actually-happened</link>
                                                                            <description>
                            <![CDATA[ A viral quote claimed Jeff Bezos said AI should get water before humans. He never said it — but the reason millions believed the fake quote reveals growing concerns about AI. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">BkjS85pZtTzqnYQCyZXsFf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KRk3NYY3SmDF6kKpkNdUm3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 22 Jun 2026 16:20:19 +0000</pubDate>                                                                                                                                <updated>Mon, 22 Jun 2026 18:37:58 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/KRk3NYY3SmDF6kKpkNdUm3-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Jeff Bezos ]]></media:description>                                                            <media:text><![CDATA[Jeff Bezos ]]></media:text>
                                <media:title type="plain"><![CDATA[Jeff Bezos ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KRk3NYY3SmDF6kKpkNdUm3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A viral quote attributed to Jeff Bezos has <a href="https://www.instagram.com/p/DZu8trmR89Y/?utm_source=ig_web_copy_link&igsh=NTc4MTIwNjQ2YQ==" target="_blank">been spreading across social media</a>, sparking outrage among people already worried about the environmental impact of artificial intelligence.</p><p>The quote claimed that water should be prioritized for AI systems over human needs and appeared to suggest that future AI infrastructure was more important than the people affected by it.</p><p>It was shocking, not to mention dystopian. And it was exactly the kind of thing critics fear tech billionaires might actually believe. But here's the kicker: <strong>Jeff Bezos never said it.</strong></p><p>A fact-check by <a href="https://www.thequint.com/news/webqoof/amazon-jeff-bezos-water-consumption-ai-human-needs-fact-check" target="_blank">The Quint</a> found that the viral quote was fabricated and does not appear in footage from Bezos' appearance at VivaTech 2026 in Paris. Despite that, the claim spread widely across social media.</p><h2 id="what-bezos-actually-said">What Bezos actually said</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ho_ZmwgvDdM" allowfullscreen></iframe></div></div><ul><li><strong>Blue Origin's long-term vision</strong> — Bezos focused heavily on his space company, discussing rockets, lunar missions, and plans for sustained human activity beyond Earth.</li><li><strong>A 'Moon-first' strategy</strong> — He described the Moon as the next major step for exploration and development before larger ambitions deeper into the solar system.</li><li><strong>Space-based industry</strong> — Bezos argued that heavy industry and polluting manufacturing could eventually be moved off Earth and into space.</li><li><strong>Protecting Earth</strong> — He described Earth as a unique "garden planet" and suggested that using space resources, including materials from asteroids, could help preserve the environment.</li><li><strong>Advanced computing and innovation</strong> — He discussed how breakthroughs in computing, manufacturing, and automation could enable future space development.</li><li><strong>Artificial General Intelligence (AGI)</strong> — Bezos referenced efforts to develop more capable AI systems that could accelerate scientific discovery, innovation, and manufacturing.</li><li><strong>AI and jobs</strong> — He acknowledged concerns about AI replacing workers but argued that technological revolutions historically create new kinds of jobs and opportunities rather than eliminating work entirely.</li><li><strong>Responsible AI development</strong> — Bezos said AI should be treated as a powerful tool, with efforts focused on preventing harmful uses while still allowing innovation to continue.</li></ul><p>The fake quote appears to have spread following comments Bezos made about artificial intelligence during VivaTech 2026. Yet,  <strong>No comments about prioritizing AI over humans was ever made.</strong> At no point in the session did Bezos say that water, energy, or other resources should be diverted from people to AI systems.</p><p>During the event, Bezos discussed AI's potential impact on the workforce and argued that artificial intelligence could ultimately <a href="https://www.tomsguide.com/ai/jeff-bezos-predicts-an-optimistic-future-where-ai-wont-lead-to-mass-unemployment-ai-is-going-to-create-a-labor-shortage">create labor shortages </a>rather than<a href="https://www.tomsguide.com/ai/microsoft-reveals-the-40-jobs-ai-is-most-likely-to-replace-and-40-that-are-safe-for-now"> widespread unemployment</a>. He also addressed concerns about the <a href="https://www.tomsguide.com/ai/i-kept-hearing-that-ai-data-centers-are-draining-towns-dry-so-i-looked-at-the-evidence">resources required to power AI systems, including water consumption</a>.</p><p>His actual comments centered on putting AI water usage into a broader context rather than arguing that AI should take priority over human needs. That's a <a href="https://www.tomsguide.com/ai/this-ai-data-center-will-be-bigger-than-2-000-walmarts-and-dump-23-atom-bombs-worth-of-energy-into-the-environment-every-day-and-locals-are-terrified">position some people may disagree with</a>. But it is very different from claiming that communities should sacrifice access to water so AI data centers can continue expanding. And then, somewhere between those two ideas, a fictional quote was born.</p><h2 id="why-people-believed-it">Why people believed it</h2><p>The most interesting part of this story is that many people immediately accepted the quote to be real. Because the fabricated statement tapped into a growing anxiety surrounding artificial intelligence and the massive infrastructure required to support it, people believed it. </p><p>Companies including Amazon, Google, Microsoft, Meta and OpenAI are <a href="https://www.tomsguide.com/ai/big-tech-is-pouring-usd650-billion-into-ai-and-its-about-to-affect-almost-everything-you-use">investing billions of dollars into new data centers</a>. Those facilities require enormous amounts of electricity and, in many cases, large quantities of water for cooling.</p><p>Communities across the United States and around the world have raised concerns about how these facilities could affect local resources. <a href="https://www.tomsguide.com/ai/erin-brockovich-just-launched-an-ai-data-center-map-and-it-highlights-a-growing-problem-tech-giants-are-avoiding">Environmental groups </a>have also questioned the long-term sustainability of AI's rapid expansion. Against that backdrop, a quote suggesting that a tech billionaire would prioritize AI over people didn't seem impossible to many readers. In other words, the misinformation succeeded because it fit an existing narrative.</p><h2 id="bottom-line-4">Bottom line </h2><p>False information often spreads fastest when it contains just enough truth to feel plausible. AI data centers really do consume water, and communities really are debating whether new facilities should be approved. And tech leaders really are making increasingly bold claims about the future of artificial intelligence. But we all know the dangers of misinformation.</p><p>When a fabricated quote combines realistic elements, it can become difficult to distinguish fact from fiction, especially when it appears in a screenshot that looks authentic.</p><p>Ironically, this story reveals less about Jeff Bezos than it does about public perception of the AI industry. Although the quote itself was fake, the concerns that made it believable are very real.</p><p>As AI infrastructure continues expanding and debates about energy, water, and environmental impact become more heated, stories like this will likely become more common.</p><p>At Tom's Guide, we'll continue separating fact from fiction, breaking down viral AI claims, and helping readers understand what's really happening behind the headlines.</p><a href="https://follow.it/articles-by-amanda-caswell-tom-s-guide?leanpub" class="button button--large button--primary">Follow Amanda Caswell and stay ahead of the AI curve</a><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-asked-gemini-what-was-slowing-down-my-windows-pc-heres-what-it-found">I asked Gemini what was slowing down my Windows PC — here’s what it found</a></li><li><a href="https://www.tomsguide.com/ai/what-is-google-zero-and-why-your-favorite-websites-are-panicking-about-ai">What is Google Zero — and why your favorite websites are panicking about AI</a></li><li><a href="https://www.tomsguide.com/ai/apple-is-ending-support-for-16-devices-heres-the-chatgpt-prompt-that-tells-you-what-to-do-next">Apple is ending support for 16 devices — here’s the ChatGPT prompt that tells you what to do next</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video shows to binge-watch this weekend (June 19-21) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If TV-watching and couch-rotting are on your weekend to-do list (and given how fast June is moving, we don't blame you one bit for taking a breather!), you're likely looking for a great new show to binge. As one of the top <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> around, <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> always has top-notch new television tiles and film releases being added to the platform's already extensive library, which should make choosing your next weekend watch that much easier. </p><p>To help you even further, we here at Tom's Guide have narrowed things down to a trio of worthy shows that we think you should check out next. If you're a romance fan (who isn't?), cuddle up to the streamer's latest steamy romantic drama "Every Year After." If it's action-packed animation you want, there's a new season of "The Legend of Vox Machina" for you to enjoy. And if you want your comedy with a side of theological fantasy, the final installment of "Good Omens" recently dropped as well. </p><p>So without further ado, here are the 3 best new to Prime Video shows to binge-watch this weekend.</p><h2 id="every-year-after">'Every Year After'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/F5SpqQ8dNa8" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Romantic drama series</p><p><strong>What it's about: </strong>A screen adaptation of Carley Fortune's best-selling romance novel of the same name, "Every Year After" is a second-chance love story told across two alternating timelines: The nostalgic past and fraught present of childhood friends-turned-first loves Percy Fraser (Sadie Soverall) and Sam Florek (Matt Cornett).</p><p><strong>Why you should watch it: </strong>It's a touch sadder than recent viral romances like "Heated Rivalry" and "Off Campus," but that emotional depth only adds to all of the charged feelings swirling around the Canada-set drama. If you enjoy YA romances, "Every Year After" should be right up your alley.</p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXTM8G3W/" target="_blank" rel="nofollow"><em><strong>"Every Year After" season 1 on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-legend-of-vox-machina-season-4">'The Legend of Vox Machina' 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/FkqIXFztj6Q" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Adult animated fantasy series</p><p><strong>What it's about:</strong>  In season four of "The Legend of Vox Machina," our loveable band of unlikely heroes—including Vex (Laura Bailey), Percy (Taliesin Jaffe), Grog (Travis Willingham), Pike (Ashley Johnson) and new cast member Wayne Brady as Taryon Darrington—regroup a year after defeating the dragons of the Chroma Conclave. Now the adventurous crew has to face their most challenging foe yet: the Cult of the Whispered One.</p><p><strong>Why you should watch it: </strong>If you like shows like the original "Avatar: The Last Airbender," this show is a must-watch. Plus, the beloved Critical Role series is set to end with the already greenlit fifth and final season, so   </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B09PZHFHFS/" target="_blank" rel="nofollow"><em><strong>"The Legend of Vox Machina" season 4 on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="good-omens-season-3">'Good Omens' 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/r3zCN9S2RXg" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Fantasy comedy series</p><p><strong>What it's about:</strong>  Now Supreme Archangel, Aziraphale (Michael Sheen) seeks out the help of his unlikely demon pal Crowley (David Tennant) to navigate the Second Coming of Christ and to track down a missing Jesus Christ (played by "Black Mirror" actor Bilal Hasna). Together, Aziraphale and Crowley have to contend with a new apocalypse as well as the notion of whether heaven and hell do, or should, exist.</p><p><strong>Why you should watch it: </strong>Although initially conceived as a limited series, "Good Omens" has spread its wings as a three-season fan favorite that is sadly coming to an end with its recently released 90-minute finale. "Closing out the series with a serviceable final entry, <em>Good Omens</em> crafts a heartfelt goodbye thanks in part to David Tennant and Michael Sheen's unwavering performances," reads the critics consensus over on Rotten Tomatoes. </p><p><em><strong>Stream </strong></em><a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fgp%2Fvideo%2Fdetail%2FB0GW8BRM9B%2Fref%3Datv_dp_season_select_s3%3Ftag%3Dftr-tomsguide-us-20%26ascsubtag%3Dtomsguide-us-3996577319402456524-20" target="_blank" rel="nofollow"><em><strong>"Good Omens" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-movies-to-stream-this-weekend-june-19-21">3 best new to Prime Video movies to stream this weekend</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 movies for free — no Prime membership required</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/disclosure-day-review">'Disclosure Day' review: Steven Spielberg reminds us of his greatness in his latest sci-fi epic</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" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-shows-to-binge-watch-this-weekend-june-19-21</link>
                                                                            <description>
                            <![CDATA[ Planning to binge-watch something new this weekend? Here's our weekly guide to the best new to Prime Video series you should be streaming right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3DVE37SKanR5fupZEL5hV8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 16:18:54 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></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/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg">
                                                            <media:credit><![CDATA[Mimadeo / Alamy]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sunset background for Prime Video logo]]></media:description>                                                            <media:text><![CDATA[Sunset background for Prime Video logo]]></media:text>
                                <media:title type="plain"><![CDATA[Sunset background for Prime Video logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If TV-watching and couch-rotting are on your weekend to-do list (and given how fast June is moving, we don't blame you one bit for taking a breather!), you're likely looking for a great new show to binge. As one of the top <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> around, <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> always has top-notch new television tiles and film releases being added to the platform's already extensive library, which should make choosing your next weekend watch that much easier. </p><p>To help you even further, we here at Tom's Guide have narrowed things down to a trio of worthy shows that we think you should check out next. If you're a romance fan (who isn't?), cuddle up to the streamer's latest steamy romantic drama "Every Year After." If it's action-packed animation you want, there's a new season of "The Legend of Vox Machina" for you to enjoy. And if you want your comedy with a side of theological fantasy, the final installment of "Good Omens" recently dropped as well. </p><p>So without further ado, here are the 3 best new to Prime Video shows to binge-watch this weekend.</p><h2 id="every-year-after">'Every Year After'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/F5SpqQ8dNa8" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Romantic drama series</p><p><strong>What it's about: </strong>A screen adaptation of Carley Fortune's best-selling romance novel of the same name, "Every Year After" is a second-chance love story told across two alternating timelines: The nostalgic past and fraught present of childhood friends-turned-first loves Percy Fraser (Sadie Soverall) and Sam Florek (Matt Cornett).</p><p><strong>Why you should watch it: </strong>It's a touch sadder than recent viral romances like "Heated Rivalry" and "Off Campus," but that emotional depth only adds to all of the charged feelings swirling around the Canada-set drama. If you enjoy YA romances, "Every Year After" should be right up your alley.</p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXTM8G3W/" target="_blank" rel="nofollow"><em><strong>"Every Year After" season 1 on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-legend-of-vox-machina-season-4">'The Legend of Vox Machina' 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/FkqIXFztj6Q" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Adult animated fantasy series</p><p><strong>What it's about:</strong>  In season four of "The Legend of Vox Machina," our loveable band of unlikely heroes—including Vex (Laura Bailey), Percy (Taliesin Jaffe), Grog (Travis Willingham), Pike (Ashley Johnson) and new cast member Wayne Brady as Taryon Darrington—regroup a year after defeating the dragons of the Chroma Conclave. Now the adventurous crew has to face their most challenging foe yet: the Cult of the Whispered One.</p><p><strong>Why you should watch it: </strong>If you like shows like the original "Avatar: The Last Airbender," this show is a must-watch. Plus, the beloved Critical Role series is set to end with the already greenlit fifth and final season, so   </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B09PZHFHFS/" target="_blank" rel="nofollow"><em><strong>"The Legend of Vox Machina" season 4 on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="good-omens-season-3">'Good Omens' 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/r3zCN9S2RXg" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Fantasy comedy series</p><p><strong>What it's about:</strong>  Now Supreme Archangel, Aziraphale (Michael Sheen) seeks out the help of his unlikely demon pal Crowley (David Tennant) to navigate the Second Coming of Christ and to track down a missing Jesus Christ (played by "Black Mirror" actor Bilal Hasna). Together, Aziraphale and Crowley have to contend with a new apocalypse as well as the notion of whether heaven and hell do, or should, exist.</p><p><strong>Why you should watch it: </strong>Although initially conceived as a limited series, "Good Omens" has spread its wings as a three-season fan favorite that is sadly coming to an end with its recently released 90-minute finale. "Closing out the series with a serviceable final entry, <em>Good Omens</em> crafts a heartfelt goodbye thanks in part to David Tennant and Michael Sheen's unwavering performances," reads the critics consensus over on Rotten Tomatoes. </p><p><em><strong>Stream </strong></em><a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fgp%2Fvideo%2Fdetail%2FB0GW8BRM9B%2Fref%3Datv_dp_season_select_s3%3Ftag%3Dftr-tomsguide-us-20%26ascsubtag%3Dtomsguide-us-3996577319402456524-20" target="_blank" rel="nofollow"><em><strong>"Good Omens" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-movies-to-stream-this-weekend-june-19-21">3 best new to Prime Video movies to stream this weekend</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 movies for free — no Prime membership required</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/disclosure-day-review">'Disclosure Day' review: Steven Spielberg reminds us of his greatness in his latest sci-fi epic</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" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Prime Day heatwave deals from £2: up to 50% off fans, SPF and BBQs ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Another heatwave is headed towards the U.K. — I'm already feeling it in my home office. Luckily, this one coincides well with the start of <a href="https://www.tomsguide.com/uk/news/best-prime-day-deals-and-sales">Prime Day</a>. Even though Amazon's sales event doesn't start until Tuesday, there are already huge savings up for grabs on everything you need to stay cool, from fans to ice cream makers.</p><p>Short on time? The deal I recommend the most is the <a href="https://www.amazon.co.uk/dp/B0GCZVQKKK" target="_blank" rel="nofollow">Diveblues Handheld Turbo Fan for £14</a>. My colleagues at Tom's Guide love this fan for its versatility — it's lightweight, easy to carry and has a strap to wear around your neck. The angled stand means you can point it at your face and use it hands-free.</p><p>Keep scrolling to see the best Prime Day heatwave deals! I also recommend checking out our <a href="https://www.tomsguide.com/coupons/amazon-uk">Amazon promo codes</a> page.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><a href="https://www.amazon.co.uk/primeday" target="_blank" rel="nofollow"><strong>shop all Prime Day deals</strong></a></li><li><strong>Nivea SUN Protect Caring Lip Balm SPF50: </strong><a href="https://www.amazon.co.uk/Protect-Caring-Protects-Against-Moisture/dp/B0CKLQ7FZH" target="_blank" rel="nofollow"><strong>was £4 now £2</strong></a></li><li><strong>BBQs and outdoor cooking: </strong><a href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow"><strong>deals from £9</strong></a></li><li><strong>Havaianas sale: </strong><a href="https://www.amazon.co.uk/stores/Havaianas/page/568379EC-7A7D-498D-AC4B-AE345103F16A" target="_blank" rel="nofollow"><strong>up to 40% off</strong></a></li><li><strong>CeraVe Invisible Hydrating Sunscreen SPF 30: </strong><a href="https://www.amazon.co.uk/CeraVe-Invisible-Hydrating-Protection-Technology/dp/B0G1N9Z5KK" target="_blank" rel="nofollow"><strong>was £21 now £14</strong></a></li><li><strong>DiveBlues Handheld Turbo Fan: </strong><a href="https://www.amazon.co.uk/dp/B0GCZVQKKK" target="_blank" rel="nofollow"><strong>was £19 now £14</strong></a></li><li><strong>HoneyWell TurboForce Power Fan: </strong><a href="https://www.amazon.co.uk/Honeywell-TurboForce-Operation-Variable-Settings/dp/B0C5M8D7M8" target="_blank" rel="nofollow"><strong>was £32 now £27</strong></a></li><li><strong>JisuLife Portable Neck Fan: </strong><a href="https://www.amazon.co.uk/Portable-Bladeless-Operated-Rechargeable-Headphone/dp/B08911JGGW/" target="_blank" rel="nofollow"><strong>was £33 now £28</strong></a></li><li><strong>Bedsure Cooling Blanket (Double): </strong><a href="https://www.amazon.co.uk/Bedsure-Cooling-Blanket-Double-Bed/dp/B0G2XZT1ZZ" target="_blank" rel="nofollow"><strong>was £36 now £33</strong></a></li><li><strong>GoveeLife 42" Smart Tower Fan: </strong><a href="https://www.amazon.co.uk/GoveeLife-42-inch-Bladeless-Electric-Oscillation/dp/B0DSKJ3XVT" target="_blank" rel="nofollow"><strong>was £149 now £91</strong></a></li><li><strong>Ninja FrostVault 28L Cool Box: </strong><a href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/" target="_blank" rel="nofollow"><strong>was £249 now £179</strong></a></li></ul><h3 class="article-body__section" id="section-beat-the-heat"><span>Beat the heat</span></h3><div class="product"><a data-dimension112="038a95bc-a7bf-4549-803c-591305fcfe07" data-action="Deal Block" data-label="SUN Protect Caring Lip Balm SPF50" data-dimension48="SUN Protect Caring Lip Balm SPF50" data-dimension25="£2" href="https://www.amazon.co.uk/Protect-Caring-Protects-Against-Moisture/dp/B0CKLQ7FZH" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:958px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="NPEjtUF7aGQVL8RcdSx9eh" name="SUN Protect Caring Lip Balm SPF50" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NPEjtUF7aGQVL8RcdSx9eh.jpg" mos="" align="middle" fullscreen="" width="958" height="958" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Protect-Caring-Protects-Against-Moisture/dp/B0CKLQ7FZH" target="_blank" rel="nofollow" data-dimension112="038a95bc-a7bf-4549-803c-591305fcfe07" data-action="Deal Block" data-label="SUN Protect Caring Lip Balm SPF50" data-dimension48="SUN Protect Caring Lip Balm SPF50" data-dimension25="£2">SUN Protect Caring Lip Balm SPF50: was £4 now £2</a></strong><br>SPF lip balm will protect your lips from harmful UV rays in the summer. Going out in the sun for too long can lead to dryness and chapping, so smacking on some of this smooth, hydrating lip balm ensures your lips remain soft and smooth in the warmer months. <a class="view-deal button" href="https://www.amazon.co.uk/Protect-Caring-Protects-Against-Moisture/dp/B0CKLQ7FZH" target="_blank" rel="nofollow" data-dimension112="038a95bc-a7bf-4549-803c-591305fcfe07" data-action="Deal Block" data-label="SUN Protect Caring Lip Balm SPF50" data-dimension48="SUN Protect Caring Lip Balm SPF50" data-dimension25="£2">View Deal</a></p></div><div class="product"><a data-dimension112="014bd528-467f-46dc-bd32-a403346a4c60" data-action="Deal Block" data-label="BBQ sale: deals from £9 @ Amazon" data-dimension48="BBQ sale: deals from £9 @ Amazon" href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="AaUbignfchFJK9yxtAdJd9" name="Weber" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AaUbignfchFJK9yxtAdJd9.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>BBQ sale: </strong><a href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow" data-dimension112="014bd528-467f-46dc-bd32-a403346a4c60" data-action="Deal Block" data-label="BBQ sale: deals from £9 @ Amazon" data-dimension48="BBQ sale: deals from £9 @ Amazon" data-dimension25=""><strong>deals from £9 @ Amazon</strong></a><br>Amazon is offering some big savings on grills and outdoor cooking accessories right now. Brands on sale include Weber, Ninja and more. Prices start from just £9.<a class="view-deal button" href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow" data-dimension112="014bd528-467f-46dc-bd32-a403346a4c60" data-action="Deal Block" data-label="BBQ sale: deals from £9 @ Amazon" data-dimension48="BBQ sale: deals from £9 @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="2928e2a3-4c6c-494f-8125-40a2ebd70546" data-action="Deal Block" data-label="Havaianas sale: up to 40% off @ Amazon" data-dimension48="Havaianas sale: up to 40% off @ Amazon" data-dimension25="£" href="https://www.amazon.co.uk/stores/Havaianas/page/568379EC-7A7D-498D-AC4B-AE345103F16A" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:547px;"><p class="vanilla-image-block" style="padding-top:127.06%;"><img id="56s9rGTyq5HvjFXuzz7w7V" name="havaianas 1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/56s9rGTyq5HvjFXuzz7w7V.jpg" mos="" align="middle" fullscreen="" width="547" height="695" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Havaianas sale: </strong><a href="https://www.amazon.co.uk/stores/Havaianas/page/568379EC-7A7D-498D-AC4B-AE345103F16A" target="_blank" rel="nofollow" data-dimension112="2928e2a3-4c6c-494f-8125-40a2ebd70546" data-action="Deal Block" data-label="Havaianas sale: up to 40% off @ Amazon" data-dimension48="Havaianas sale: up to 40% off @ Amazon" data-dimension25="£"><strong>up to 40% off @ Amazon</strong></a><br>Colorful, comfortable and budget-friendly, Havaianas sandals and flip flops are ideal for those summer beach trips, backyard barbecues and pool parties.<a class="view-deal button" href="https://www.amazon.co.uk/stores/Havaianas/page/568379EC-7A7D-498D-AC4B-AE345103F16A" target="_blank" rel="nofollow" data-dimension112="2928e2a3-4c6c-494f-8125-40a2ebd70546" data-action="Deal Block" data-label="Havaianas sale: up to 40% off @ Amazon" data-dimension48="Havaianas sale: up to 40% off @ Amazon" data-dimension25="£">View Deal</a></p></div><div class="product"><a data-dimension112="a29c385f-0ff0-4f0a-b510-67ebcedb00f7" data-action="Deal Block" data-label="Invisible Hydrating Sunscreen SPF 30" data-dimension48="Invisible Hydrating Sunscreen SPF 30" data-dimension25="£14" href="https://www.amazon.co.uk/CeraVe-Invisible-Hydrating-Protection-Technology/dp/B0G1N9Z5KK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:690px;"><p class="vanilla-image-block" style="padding-top:217.39%;"><img id="tGSqr2yaP2gLFuNGRHPocE" name="Invisible Hydrating Sunscreen SPF 30" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tGSqr2yaP2gLFuNGRHPocE.jpg" mos="" align="middle" fullscreen="" width="690" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/CeraVe-Invisible-Hydrating-Protection-Technology/dp/B0G1N9Z5KK" target="_blank" rel="nofollow" data-dimension112="a29c385f-0ff0-4f0a-b510-67ebcedb00f7" data-action="Deal Block" data-label="Invisible Hydrating Sunscreen SPF 30" data-dimension48="Invisible Hydrating Sunscreen SPF 30" data-dimension25="£14">Invisible Hydrating Sunscreen SPF 30: was £21 now £14</a></strong><br>CeraVe sunscreen shields your skin from harmful UVA and UVB rays while providing all-day hydration with a water-resistant formula. Whether you're on holiday or taking a nice day out, putting on this mineral sunscreen is essential for protecting your skin in the summer. <a class="view-deal button" href="https://www.amazon.co.uk/CeraVe-Invisible-Hydrating-Protection-Technology/dp/B0G1N9Z5KK" target="_blank" rel="nofollow" data-dimension112="a29c385f-0ff0-4f0a-b510-67ebcedb00f7" data-action="Deal Block" data-label="Invisible Hydrating Sunscreen SPF 30" data-dimension48="Invisible Hydrating Sunscreen SPF 30" data-dimension25="£14">View Deal</a></p></div><div class="product"><a data-dimension112="f7685c42-be5e-44a9-a6e9-88379a35e8cc" data-action="Deal Block" data-label="Handheld Turbo Fan" data-dimension48="Handheld Turbo Fan" data-dimension25="£14" href="https://www.amazon.co.uk/dp/B0GCZVQKKK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="46c3VLpWZCtr7Fa584HawV" name="DivesBlue Fanzy deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/46c3VLpWZCtr7Fa584HawV.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Stay cool this summer with the DiveBlues Handheld Turbo Fan, a compact portable fan with a foldable design that allows it to act as a handheld fan when you're on the go, a neck fan for hands-free operation, and even as a handy desk fan that can hold itself upright. It's also super quiet and features a battery that can last up to 12 hours.<a class="view-deal button" href="https://www.amazon.co.uk/dp/B0GCZVQKKK" target="_blank" rel="nofollow" data-dimension112="f7685c42-be5e-44a9-a6e9-88379a35e8cc" data-action="Deal Block" data-label="Handheld Turbo Fan" data-dimension48="Handheld Turbo Fan" data-dimension25="£14">View Deal</a></p></div><div class="product"><a data-dimension112="b6581aed-7902-483c-bf4d-c5e26430cd81" data-action="Deal Block" data-label="FreeSip" data-dimension48="FreeSip" data-dimension25="£24" href="https://www.amazon.co.uk/Owala-FreeSip-Insulated-Stainless-BPA-Free/dp/B0C59CLN29" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:290px;"><p class="vanilla-image-block" style="padding-top:338.62%;"><img id="dDnhZ8VLJSfNVxV2Y7oqYG" name="FreeSip" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dDnhZ8VLJSfNVxV2Y7oqYG.jpg" mos="" align="middle" fullscreen="" width="290" height="982" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Owala FreeSip's lid makes it one of the best bottles out there. It flips open smoothly every time and gets you access to both a straw and a chug opening, suiting your needs on the go.<a class="view-deal button" href="https://www.amazon.co.uk/Owala-FreeSip-Insulated-Stainless-BPA-Free/dp/B0C59CLN29" target="_blank" rel="nofollow" data-dimension112="b6581aed-7902-483c-bf4d-c5e26430cd81" data-action="Deal Block" data-label="FreeSip" data-dimension48="FreeSip" data-dimension25="£24">View Deal</a></p></div><div class="product"><a data-dimension112="81e8fde6-cc1b-4b36-a030-6e021eb0e516" data-action="Deal Block" data-label="TurboForce Power Fan" data-dimension48="TurboForce Power Fan" data-dimension25="£27" href="https://www.amazon.co.uk/Honeywell-TurboForce-Operation-Variable-Settings/dp/B0C5M8D7M8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:836px;"><p class="vanilla-image-block" style="padding-top:105.38%;"><img id="N9b3q5FpJK3nYWqfrdqMnJ" name="TurboForce Power Fan" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/N9b3q5FpJK3nYWqfrdqMnJ.jpg" mos="" align="middle" fullscreen="" width="836" height="881" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Honeywell-TurboForce-Operation-Variable-Settings/dp/B0C5M8D7M8" target="_blank" rel="nofollow" data-dimension112="81e8fde6-cc1b-4b36-a030-6e021eb0e516" data-action="Deal Block" data-label="TurboForce Power Fan" data-dimension48="TurboForce Power Fan" data-dimension25="£27">TurboForce Power Fan: was £32 now £27</a></strong><br>This powerful fan lives up to its name. It can tilt to blow air at the perfect angle and has three speed settings for a cooling breeze. It can also be mounted on a wall.<a class="view-deal button" href="https://www.amazon.co.uk/Honeywell-TurboForce-Operation-Variable-Settings/dp/B0C5M8D7M8" target="_blank" rel="nofollow" data-dimension112="81e8fde6-cc1b-4b36-a030-6e021eb0e516" data-action="Deal Block" data-label="TurboForce Power Fan" data-dimension48="TurboForce Power Fan" data-dimension25="£27">View Deal</a></p></div><div class="product"><a data-dimension112="c7890336-27a4-4636-95c5-97b0d57eca93" data-action="Deal Block" data-label="Portable Neck Fan" data-dimension48="Portable Neck Fan" data-dimension25="£28" href="https://www.amazon.co.uk/Portable-Bladeless-Operated-Rechargeable-Headphone/dp/B08911JGGW/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="BPyktKGwtWLvxHdZMPJnXc" name="Portable Neck Fan" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BPyktKGwtWLvxHdZMPJnXc.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Portable-Bladeless-Operated-Rechargeable-Headphone/dp/B08911JGGW/" target="_blank" rel="nofollow" data-dimension112="c7890336-27a4-4636-95c5-97b0d57eca93" data-action="Deal Block" data-label="Portable Neck Fan" data-dimension48="Portable Neck Fan" data-dimension25="£28">Portable Neck Fan: was £33 now £28</a></strong><br>This rechargeable neck comes with five speeds.  Simply press the power button repeatedly to adjust to the perfect power level. Designed to keep you cool in comfort, it's ultra-light and quiet, and its charge lasts up to 16 hours.<br><strong>Price check: </strong><a href="https://www.currys.co.uk/products/jisulife-portable-neck-fan-3-grey-10300767.html" target="_blank" rel="nofollow"><strong>£29 @ Currys</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/Portable-Bladeless-Operated-Rechargeable-Headphone/dp/B08911JGGW/" target="_blank" rel="nofollow" data-dimension112="c7890336-27a4-4636-95c5-97b0d57eca93" data-action="Deal Block" data-label="Portable Neck Fan" data-dimension48="Portable Neck Fan" data-dimension25="£28">View Deal</a></p></div><div class="product"><a data-dimension112="d7950ed5-4ace-4408-a522-4982f517ef55" data-action="Deal Block" data-label="Cooling Blanket" data-dimension48="Cooling Blanket" data-dimension25="£33" href="https://www.amazon.co.uk/Bedsure-Cooling-Blanket-Double-Bed/dp/B0G2XZT1ZZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="EuHMfcUaA9yRUN3FE5McmA" name="Bedsure cooling blanket" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EuHMfcUaA9yRUN3FE5McmA.png" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Bedsure-Cooling-Blanket-Double-Bed/dp/B0G2XZT1ZZ" target="_blank" rel="nofollow" data-dimension112="d7950ed5-4ace-4408-a522-4982f517ef55" data-action="Deal Block" data-label="Cooling Blanket" data-dimension48="Cooling Blanket" data-dimension25="£33">Cooling Blanket: was £36 now £33</a></strong><br>Made from a super thin rayon derived from bamboo fabric, this blanket is cool to touch and moisture wicking. In fact, Bedsure claim it is 10 times more breathable and absorbent than cotton. It's the perfect layer to snuggle under without overheating.<a class="view-deal button" href="https://www.amazon.co.uk/Bedsure-Cooling-Blanket-Double-Bed/dp/B0G2XZT1ZZ" target="_blank" rel="nofollow" data-dimension112="d7950ed5-4ace-4408-a522-4982f517ef55" data-action="Deal Block" data-label="Cooling Blanket" data-dimension48="Cooling Blanket" data-dimension25="£33">View Deal</a></p></div><div class="product"><a data-dimension112="970eb731-f660-4d12-9a05-8877ffbb2eef" data-action="Deal Block" data-label="Freeze Wand Ice Cream Maker" data-dimension48="Freeze Wand Ice Cream Maker" data-dimension25="£79" href="https://www.amazon.co.uk/Cuisinart-Freeze-Wand%C2%AE-dessert-presets/dp/B0F94LC1BR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vvsCxwiZuzn8oGXxq7Tci6" name="Cuisinart fast freeze" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vvsCxwiZuzn8oGXxq7Tci6.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/home/kitchen-dining/i-love-my-ninja-creami-but-cuisinarts-affordable-handheld-alternative-just-blew-me-away" data-dimension112="970eb731-f660-4d12-9a05-8877ffbb2eef" data-action="Deal Block" data-label="Freeze Wand Ice Cream Maker" data-dimension48="Freeze Wand Ice Cream Maker" data-dimension25="£79">Cuisinart Freeze Wand Ice Cream Maker</a> turns frozen ingredients into tasty ice cream in a flash. It really does work like magic! It has five settings, and comes with three containers to make all your favorite flavours. Click the on-page coupon for the full discount.<a class="view-deal button" href="https://www.amazon.co.uk/Cuisinart-Freeze-Wand%C2%AE-dessert-presets/dp/B0F94LC1BR" target="_blank" rel="nofollow" data-dimension112="970eb731-f660-4d12-9a05-8877ffbb2eef" data-action="Deal Block" data-label="Freeze Wand Ice Cream Maker" data-dimension48="Freeze Wand Ice Cream Maker" data-dimension25="£79">View Deal</a></p></div><div class="product"><a data-dimension112="8ffdb5a1-08a7-4c34-879d-b40b5183ce32" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£80" href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="CERqwPnM6zij6hpVVKyAXf" name="Compact 47 cm Portable Kettle Charcoal BBQ" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CERqwPnM6zij6hpVVKyAXf.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow" data-dimension112="8ffdb5a1-08a7-4c34-879d-b40b5183ce32" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£80">Compact 47 cm Portable Kettle Charcoal BBQ: was £94 now £80</a></strong><br>Weber makes some of the <a href="https://www.tomsguide.com/best-picks/best-grills" target="_blank" rel="nofollow">best grills</a> we've tested, and this is one of the more affordable entry-level options. It has 47cm of cooking space, perfect for everything from burgers to kebabs. Plus, there are wheels to move it around easily.<br><strong>Price check: </strong><a href="https://www.currys.co.uk/products/weber-compact-47-cm-portable-kettle-charcoal-bbq-black-10299398.html" target="_blank" rel="nofollow"><strong>£89 @ Currys</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow" data-dimension112="8ffdb5a1-08a7-4c34-879d-b40b5183ce32" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£80">View Deal</a></p></div><div class="product"><a data-dimension112="359f435c-79ac-4fe0-9671-58bf5d375017" data-action="Deal Block" data-label="42" Smart Tower Fan 2 Max" data-dimension48="42" Smart Tower Fan 2 Max" data-dimension25="£91" href="https://www.amazon.co.uk/GoveeLife-42-inch-Bladeless-Electric-Oscillation/dp/B0DSKJ3XVT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="tvp7QyDbncR7Lu5r39ozcV" name="H7105-PP_-1_1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tvp7QyDbncR7Lu5r39ozcV.webp" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/GoveeLife-42-inch-Bladeless-Electric-Oscillation/dp/B0DSKJ3XVT" target="_blank" rel="nofollow" data-dimension112="359f435c-79ac-4fe0-9671-58bf5d375017" data-action="Deal Block" data-label='42" Smart Tower Fan 2 Max' data-dimension48='42" Smart Tower Fan 2 Max' data-dimension25="£91">42" Smart Tower Fan 2 Max: was £149 now £91</a></strong><br>The <a href="https://www.tomsguide.com/home/smart-home/i-bought-a-smart-fan-to-beat-the-heat-and-i-never-thought-id-have-this-much-fun-controlling-a-fan-from-my-phone">Govee 42-inch Smart Tower Fan 2 Max</a> can be controlled using your phone or your voice with a smart speaker, but there are also physical controls on the top. In the app, you can switch between its 5 included modes or create your own, turn oscillation on or off or adjust the angle the fan turns in and even change the color of its RGB night light. Redeem the on-page digital coupon to get this deal.<a class="view-deal button" href="https://www.amazon.co.uk/GoveeLife-42-inch-Bladeless-Electric-Oscillation/dp/B0DSKJ3XVT" target="_blank" rel="nofollow" data-dimension112="359f435c-79ac-4fe0-9671-58bf5d375017" data-action="Deal Block" data-label="42" Smart Tower Fan 2 Max" data-dimension48="42" Smart Tower Fan 2 Max" data-dimension25="£91">View Deal</a></p></div><div class="product"><a data-dimension112="7d0b4526-4a36-42f5-9b73-058c0e041a87" data-action="Deal Block" data-label="FrostVault 28L Cool Box" data-dimension48="FrostVault 28L Cool Box" data-dimension25="£179" href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:94.07%;"><img id="maDaBVSHkDxhiwabWoMfW" name="FrostVault" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/maDaBVSHkDxhiwabWoMfW.jpg" mos="" align="middle" fullscreen="" width="1500" height="1411" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow" data-dimension112="7d0b4526-4a36-42f5-9b73-058c0e041a87" data-action="Deal Block" data-label="FrostVault 28L Cool Box" data-dimension48="FrostVault 28L Cool Box" data-dimension25="£179">FrostVault 28L Cool Box: was £249 now £179</a></strong><br>The Ninja FrostVault cooler is the <a href="https://www.tomsguide.com/best-picks/best-coolers">best cooler</a> we've tested and is a go-to for hot summer adventures. The 28L cooler can hold up to 48 cans and keeps them cool for 8 days! The wheels also mean you don't have to carry it, making it easy to manoeuvre even when full. <a class="view-deal button" href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow" data-dimension112="7d0b4526-4a36-42f5-9b73-058c0e041a87" data-action="Deal Block" data-label="FrostVault 28L Cool Box" data-dimension48="FrostVault 28L Cool Box" data-dimension25="£179">View Deal</a></p></div><div data-model-name="Apple AirPods 4" data-widget-type="review" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/prime-day-heatwave-deals-from-gbp2-up-to-50-percent-off-fans-spf-and-bbqs</link>
                                                                            <description>
                            <![CDATA[ Another heatwave is on the way — these are the best early Prime Day deals to make sure you can keep cool. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pRakT5LLnwB2tgRATbAwfA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XfoLvQk5q929ZhcCPEDwuT-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 14:15:04 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sales Events]]></category>
                                                                                                <author><![CDATA[ millie.daviswilliams@futurenet.com (Millie Davis-Williams) ]]></author>                    <dc:creator><![CDATA[ Millie Davis-Williams ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/WU6pa7hKuxs5ScCoqcXYWA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Millie is a Deals Editor at Tom&#039;s Guide specializing in tech deals content. Based in London, Millie has spent a lifetime stubbornly refusing to pay full price on any possible purchase. She has years of searching for the best discounts on the latest and greatest phones, TVs and gadgets under her belt, and knows how to sort the best deals from the rest. Helping readers save on the products they want is her mission, whether it’s an Apple Watch or a new tablet.&lt;/p&gt;&lt;p&gt;Since working at Tom’s Guide, Millie has covered retail events like Prime Day, Black Friday and Cyber Monday extensively, meaning she knows the products readers are looking for and the best times of year to hit “purchase.”&lt;/p&gt;&lt;p&gt;When she’s not looking for discounts, Millie covers news and writes how-to articles about everything from phones, streaming devices, and headphones to apps and video games.&lt;/p&gt;&lt;p&gt;In her spare time, Millie enjoys reading, gaming on her Nintendo Switch and creating digital art. She’s also a fan of watching Disney movies and collecting plush (the latter having totally taken over her bedroom.)&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/XfoLvQk5q929ZhcCPEDwuT-1280-80.jpg">
                                                            <media:credit><![CDATA[Nivea / CeraVe / GoveeLife / HoneyWell / Havaianas / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Heatwave products from Nivea, CeraVe, GoveeLife, HoneyWell, Havaianas]]></media:description>                                                            <media:text><![CDATA[Heatwave products from Nivea, CeraVe, GoveeLife, HoneyWell, Havaianas]]></media:text>
                                <media:title type="plain"><![CDATA[Heatwave products from Nivea, CeraVe, GoveeLife, HoneyWell, Havaianas]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XfoLvQk5q929ZhcCPEDwuT-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Another heatwave is headed towards the U.K. — I'm already feeling it in my home office. Luckily, this one coincides well with the start of <a href="https://www.tomsguide.com/uk/news/best-prime-day-deals-and-sales">Prime Day</a>. Even though Amazon's sales event doesn't start until Tuesday, there are already huge savings up for grabs on everything you need to stay cool, from fans to ice cream makers.</p><p>Short on time? The deal I recommend the most is the <a href="https://www.amazon.co.uk/dp/B0GCZVQKKK" target="_blank" rel="nofollow">Diveblues Handheld Turbo Fan for £14</a>. My colleagues at Tom's Guide love this fan for its versatility — it's lightweight, easy to carry and has a strap to wear around your neck. The angled stand means you can point it at your face and use it hands-free.</p><p>Keep scrolling to see the best Prime Day heatwave deals! I also recommend checking out our <a href="https://www.tomsguide.com/coupons/amazon-uk">Amazon promo codes</a> page.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><a href="https://www.amazon.co.uk/primeday" target="_blank" rel="nofollow"><strong>shop all Prime Day deals</strong></a></li><li><strong>Nivea SUN Protect Caring Lip Balm SPF50: </strong><a href="https://www.amazon.co.uk/Protect-Caring-Protects-Against-Moisture/dp/B0CKLQ7FZH" target="_blank" rel="nofollow"><strong>was £4 now £2</strong></a></li><li><strong>BBQs and outdoor cooking: </strong><a href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow"><strong>deals from £9</strong></a></li><li><strong>Havaianas sale: </strong><a href="https://www.amazon.co.uk/stores/Havaianas/page/568379EC-7A7D-498D-AC4B-AE345103F16A" target="_blank" rel="nofollow"><strong>up to 40% off</strong></a></li><li><strong>CeraVe Invisible Hydrating Sunscreen SPF 30: </strong><a href="https://www.amazon.co.uk/CeraVe-Invisible-Hydrating-Protection-Technology/dp/B0G1N9Z5KK" target="_blank" rel="nofollow"><strong>was £21 now £14</strong></a></li><li><strong>DiveBlues Handheld Turbo Fan: </strong><a href="https://www.amazon.co.uk/dp/B0GCZVQKKK" target="_blank" rel="nofollow"><strong>was £19 now £14</strong></a></li><li><strong>HoneyWell TurboForce Power Fan: </strong><a href="https://www.amazon.co.uk/Honeywell-TurboForce-Operation-Variable-Settings/dp/B0C5M8D7M8" target="_blank" rel="nofollow"><strong>was £32 now £27</strong></a></li><li><strong>JisuLife Portable Neck Fan: </strong><a href="https://www.amazon.co.uk/Portable-Bladeless-Operated-Rechargeable-Headphone/dp/B08911JGGW/" target="_blank" rel="nofollow"><strong>was £33 now £28</strong></a></li><li><strong>Bedsure Cooling Blanket (Double): </strong><a href="https://www.amazon.co.uk/Bedsure-Cooling-Blanket-Double-Bed/dp/B0G2XZT1ZZ" target="_blank" rel="nofollow"><strong>was £36 now £33</strong></a></li><li><strong>GoveeLife 42" Smart Tower Fan: </strong><a href="https://www.amazon.co.uk/GoveeLife-42-inch-Bladeless-Electric-Oscillation/dp/B0DSKJ3XVT" target="_blank" rel="nofollow"><strong>was £149 now £91</strong></a></li><li><strong>Ninja FrostVault 28L Cool Box: </strong><a href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/" target="_blank" rel="nofollow"><strong>was £249 now £179</strong></a></li></ul><h3 class="article-body__section" id="section-beat-the-heat"><span>Beat the heat</span></h3><div class="product"><a data-dimension112="038a95bc-a7bf-4549-803c-591305fcfe07" data-action="Deal Block" data-label="SUN Protect Caring Lip Balm SPF50" data-dimension48="SUN Protect Caring Lip Balm SPF50" data-dimension25="£2" href="https://www.amazon.co.uk/Protect-Caring-Protects-Against-Moisture/dp/B0CKLQ7FZH" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:958px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="NPEjtUF7aGQVL8RcdSx9eh" name="SUN Protect Caring Lip Balm SPF50" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NPEjtUF7aGQVL8RcdSx9eh.jpg" mos="" align="middle" fullscreen="" width="958" height="958" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Protect-Caring-Protects-Against-Moisture/dp/B0CKLQ7FZH" target="_blank" rel="nofollow" data-dimension112="038a95bc-a7bf-4549-803c-591305fcfe07" data-action="Deal Block" data-label="SUN Protect Caring Lip Balm SPF50" data-dimension48="SUN Protect Caring Lip Balm SPF50" data-dimension25="£2">SUN Protect Caring Lip Balm SPF50: was £4 now £2</a></strong><br>SPF lip balm will protect your lips from harmful UV rays in the summer. Going out in the sun for too long can lead to dryness and chapping, so smacking on some of this smooth, hydrating lip balm ensures your lips remain soft and smooth in the warmer months. <a class="view-deal button" href="https://www.amazon.co.uk/Protect-Caring-Protects-Against-Moisture/dp/B0CKLQ7FZH" target="_blank" rel="nofollow" data-dimension112="038a95bc-a7bf-4549-803c-591305fcfe07" data-action="Deal Block" data-label="SUN Protect Caring Lip Balm SPF50" data-dimension48="SUN Protect Caring Lip Balm SPF50" data-dimension25="£2">View Deal</a></p></div><div class="product"><a data-dimension112="014bd528-467f-46dc-bd32-a403346a4c60" data-action="Deal Block" data-label="BBQ sale: deals from £9 @ Amazon" data-dimension48="BBQ sale: deals from £9 @ Amazon" href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="AaUbignfchFJK9yxtAdJd9" name="Weber" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AaUbignfchFJK9yxtAdJd9.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>BBQ sale: </strong><a href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow" data-dimension112="014bd528-467f-46dc-bd32-a403346a4c60" data-action="Deal Block" data-label="BBQ sale: deals from £9 @ Amazon" data-dimension48="BBQ sale: deals from £9 @ Amazon" data-dimension25=""><strong>deals from £9 @ Amazon</strong></a><br>Amazon is offering some big savings on grills and outdoor cooking accessories right now. Brands on sale include Weber, Ninja and more. Prices start from just £9.<a class="view-deal button" href="https://www.amazon.co.uk/b/?node=11714771" target="_blank" rel="nofollow" data-dimension112="014bd528-467f-46dc-bd32-a403346a4c60" data-action="Deal Block" data-label="BBQ sale: deals from £9 @ Amazon" data-dimension48="BBQ sale: deals from £9 @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="2928e2a3-4c6c-494f-8125-40a2ebd70546" data-action="Deal Block" data-label="Havaianas sale: up to 40% off @ Amazon" data-dimension48="Havaianas sale: up to 40% off @ Amazon" data-dimension25="£" href="https://www.amazon.co.uk/stores/Havaianas/page/568379EC-7A7D-498D-AC4B-AE345103F16A" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:547px;"><p class="vanilla-image-block" style="padding-top:127.06%;"><img id="56s9rGTyq5HvjFXuzz7w7V" name="havaianas 1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/56s9rGTyq5HvjFXuzz7w7V.jpg" mos="" align="middle" fullscreen="" width="547" height="695" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Havaianas sale: </strong><a href="https://www.amazon.co.uk/stores/Havaianas/page/568379EC-7A7D-498D-AC4B-AE345103F16A" target="_blank" rel="nofollow" data-dimension112="2928e2a3-4c6c-494f-8125-40a2ebd70546" data-action="Deal Block" data-label="Havaianas sale: up to 40% off @ Amazon" data-dimension48="Havaianas sale: up to 40% off @ Amazon" data-dimension25="£"><strong>up to 40% off @ Amazon</strong></a><br>Colorful, comfortable and budget-friendly, Havaianas sandals and flip flops are ideal for those summer beach trips, backyard barbecues and pool parties.<a class="view-deal button" href="https://www.amazon.co.uk/stores/Havaianas/page/568379EC-7A7D-498D-AC4B-AE345103F16A" target="_blank" rel="nofollow" data-dimension112="2928e2a3-4c6c-494f-8125-40a2ebd70546" data-action="Deal Block" data-label="Havaianas sale: up to 40% off @ Amazon" data-dimension48="Havaianas sale: up to 40% off @ Amazon" data-dimension25="£">View Deal</a></p></div><div class="product"><a data-dimension112="a29c385f-0ff0-4f0a-b510-67ebcedb00f7" data-action="Deal Block" data-label="Invisible Hydrating Sunscreen SPF 30" data-dimension48="Invisible Hydrating Sunscreen SPF 30" data-dimension25="£14" href="https://www.amazon.co.uk/CeraVe-Invisible-Hydrating-Protection-Technology/dp/B0G1N9Z5KK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:690px;"><p class="vanilla-image-block" style="padding-top:217.39%;"><img id="tGSqr2yaP2gLFuNGRHPocE" name="Invisible Hydrating Sunscreen SPF 30" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tGSqr2yaP2gLFuNGRHPocE.jpg" mos="" align="middle" fullscreen="" width="690" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/CeraVe-Invisible-Hydrating-Protection-Technology/dp/B0G1N9Z5KK" target="_blank" rel="nofollow" data-dimension112="a29c385f-0ff0-4f0a-b510-67ebcedb00f7" data-action="Deal Block" data-label="Invisible Hydrating Sunscreen SPF 30" data-dimension48="Invisible Hydrating Sunscreen SPF 30" data-dimension25="£14">Invisible Hydrating Sunscreen SPF 30: was £21 now £14</a></strong><br>CeraVe sunscreen shields your skin from harmful UVA and UVB rays while providing all-day hydration with a water-resistant formula. Whether you're on holiday or taking a nice day out, putting on this mineral sunscreen is essential for protecting your skin in the summer. <a class="view-deal button" href="https://www.amazon.co.uk/CeraVe-Invisible-Hydrating-Protection-Technology/dp/B0G1N9Z5KK" target="_blank" rel="nofollow" data-dimension112="a29c385f-0ff0-4f0a-b510-67ebcedb00f7" data-action="Deal Block" data-label="Invisible Hydrating Sunscreen SPF 30" data-dimension48="Invisible Hydrating Sunscreen SPF 30" data-dimension25="£14">View Deal</a></p></div><div class="product"><a data-dimension112="f7685c42-be5e-44a9-a6e9-88379a35e8cc" data-action="Deal Block" data-label="Handheld Turbo Fan" data-dimension48="Handheld Turbo Fan" data-dimension25="£14" href="https://www.amazon.co.uk/dp/B0GCZVQKKK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="46c3VLpWZCtr7Fa584HawV" name="DivesBlue Fanzy deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/46c3VLpWZCtr7Fa584HawV.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Stay cool this summer with the DiveBlues Handheld Turbo Fan, a compact portable fan with a foldable design that allows it to act as a handheld fan when you're on the go, a neck fan for hands-free operation, and even as a handy desk fan that can hold itself upright. It's also super quiet and features a battery that can last up to 12 hours.<a class="view-deal button" href="https://www.amazon.co.uk/dp/B0GCZVQKKK" target="_blank" rel="nofollow" data-dimension112="f7685c42-be5e-44a9-a6e9-88379a35e8cc" data-action="Deal Block" data-label="Handheld Turbo Fan" data-dimension48="Handheld Turbo Fan" data-dimension25="£14">View Deal</a></p></div><div class="product"><a data-dimension112="b6581aed-7902-483c-bf4d-c5e26430cd81" data-action="Deal Block" data-label="FreeSip" data-dimension48="FreeSip" data-dimension25="£24" href="https://www.amazon.co.uk/Owala-FreeSip-Insulated-Stainless-BPA-Free/dp/B0C59CLN29" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:290px;"><p class="vanilla-image-block" style="padding-top:338.62%;"><img id="dDnhZ8VLJSfNVxV2Y7oqYG" name="FreeSip" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dDnhZ8VLJSfNVxV2Y7oqYG.jpg" mos="" align="middle" fullscreen="" width="290" height="982" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Owala FreeSip's lid makes it one of the best bottles out there. It flips open smoothly every time and gets you access to both a straw and a chug opening, suiting your needs on the go.<a class="view-deal button" href="https://www.amazon.co.uk/Owala-FreeSip-Insulated-Stainless-BPA-Free/dp/B0C59CLN29" target="_blank" rel="nofollow" data-dimension112="b6581aed-7902-483c-bf4d-c5e26430cd81" data-action="Deal Block" data-label="FreeSip" data-dimension48="FreeSip" data-dimension25="£24">View Deal</a></p></div><div class="product"><a data-dimension112="81e8fde6-cc1b-4b36-a030-6e021eb0e516" data-action="Deal Block" data-label="TurboForce Power Fan" data-dimension48="TurboForce Power Fan" data-dimension25="£27" href="https://www.amazon.co.uk/Honeywell-TurboForce-Operation-Variable-Settings/dp/B0C5M8D7M8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:836px;"><p class="vanilla-image-block" style="padding-top:105.38%;"><img id="N9b3q5FpJK3nYWqfrdqMnJ" name="TurboForce Power Fan" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/N9b3q5FpJK3nYWqfrdqMnJ.jpg" mos="" align="middle" fullscreen="" width="836" height="881" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Honeywell-TurboForce-Operation-Variable-Settings/dp/B0C5M8D7M8" target="_blank" rel="nofollow" data-dimension112="81e8fde6-cc1b-4b36-a030-6e021eb0e516" data-action="Deal Block" data-label="TurboForce Power Fan" data-dimension48="TurboForce Power Fan" data-dimension25="£27">TurboForce Power Fan: was £32 now £27</a></strong><br>This powerful fan lives up to its name. It can tilt to blow air at the perfect angle and has three speed settings for a cooling breeze. It can also be mounted on a wall.<a class="view-deal button" href="https://www.amazon.co.uk/Honeywell-TurboForce-Operation-Variable-Settings/dp/B0C5M8D7M8" target="_blank" rel="nofollow" data-dimension112="81e8fde6-cc1b-4b36-a030-6e021eb0e516" data-action="Deal Block" data-label="TurboForce Power Fan" data-dimension48="TurboForce Power Fan" data-dimension25="£27">View Deal</a></p></div><div class="product"><a data-dimension112="c7890336-27a4-4636-95c5-97b0d57eca93" data-action="Deal Block" data-label="Portable Neck Fan" data-dimension48="Portable Neck Fan" data-dimension25="£28" href="https://www.amazon.co.uk/Portable-Bladeless-Operated-Rechargeable-Headphone/dp/B08911JGGW/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="BPyktKGwtWLvxHdZMPJnXc" name="Portable Neck Fan" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BPyktKGwtWLvxHdZMPJnXc.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Portable-Bladeless-Operated-Rechargeable-Headphone/dp/B08911JGGW/" target="_blank" rel="nofollow" data-dimension112="c7890336-27a4-4636-95c5-97b0d57eca93" data-action="Deal Block" data-label="Portable Neck Fan" data-dimension48="Portable Neck Fan" data-dimension25="£28">Portable Neck Fan: was £33 now £28</a></strong><br>This rechargeable neck comes with five speeds.  Simply press the power button repeatedly to adjust to the perfect power level. Designed to keep you cool in comfort, it's ultra-light and quiet, and its charge lasts up to 16 hours.<br><strong>Price check: </strong><a href="https://www.currys.co.uk/products/jisulife-portable-neck-fan-3-grey-10300767.html" target="_blank" rel="nofollow"><strong>£29 @ Currys</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/Portable-Bladeless-Operated-Rechargeable-Headphone/dp/B08911JGGW/" target="_blank" rel="nofollow" data-dimension112="c7890336-27a4-4636-95c5-97b0d57eca93" data-action="Deal Block" data-label="Portable Neck Fan" data-dimension48="Portable Neck Fan" data-dimension25="£28">View Deal</a></p></div><div class="product"><a data-dimension112="d7950ed5-4ace-4408-a522-4982f517ef55" data-action="Deal Block" data-label="Cooling Blanket" data-dimension48="Cooling Blanket" data-dimension25="£33" href="https://www.amazon.co.uk/Bedsure-Cooling-Blanket-Double-Bed/dp/B0G2XZT1ZZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="EuHMfcUaA9yRUN3FE5McmA" name="Bedsure cooling blanket" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EuHMfcUaA9yRUN3FE5McmA.png" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Bedsure-Cooling-Blanket-Double-Bed/dp/B0G2XZT1ZZ" target="_blank" rel="nofollow" data-dimension112="d7950ed5-4ace-4408-a522-4982f517ef55" data-action="Deal Block" data-label="Cooling Blanket" data-dimension48="Cooling Blanket" data-dimension25="£33">Cooling Blanket: was £36 now £33</a></strong><br>Made from a super thin rayon derived from bamboo fabric, this blanket is cool to touch and moisture wicking. In fact, Bedsure claim it is 10 times more breathable and absorbent than cotton. It's the perfect layer to snuggle under without overheating.<a class="view-deal button" href="https://www.amazon.co.uk/Bedsure-Cooling-Blanket-Double-Bed/dp/B0G2XZT1ZZ" target="_blank" rel="nofollow" data-dimension112="d7950ed5-4ace-4408-a522-4982f517ef55" data-action="Deal Block" data-label="Cooling Blanket" data-dimension48="Cooling Blanket" data-dimension25="£33">View Deal</a></p></div><div class="product"><a data-dimension112="970eb731-f660-4d12-9a05-8877ffbb2eef" data-action="Deal Block" data-label="Freeze Wand Ice Cream Maker" data-dimension48="Freeze Wand Ice Cream Maker" data-dimension25="£79" href="https://www.amazon.co.uk/Cuisinart-Freeze-Wand%C2%AE-dessert-presets/dp/B0F94LC1BR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vvsCxwiZuzn8oGXxq7Tci6" name="Cuisinart fast freeze" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vvsCxwiZuzn8oGXxq7Tci6.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/home/kitchen-dining/i-love-my-ninja-creami-but-cuisinarts-affordable-handheld-alternative-just-blew-me-away" data-dimension112="970eb731-f660-4d12-9a05-8877ffbb2eef" data-action="Deal Block" data-label="Freeze Wand Ice Cream Maker" data-dimension48="Freeze Wand Ice Cream Maker" data-dimension25="£79">Cuisinart Freeze Wand Ice Cream Maker</a> turns frozen ingredients into tasty ice cream in a flash. It really does work like magic! It has five settings, and comes with three containers to make all your favorite flavours. Click the on-page coupon for the full discount.<a class="view-deal button" href="https://www.amazon.co.uk/Cuisinart-Freeze-Wand%C2%AE-dessert-presets/dp/B0F94LC1BR" target="_blank" rel="nofollow" data-dimension112="970eb731-f660-4d12-9a05-8877ffbb2eef" data-action="Deal Block" data-label="Freeze Wand Ice Cream Maker" data-dimension48="Freeze Wand Ice Cream Maker" data-dimension25="£79">View Deal</a></p></div><div class="product"><a data-dimension112="8ffdb5a1-08a7-4c34-879d-b40b5183ce32" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£80" href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="CERqwPnM6zij6hpVVKyAXf" name="Compact 47 cm Portable Kettle Charcoal BBQ" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CERqwPnM6zij6hpVVKyAXf.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow" data-dimension112="8ffdb5a1-08a7-4c34-879d-b40b5183ce32" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£80">Compact 47 cm Portable Kettle Charcoal BBQ: was £94 now £80</a></strong><br>Weber makes some of the <a href="https://www.tomsguide.com/best-picks/best-grills" target="_blank" rel="nofollow">best grills</a> we've tested, and this is one of the more affordable entry-level options. It has 47cm of cooking space, perfect for everything from burgers to kebabs. Plus, there are wheels to move it around easily.<br><strong>Price check: </strong><a href="https://www.currys.co.uk/products/weber-compact-47-cm-portable-kettle-charcoal-bbq-black-10299398.html" target="_blank" rel="nofollow"><strong>£89 @ Currys</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/Weber-Charcoal-Rust-Resistant-Porcelain-Enamelled-Thermometer/dp/B0FTZN1YYZ" target="_blank" rel="nofollow" data-dimension112="8ffdb5a1-08a7-4c34-879d-b40b5183ce32" data-action="Deal Block" data-label="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension48="Compact 47 cm Portable Kettle Charcoal BBQ" data-dimension25="£80">View Deal</a></p></div><div class="product"><a data-dimension112="359f435c-79ac-4fe0-9671-58bf5d375017" data-action="Deal Block" data-label="42" Smart Tower Fan 2 Max" data-dimension48="42" Smart Tower Fan 2 Max" data-dimension25="£91" href="https://www.amazon.co.uk/GoveeLife-42-inch-Bladeless-Electric-Oscillation/dp/B0DSKJ3XVT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="tvp7QyDbncR7Lu5r39ozcV" name="H7105-PP_-1_1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tvp7QyDbncR7Lu5r39ozcV.webp" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/GoveeLife-42-inch-Bladeless-Electric-Oscillation/dp/B0DSKJ3XVT" target="_blank" rel="nofollow" data-dimension112="359f435c-79ac-4fe0-9671-58bf5d375017" data-action="Deal Block" data-label='42" Smart Tower Fan 2 Max' data-dimension48='42" Smart Tower Fan 2 Max' data-dimension25="£91">42" Smart Tower Fan 2 Max: was £149 now £91</a></strong><br>The <a href="https://www.tomsguide.com/home/smart-home/i-bought-a-smart-fan-to-beat-the-heat-and-i-never-thought-id-have-this-much-fun-controlling-a-fan-from-my-phone">Govee 42-inch Smart Tower Fan 2 Max</a> can be controlled using your phone or your voice with a smart speaker, but there are also physical controls on the top. In the app, you can switch between its 5 included modes or create your own, turn oscillation on or off or adjust the angle the fan turns in and even change the color of its RGB night light. Redeem the on-page digital coupon to get this deal.<a class="view-deal button" href="https://www.amazon.co.uk/GoveeLife-42-inch-Bladeless-Electric-Oscillation/dp/B0DSKJ3XVT" target="_blank" rel="nofollow" data-dimension112="359f435c-79ac-4fe0-9671-58bf5d375017" data-action="Deal Block" data-label="42" Smart Tower Fan 2 Max" data-dimension48="42" Smart Tower Fan 2 Max" data-dimension25="£91">View Deal</a></p></div><div class="product"><a data-dimension112="7d0b4526-4a36-42f5-9b73-058c0e041a87" data-action="Deal Block" data-label="FrostVault 28L Cool Box" data-dimension48="FrostVault 28L Cool Box" data-dimension25="£179" href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:94.07%;"><img id="maDaBVSHkDxhiwabWoMfW" name="FrostVault" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/maDaBVSHkDxhiwabWoMfW.jpg" mos="" align="middle" fullscreen="" width="1500" height="1411" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow" data-dimension112="7d0b4526-4a36-42f5-9b73-058c0e041a87" data-action="Deal Block" data-label="FrostVault 28L Cool Box" data-dimension48="FrostVault 28L Cool Box" data-dimension25="£179">FrostVault 28L Cool Box: was £249 now £179</a></strong><br>The Ninja FrostVault cooler is the <a href="https://www.tomsguide.com/best-picks/best-coolers">best cooler</a> we've tested and is a go-to for hot summer adventures. The 28L cooler can hold up to 48 cans and keeps them cool for 8 days! The wheels also mean you don't have to carry it, making it easy to manoeuvre even when full. <a class="view-deal button" href="https://www.amazon.co.uk/Ninja-FrostVault-Heavy-Duty-Integrated-Fridge-Temp/dp/B0DYKZ16JX/?th=1&psc=1" target="_blank" rel="nofollow" data-dimension112="7d0b4526-4a36-42f5-9b73-058c0e041a87" data-action="Deal Block" data-label="FrostVault 28L Cool Box" data-dimension48="FrostVault 28L Cool Box" data-dimension25="£179">View Deal</a></p></div><div data-model-name="Apple AirPods 4" data-widget-type="review" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video movies to stream this weekend (June 19-21) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The weekends are made for watching movies, and when it’s a longer weekend, you’ve got even more time to stream some great films. And when it comes to movie choices, Prime Video is one of the best streaming services. The Amazon-backed platform already has a vast library, and it’s regularly adding new options for subscribers to add to their watchlists. </p><p>Of course, there’s a downside to having so much choice: you might spend more time over the Juneteenth weekend trying to decide what to watch than actually streaming. That’s why I’ve combed through <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">Prime Video's June 2026 slate</a> and picked out a trio of recent arrivals that you should consider watching this weekend. There’s plenty of variety in my selections, from a coming-of-age tale to a steamy romantic drama and a family pick.</p><p>These are the new to Prime Video movies that you should stream over the long weekend.</p><h2 id="are-you-there-god-it-s-me-margaret-2023">'Are You There, God? It’s Me Margaret’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/LzRzojHC3iE" allowfullscreen></iframe></div></div><p>Based on Judy Blume’s seminal coming-of-age novel of the same name, I’m told that “Are You There, God? It’s Me Margaret” is highly relatable. I can’t quite verify that as it’s about an 11-year-old girl going through puberty, and for the avoidance of doubt, I am not, nor have I ever been, a middle school girl. </p><p>But I can confirm it’s a funny and compelling story about growing up and all the awkward moments and hurdles that come along with adolescence. </p><p>Set in the 1970s, Margaret is far from pleased when her parents (Rachel McAdams and Benny Safdie) inform her they’re uprooting the family from New York City to a New Jersey suburb. Settling into her new suburban home, she faces growing pains as she tries to make new friends and come to terms with the changes in her life. But on hand to offer support are her caring mother (McAdams) and her fiercely protective grandmother (Kathy Bates). </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GLTQLYHZ" target="_blank" rel="nofollow"><em><strong>"Are You There, God? It’s Me Margaret" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="your-fault-london-2026">‘Your Fault: London’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/A3ZbjkDxYUs" allowfullscreen></iframe></div></div><p>Cards on the table, I’m not exactly clued up on the “Fault” universe (is it even called that?), I skipped the first movie, “My Fault: London,” released last year, so naturally haven’t watched this sequel yet. My colleague Alix Blackburn was a fan, saying the movie “works thanks to stronger production, bigger scale and even better chemistry between Nick and Noah. It’s predictable, but addictive.” Which is enough of an endorsement for me to include it here.</p><p>Naturally set after its predecessor, in “Your Fault: London,” the forbidden romance between Noah (Asha Banks) and her stepbrother Nick (Matthew Broome) gets taken up a notch, but as they each move in opposite directions, they might be ripped apart for good. As Noah studies at Oxford, Nick is distracted by his work, and they also meet new people, which brings jealousy. Their romantic bond is tested and might not survive this new chapter.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXLK943G" target="_blank" rel="nofollow"><em><strong>"Your Fault: London" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X16Y2e"></div>                            </div>                            <script src="https://kwizly.com/embed/X16Y2e.js" async></script><h2 id="the-spongebob-movie-search-for-squarepants-2025">‘The SpongeBob Movie: Search for SquarePants’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/XdPt8QWTypI" allowfullscreen></iframe></div></div><p>Here’s one for the family to enjoy together in the form of the latest big-screen outing for everybody’s favorite absorbent, tie-wearing sponge, “The SpongeBob Movie: Search for SquarePants.” It retains the 3D animation style of its predecessor, 2020’s “Sponge on the Run,” which disappointed some SpongeBob purists (yes, those exist!), but it’s another charmingly silly event for a cartoon character who’s been iconic across the globe. </p><p>After being too scared to ride an intense roller coaster at the Binkki Bottom amusement park, SpongeBob is desperate to prove his bravery to Mr. Krabs. This quest to prove he’s not a chicken leads to an encounter with The Flying Dutchman, a spooky pirate ghost, and soon SpongeBob and his best friend Patrick embark on an adventure to the ocean’s deepest depths. Packed with whimsy, slapstick comedy and just a dash of mystery, it’s goofy fun.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/SpongeBob-Movie-Search-SquarePants/dp/B0G1995C53/" target="_blank" rel="nofollow"><em><strong>"The SpongeBob Movie: Search for SquarePants" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-new-to-netflix-movies-you-should-stream-this-weekend-june-19-21">3 best new to Netflix movies you should stream this weekend</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-forgotten-crime-mystery-with-denzel-washington-and-eva-mendes-june-16-22">3 new to Prime Video thriller movies to stream this week</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-movies-to-stream-this-weekend-june-19-21</link>
                                                                            <description>
                            <![CDATA[ These are the recently added movies on Prime Video to add to your watchlist this week, including a new original and a SpongeBob film. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hrdTK3bPMasFhiAFWv75ZF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RBEkPX8MHun7dvqTrBme8Y-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/RBEkPX8MHun7dvqTrBme8Y-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a green leafy background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a green leafy background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a green leafy background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RBEkPX8MHun7dvqTrBme8Y-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The weekends are made for watching movies, and when it’s a longer weekend, you’ve got even more time to stream some great films. And when it comes to movie choices, Prime Video is one of the best streaming services. The Amazon-backed platform already has a vast library, and it’s regularly adding new options for subscribers to add to their watchlists. </p><p>Of course, there’s a downside to having so much choice: you might spend more time over the Juneteenth weekend trying to decide what to watch than actually streaming. That’s why I’ve combed through <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">Prime Video's June 2026 slate</a> and picked out a trio of recent arrivals that you should consider watching this weekend. There’s plenty of variety in my selections, from a coming-of-age tale to a steamy romantic drama and a family pick.</p><p>These are the new to Prime Video movies that you should stream over the long weekend.</p><h2 id="are-you-there-god-it-s-me-margaret-2023">'Are You There, God? It’s Me Margaret’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/LzRzojHC3iE" allowfullscreen></iframe></div></div><p>Based on Judy Blume’s seminal coming-of-age novel of the same name, I’m told that “Are You There, God? It’s Me Margaret” is highly relatable. I can’t quite verify that as it’s about an 11-year-old girl going through puberty, and for the avoidance of doubt, I am not, nor have I ever been, a middle school girl. </p><p>But I can confirm it’s a funny and compelling story about growing up and all the awkward moments and hurdles that come along with adolescence. </p><p>Set in the 1970s, Margaret is far from pleased when her parents (Rachel McAdams and Benny Safdie) inform her they’re uprooting the family from New York City to a New Jersey suburb. Settling into her new suburban home, she faces growing pains as she tries to make new friends and come to terms with the changes in her life. But on hand to offer support are her caring mother (McAdams) and her fiercely protective grandmother (Kathy Bates). </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GLTQLYHZ" target="_blank" rel="nofollow"><em><strong>"Are You There, God? It’s Me Margaret" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="your-fault-london-2026">‘Your Fault: London’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/A3ZbjkDxYUs" allowfullscreen></iframe></div></div><p>Cards on the table, I’m not exactly clued up on the “Fault” universe (is it even called that?), I skipped the first movie, “My Fault: London,” released last year, so naturally haven’t watched this sequel yet. My colleague Alix Blackburn was a fan, saying the movie “works thanks to stronger production, bigger scale and even better chemistry between Nick and Noah. It’s predictable, but addictive.” Which is enough of an endorsement for me to include it here.</p><p>Naturally set after its predecessor, in “Your Fault: London,” the forbidden romance between Noah (Asha Banks) and her stepbrother Nick (Matthew Broome) gets taken up a notch, but as they each move in opposite directions, they might be ripped apart for good. As Noah studies at Oxford, Nick is distracted by his work, and they also meet new people, which brings jealousy. Their romantic bond is tested and might not survive this new chapter.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXLK943G" target="_blank" rel="nofollow"><em><strong>"Your Fault: London" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X16Y2e"></div>                            </div>                            <script src="https://kwizly.com/embed/X16Y2e.js" async></script><h2 id="the-spongebob-movie-search-for-squarepants-2025">‘The SpongeBob Movie: Search for SquarePants’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/XdPt8QWTypI" allowfullscreen></iframe></div></div><p>Here’s one for the family to enjoy together in the form of the latest big-screen outing for everybody’s favorite absorbent, tie-wearing sponge, “The SpongeBob Movie: Search for SquarePants.” It retains the 3D animation style of its predecessor, 2020’s “Sponge on the Run,” which disappointed some SpongeBob purists (yes, those exist!), but it’s another charmingly silly event for a cartoon character who’s been iconic across the globe. </p><p>After being too scared to ride an intense roller coaster at the Binkki Bottom amusement park, SpongeBob is desperate to prove his bravery to Mr. Krabs. This quest to prove he’s not a chicken leads to an encounter with The Flying Dutchman, a spooky pirate ghost, and soon SpongeBob and his best friend Patrick embark on an adventure to the ocean’s deepest depths. Packed with whimsy, slapstick comedy and just a dash of mystery, it’s goofy fun.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/SpongeBob-Movie-Search-SquarePants/dp/B0G1995C53/" target="_blank" rel="nofollow"><em><strong>"The SpongeBob Movie: Search for SquarePants" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-new-to-netflix-movies-you-should-stream-this-weekend-june-19-21">3 best new to Netflix movies you should stream this weekend</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-forgotten-crime-mystery-with-denzel-washington-and-eva-mendes-june-16-22">3 new to Prime Video thriller movies to stream this week</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon devices are up to 79% off a week before Prime Day — Ring, Blink, Fire TV and more deals from just £16 ]]></title>
                                                                                                <dc:content><![CDATA[ <p><a href="https://www.tomsguide.com/uk/news/best-prime-day-deals-and-sales">Prime Day</a> is almost here. But Amazon isn't waiting around — there are already huge deals up for grabs on a large range of devices. Now's the time to upgrade your streaming stick, video doorbell or security cameras!</p><p>In a hurry? The <a href="https://www.amazon.co.uk/blink-mini-2k-/dp/B0F3BC7TRP" target="_blank" rel="nofollow">Blink Mini 2K+ for £16</a> is an absolute <em>steal</em>. You can also score big savings on TVs, like the <a href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow">Amazon Ember 75-inch Mini-LED Fire TV for £999</a> — it's a massive £600 off.</p><p>Keep scrolling to see all my favorite Amazon device deals! (And don't forget to <a href="https://www.amazon.co.uk/amazonprime" target="_blank" rel="nofollow">sign up for a Prime membership</a> to get ready for more Prime Day deals.)</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.amazon.co.uk/deals" target="_blank" rel="nofollow"><strong>shop all deals at Amazon</strong></a></li><li><strong>Alexa devices: </strong><a href="https://www.amazon.co.uk/s?rh=n%3A341686031%2Cp_n_deal_type%3A26901100031" target="_blank" rel="nofollow"><strong>Ring, Blink, Fire TV from £16</strong></a></li><li><strong>Blink Mini 2K+: </strong><a href="https://www.amazon.co.uk/blink-mini-2k-/dp/B0F3BCVPNJ" target="_blank" rel="nofollow"><strong>was £39 now £16</strong></a></li><li><strong>Blink Outdoor 4 Camera + Video Doorbell + Sync Module Core: </strong><a href="https://www.amazon.co.uk/Blink-Doorbell-Wireless-security-detection/dp/B0FLY6B25Q" target="_blank" rel="nofollow"><strong>was £119 now £24</strong></a></li><li><strong>Ring Video Doorbell: </strong><a href="https://www.amazon.co.uk/ring-battery-video-doorbell-diy-wireless-video-doorbell-camera-with-head-to-toe-view-hd-video-easy-to-install-5-min-30-day-free-trial-of-ring-protect/dp/B0BZWQP9Z1" target="_blank" rel="nofollow"><strong>was £99 now £34</strong></a></li><li><strong>Ring Outdoor Cam Plus: </strong><a href="https://www.amazon.co.uk/ring-outdoor-camera-plus-battery/dp/B0D23XCY18" target="_blank" rel="nofollow"><strong>was £99 now £49</strong></a></li><li><strong>Amazon Fire TV 50" 4-Series: </strong><a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow"><strong>was £499 now £279</strong></a></li><li><strong>Amazon Ember 75" Mini-LED Series with Fire TV: </strong><a href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow"><strong>was £1,599 now £999</strong></a></li></ul><h3 class="article-body__section" id="section-blink"><span>Blink</span></h3><div class="product"><a data-dimension112="670c12b4-f861-41cf-b5db-5db12f33e754" data-action="Deal Block" data-label="Mini 2K+" data-dimension48="Mini 2K+" data-dimension25="£16" href="https://www.amazon.co.uk/blink-mini-2k-/dp/B0F3BCVPNJ" 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:148.56%;"><img id="Mqm7zhkLf5CESquJhuX7Zg" name="Blink Mini 2K+ deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Mqm7zhkLf5CESquJhuX7Zg.jpg" mos="" align="middle" fullscreen="" width="900" height="1337" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Blink Mini 2K+ debuted in 2025 and offers higher resolution (2560 x 1440) than its predecessor for indoor monitoring. It offers up to 4x zoom, night color vision and a 138-degree field of view. It can also be paired with the Blink Arc mount accessory for a wider scope.<a class="view-deal button" href="https://www.amazon.co.uk/blink-mini-2k-/dp/B0F3BCVPNJ" target="_blank" rel="nofollow" data-dimension112="670c12b4-f861-41cf-b5db-5db12f33e754" data-action="Deal Block" data-label="Mini 2K+" data-dimension48="Mini 2K+" data-dimension25="£16">View Deal</a></p></div><div class="product"><a data-dimension112="7d8557dc-77a8-42b6-b480-ac7e34480c4b" data-action="Deal Block" data-label="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension48="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension25="£24" href="https://www.amazon.co.uk/Blink-Doorbell-Wireless-security-detection/dp/B0FLY6B25Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="U67HYXvzJyMdSNeUaoT4Ai" name="Outdoor 4 Camera + Video Doorbell + Sync Module Core" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/U67HYXvzJyMdSNeUaoT4Ai.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Blink-Doorbell-Wireless-security-detection/dp/B0FLY6B25Q" target="_blank" rel="nofollow" data-dimension112="7d8557dc-77a8-42b6-b480-ac7e34480c4b" data-action="Deal Block" data-label="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension48="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension25="£24">Outdoor 4 Camera + Video Doorbell + Sync Module Core: was £119 now £24</a></strong><br>This bundle is 79% off and provides unbelievably good value for money. For just £24, you're getting a Blink Outdoor 4 Camera with a Sync Module and a Video Doorbell too. It's the perfect way to set up a smart home security system for the first time.<a class="view-deal button" href="https://www.amazon.co.uk/Blink-Doorbell-Wireless-security-detection/dp/B0FLY6B25Q" target="_blank" rel="nofollow" data-dimension112="7d8557dc-77a8-42b6-b480-ac7e34480c4b" data-action="Deal Block" data-label="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension48="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension25="£24">View Deal</a></p></div><div class="product"><a data-dimension112="a19da4a6-e601-4fbd-8dd7-757265235fc4" data-action="Deal Block" data-label="Battery Doorbell 2K+" data-dimension48="Battery Doorbell 2K+" data-dimension25="£29" href="https://www.amazon.co.uk/blink-battery-doorbell-2k-/dp/B0G62C2L2W" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:938px;"><p class="vanilla-image-block" style="padding-top:159.91%;"><img id="tzHURhDDBH7RCousLAcAuA" name="Battery Doorbell 2K+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tzHURhDDBH7RCousLAcAuA.jpg" mos="" align="middle" fullscreen="" width="938" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/home/smart-home/the-blink-battery-doorbell-2k-checks-all-of-the-boxes-for-a-budget-friendly-video-doorbell" data-dimension112="a19da4a6-e601-4fbd-8dd7-757265235fc4" data-action="Deal Block" data-label="Battery Doorbell 2K+" data-dimension48="Battery Doorbell 2K+" data-dimension25="£29">Blink Battery Doorbell 2K+</a> is our new winner for the <a href="https://www.tomsguide.com/us/best-video-doorbells,review-4468.html">best video doorbell</a> on a budget. You get sharp 2K video and incredible battery life that lasts up to 22 months. Right now you can get it for 58% off — that means this deal is pretty much a no-brainer. (Unless you want to pick up the older doorbell in the bundle deal above.)<a class="view-deal button" href="https://www.amazon.co.uk/blink-battery-doorbell-2k-/dp/B0G62C2L2W" target="_blank" rel="nofollow" data-dimension112="a19da4a6-e601-4fbd-8dd7-757265235fc4" data-action="Deal Block" data-label="Battery Doorbell 2K+" data-dimension48="Battery Doorbell 2K+" data-dimension25="£29">View Deal</a></p></div><h3 class="article-body__section" id="section-fire-tv-sticks"><span>Fire TV Sticks</span></h3><div class="product"><a data-dimension112="ef17373b-d353-4ee3-80a5-aa1b5a16a87c" data-action="Deal Block" data-label="Fire TV Stick 4K Plus" data-dimension48="Fire TV Stick 4K Plus" data-dimension25="£24" href="https://www.amazon.co.uk/Amazon-streaming-device-supports-Vision/dp/B0F7ZFCZNL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:80.33%;"><img id="aQREGkw7zzGLw4rboeHqp8" name="Stick 4K Max" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aQREGkw7zzGLw4rboeHqp8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1205" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fire TV Stick 4K Plus sits in the middle of the Fire TV range, above the HD and 4K Select, but below the 4K Max and Cube. You get 4K video, Dolby Vision/HDR10/HDR10+/HLG support, Dolby Atmos audio, and most importantly, full support for almost all VPNs. For less than £25, though, it's a cheap way into true 4K TV.<a class="view-deal button" href="https://www.amazon.co.uk/Amazon-streaming-device-supports-Vision/dp/B0F7ZFCZNL" target="_blank" rel="nofollow" data-dimension112="ef17373b-d353-4ee3-80a5-aa1b5a16a87c" data-action="Deal Block" data-label="Fire TV Stick 4K Plus" data-dimension48="Fire TV Stick 4K Plus" data-dimension25="£24">View Deal</a></p></div><h3 class="article-body__section" id="section-ring"><span>Ring</span></h3><div class="product"><a data-dimension112="3cedf890-1736-47da-be64-8bfd293d2ae6" data-action="Deal Block" data-label="Indoor Cam Plus" data-dimension48="Indoor Cam Plus" data-dimension25="£24" href="https://www.amazon.co.uk/ring-indoor-camera-plus/dp/B0DXMGKCN1?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:938px;"><p class="vanilla-image-block" style="padding-top:159.91%;"><img id="EYHH5SV2AKX4RqSSgiNCGG" name="Indoor Cam Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EYHH5SV2AKX4RqSSgiNCGG.jpg" mos="" align="middle" fullscreen="" width="938" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>On sale for £24, the all-new Ring Indoor Cam Plus is a great addition to the Ring ecosystem. It pumps out sharp video, even in low light, offers versatile placement options and is super easy to set up. <a class="view-deal button" href="https://www.amazon.co.uk/ring-indoor-camera-plus/dp/B0DXMGKCN1?" target="_blank" rel="nofollow" data-dimension112="3cedf890-1736-47da-be64-8bfd293d2ae6" data-action="Deal Block" data-label="Indoor Cam Plus" data-dimension48="Indoor Cam Plus" data-dimension25="£24">View Deal</a></p></div><div class="product"><a data-dimension112="ebaed17d-30d7-4c70-9039-558653cdff87" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£34" href="https://www.amazon.co.uk/ring-battery-video-doorbell-diy-wireless-video-doorbell-camera-with-head-to-toe-view-hd-video-easy-to-install-5-min-30-day-free-trial-of-ring-protect/dp/B0BZWQP9Z1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="uGHuDwiBGmuWDsES3TwwoJ" name="1657639746.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uGHuDwiBGmuWDsES3TwwoJ.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/ring-battery-video-doorbell-diy-wireless-video-doorbell-camera-with-head-to-toe-view-hd-video-easy-to-install-5-min-30-day-free-trial-of-ring-protect/dp/B0BZWQP9Z1" target="_blank" rel="nofollow" data-dimension112="ebaed17d-30d7-4c70-9039-558653cdff87" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£34">Battery Doorbell: was £99 now £34</a></strong><br>At just £34, the best value Ring Video Doorbell got even better. The newest of Ring's doorbells has head-to-toe video and package detection. You can't replace its battery, but it's a fantastic option at this price. <a class="view-deal button" href="https://www.amazon.co.uk/ring-battery-video-doorbell-diy-wireless-video-doorbell-camera-with-head-to-toe-view-hd-video-easy-to-install-5-min-30-day-free-trial-of-ring-protect/dp/B0BZWQP9Z1" target="_blank" rel="nofollow" data-dimension112="ebaed17d-30d7-4c70-9039-558653cdff87" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£34">View Deal</a></p></div><div class="product"><a data-dimension112="312e6c34-aab1-4984-a3e9-e09562b496b2" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£39" href="https://www.amazon.co.uk/ring-battery-video-doorbell/dp/B0FHJ91JY5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:938px;"><p class="vanilla-image-block" style="padding-top:159.91%;"><img id="uJxu2kMc4UDAJ9YdqYqo6Q" name="Battery Doorbell" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uJxu2kMc4UDAJ9YdqYqo6Q.jpg" mos="" align="middle" fullscreen="" width="938" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/ring-battery-video-doorbell/dp/B0FHJ91JY5" target="_blank" rel="nofollow" data-dimension112="312e6c34-aab1-4984-a3e9-e09562b496b2" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£39">Battery Doorbell: was £79 now £39</a></strong><br>The Ring Video Doorbell (2nd Gen) now comes in a slimmer shell, and new colorways — this one has a speckled gray finish. You get Retinal 2K video, 6x zoom and two-way talk.<a class="view-deal button" href="https://www.amazon.co.uk/ring-battery-video-doorbell/dp/B0FHJ91JY5" target="_blank" rel="nofollow" data-dimension112="312e6c34-aab1-4984-a3e9-e09562b496b2" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£39">View Deal</a></p></div><div class="product"><a data-dimension112="f090d0cf-46e2-4f4c-9b40-2ad1ae4f17a1" data-action="Deal Block" data-label="Outdoor Cam Plus" data-dimension48="Outdoor Cam Plus" data-dimension25="£49" href="https://www.amazon.co.uk/ring-outdoor-camera-plus-battery/dp/B0D23XCY18" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="pVEPLNb4BwzSVyTsLwCC9f" name="Outdoor Cam" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pVEPLNb4BwzSVyTsLwCC9f.jpg" mos="" align="middle" fullscreen="" width="3000" height="3000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/ring-outdoor-camera-plus-battery/dp/B0D23XCY18" target="_blank" rel="nofollow" data-dimension112="f090d0cf-46e2-4f4c-9b40-2ad1ae4f17a1" data-action="Deal Block" data-label="Outdoor Cam Plus" data-dimension48="Outdoor Cam Plus" data-dimension25="£49">Outdoor Cam Plus: was £99 now £49</a></strong><br>If you don't need a spotlight or a floodlight camera, the Stick Up Cam is a cheaper way to monitor the outside of your house. It features Retinal 2K video and two-way talk.<a class="view-deal button" href="https://www.amazon.co.uk/ring-outdoor-camera-plus-battery/dp/B0D23XCY18" target="_blank" rel="nofollow" data-dimension112="f090d0cf-46e2-4f4c-9b40-2ad1ae4f17a1" data-action="Deal Block" data-label="Outdoor Cam Plus" data-dimension48="Outdoor Cam Plus" data-dimension25="£49">View Deal</a></p></div><h3 class="article-body__section" id="section-fire-tvs"><span>Fire TVs</span></h3><div class="product"><a data-dimension112="69d4fe9b-fad7-45bc-ba49-b7000d0b2179" data-action="Deal Block" data-label="32" 2-Series Fire TV" data-dimension48="32" 2-Series Fire TV" data-dimension25="£129" href="https://www.amazon.co.uk/fire-tv-2-series/dp/B0F75D71RN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1106px;"><p class="vanilla-image-block" style="padding-top:60.04%;"><img id="ua6tAad9cyE65ngXrJ9eja" name="Amazon Fire TV 2 Series deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ua6tAad9cyE65ngXrJ9eja.jpg" mos="" align="middle" fullscreen="" width="1106" height="664" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/fire-tv-2-series/dp/B0F75D71RN" target="_blank" rel="nofollow" data-dimension112="69d4fe9b-fad7-45bc-ba49-b7000d0b2179" data-action="Deal Block" data-label='32" 2-Series Fire TV' data-dimension48='32" 2-Series Fire TV' data-dimension25="£129">32" 2-Series Fire TV: was £249 now £129</a></strong><br>This budget-friendly TV is the cheapest in Amazon's Fire TV lineup. It offers Wi-Fi 6 support, HDR10/HLG support and Dolby audio. The included Alexa Voice Remote allows for voice control and can manage power and volume on compatible devices.<a class="view-deal button" href="https://www.amazon.co.uk/fire-tv-2-series/dp/B0F75D71RN" target="_blank" rel="nofollow" data-dimension112="69d4fe9b-fad7-45bc-ba49-b7000d0b2179" data-action="Deal Block" data-label="32" 2-Series Fire TV" data-dimension48="32" 2-Series Fire TV" data-dimension25="£129">View Deal</a></p></div><div class="product"><a data-dimension112="98a6bb38-6f5f-4c8c-8089-e853a8a56e69" data-action="Deal Block" data-label="50" 4-Series 4K Fire TV" data-dimension48="50" 4-Series 4K Fire TV" data-dimension25="£279" href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:68.06%;"><img id="aUodJSoNAstkNUc4Lq2DSV" name="Amazon Fire TV 4-Series deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aUodJSoNAstkNUc4Lq2DSV.jpg" mos="" align="middle" fullscreen="" width="1080" height="735" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow" data-dimension112="98a6bb38-6f5f-4c8c-8089-e853a8a56e69" data-action="Deal Block" data-label='50" 4-Series 4K Fire TV' data-dimension48='50" 4-Series 4K Fire TV' data-dimension25="£279">50" 4-Series 4K Fire TV: was £499 now £279</a></strong><br>This budget-friendly 4K TV is an upgrade from the entry-level 2-Series, offering better picture quality and faster performance. You also get Wi-Fi 6 support, HDR10/HLG support and Dolby Digital Plus audio. The included Alexa Voice Remote allows for voice control and can manage power and volume on compatible devices. <a class="view-deal button" href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow" data-dimension112="98a6bb38-6f5f-4c8c-8089-e853a8a56e69" data-action="Deal Block" data-label="50" 4-Series 4K Fire TV" data-dimension48="50" 4-Series 4K Fire TV" data-dimension25="£279">View Deal</a></p></div><div class="product"><a data-dimension112="ecdb8094-bf35-4d7c-abdb-15b9cc4d4c0f" data-action="Deal Block" data-label="40" 2-Series 4K Fire TV & Soundbar Bundle" data-dimension48="40" 2-Series 4K Fire TV & Soundbar Bundle" data-dimension25="£329" href="https://www.amazon.co.uk/dp/B0GL37W5Y4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1097px;"><p class="vanilla-image-block" style="padding-top:78.58%;"><img id="qLWzcGUpHB4XPhQUxbz4eb" name="40" 2-Series 4K Fire TV & Soundbar Bundle" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qLWzcGUpHB4XPhQUxbz4eb.jpg" mos="" align="middle" fullscreen="" width="1097" height="862" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/dp/B0GL37W5Y4" target="_blank" rel="nofollow" data-dimension112="ecdb8094-bf35-4d7c-abdb-15b9cc4d4c0f" data-action="Deal Block" data-label='40" 2-Series 4K Fire TV & Soundbar Bundle' data-dimension48='40" 2-Series 4K Fire TV & Soundbar Bundle' data-dimension25="£329">40" 2-Series 4K Fire TV & Soundbar Bundle: was £419 now £329</a></strong><br>This budget-friendly bundle comes with a HD Fire TV and a soundbar, getting you a super-cheap screen and sound combo. It offers Wi-Fi 6 support, HDR10/HLG support, and Dolby audio. The included Alexa Voice Remote allows for voice control and can manage power and volume on compatible devices.<a class="view-deal button" href="https://www.amazon.co.uk/dp/B0GL37W5Y4" target="_blank" rel="nofollow" data-dimension112="ecdb8094-bf35-4d7c-abdb-15b9cc4d4c0f" data-action="Deal Block" data-label="40" 2-Series 4K Fire TV & Soundbar Bundle" data-dimension48="40" 2-Series 4K Fire TV & Soundbar Bundle" data-dimension25="£329">View Deal</a></p></div><div class="product"><a data-dimension112="9c717d88-cafa-4453-a9fc-76a9e5861dbf" data-action="Deal Block" data-label="65" Ember Artline 4K QLED Fire TV" data-dimension48="65" Ember Artline 4K QLED Fire TV" data-dimension25="£789" href="https://www.amazon.co.uk/amazon-ember-artline/dp/B0GF3DZKXR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1139px;"><p class="vanilla-image-block" style="padding-top:59.70%;"><img id="hnvrzK8aWNozBd6Mjsn3WE" name="65" Ember Artline 4K QLED Fire TV" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hnvrzK8aWNozBd6Mjsn3WE.jpg" mos="" align="middle" fullscreen="" width="1139" height="680" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/amazon-ember-artline/dp/B0GF3DZKXR" target="_blank" rel="nofollow" data-dimension112="9c717d88-cafa-4453-a9fc-76a9e5861dbf" data-action="Deal Block" data-label='65" Ember Artline 4K QLED Fire TV' data-dimension48='65" Ember Artline 4K QLED Fire TV' data-dimension25="£789">65" Ember Artline 4K QLED Fire TV: was £1199 now £789</a></strong><br>The Ember Artline is a potential rival to Samsung’s popular <a href="https://www.tomsguide.com/tvs/samsung-the-frame-tv-2024-review">The Frame</a> series, featuring Dolby Vision and HDR10+ and a matte 4K screen. It's a TV that'll blend into your decor when you're not using it, and display beautiful artwork to boot.<a class="view-deal button" href="https://www.amazon.co.uk/amazon-ember-artline/dp/B0GF3DZKXR" target="_blank" rel="nofollow" data-dimension112="9c717d88-cafa-4453-a9fc-76a9e5861dbf" data-action="Deal Block" data-label="65" Ember Artline 4K QLED Fire TV" data-dimension48="65" Ember Artline 4K QLED Fire TV" data-dimension25="£789">View Deal</a></p></div><div class="product"><a data-dimension112="0ecaa7cc-56a7-47f3-8d5a-74f867ac9a08" data-action="Deal Block" data-label="75" Fire TV Omni 4K QLED TV" data-dimension48="75" Fire TV Omni 4K QLED TV" data-dimension25="£999" href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="SG34ZWodUkLTxJvMTbjPYR" name="Amazon-Fire-TV-Omni-QLED-2025-16-by-9-deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow" data-dimension112="0ecaa7cc-56a7-47f3-8d5a-74f867ac9a08" data-action="Deal Block" data-label='75" Fire TV Omni 4K QLED TV' data-dimension48='75" Fire TV Omni 4K QLED TV' data-dimension25="£999">75" Fire TV Omni 4K QLED TV: was £1599 now £999</a></strong><br>Amazon's Fire TV Omni QLED (AKA Amazon Ember) is on sale for £999. It comes with built-in Fire TV streaming capabilities and Alexa functionality. The Omni taps an array of LED backlights with local dimming for improved contrast over TVs with edge-lit displays, but note that some TVs at or below the Omni's price range offer more-advanced display technology.<a class="view-deal button" href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow" data-dimension112="0ecaa7cc-56a7-47f3-8d5a-74f867ac9a08" data-action="Deal Block" data-label="75" Fire TV Omni 4K QLED TV" data-dimension48="75" Fire TV Omni 4K QLED TV" data-dimension25="£999">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/amazon-devices-are-up-to-79-percent-off-a-week-before-prime-day-ring-blink-fire-tv-and-more-deals-from-just-gbp16</link>
                                                                            <description>
                            <![CDATA[ Now's the time to refresh your smart home — devices from Ring, Blink and Fire TV are seeing huge discounts with almost 80% off select items. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JeRrSWwJLXBwPijZLvJrh9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5e3jur5CHoNQwXp8Y5VbNV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 11:10:23 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sales Events]]></category>
                                                                                                <author><![CDATA[ millie.daviswilliams@futurenet.com (Millie Davis-Williams) ]]></author>                    <dc:creator><![CDATA[ Millie Davis-Williams ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/WU6pa7hKuxs5ScCoqcXYWA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Millie is a Deals Editor at Tom&#039;s Guide specializing in tech deals content. Based in London, Millie has spent a lifetime stubbornly refusing to pay full price on any possible purchase. She has years of searching for the best discounts on the latest and greatest phones, TVs and gadgets under her belt, and knows how to sort the best deals from the rest. Helping readers save on the products they want is her mission, whether it’s an Apple Watch or a new tablet.&lt;/p&gt;&lt;p&gt;Since working at Tom’s Guide, Millie has covered retail events like Prime Day, Black Friday and Cyber Monday extensively, meaning she knows the products readers are looking for and the best times of year to hit “purchase.”&lt;/p&gt;&lt;p&gt;When she’s not looking for discounts, Millie covers news and writes how-to articles about everything from phones, streaming devices, and headphones to apps and video games.&lt;/p&gt;&lt;p&gt;In her spare time, Millie enjoys reading, gaming on her Nintendo Switch and creating digital art. She’s also a fan of watching Disney movies and collecting plush (the latter having totally taken over her bedroom.)&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/5e3jur5CHoNQwXp8Y5VbNV-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon devices from Blink, Ring, Fire TV]]></media:description>                                                            <media:text><![CDATA[Amazon devices from Blink, Ring, Fire TV]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon devices from Blink, Ring, Fire TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5e3jur5CHoNQwXp8Y5VbNV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/uk/news/best-prime-day-deals-and-sales">Prime Day</a> is almost here. But Amazon isn't waiting around — there are already huge deals up for grabs on a large range of devices. Now's the time to upgrade your streaming stick, video doorbell or security cameras!</p><p>In a hurry? The <a href="https://www.amazon.co.uk/blink-mini-2k-/dp/B0F3BC7TRP" target="_blank" rel="nofollow">Blink Mini 2K+ for £16</a> is an absolute <em>steal</em>. You can also score big savings on TVs, like the <a href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow">Amazon Ember 75-inch Mini-LED Fire TV for £999</a> — it's a massive £600 off.</p><p>Keep scrolling to see all my favorite Amazon device deals! (And don't forget to <a href="https://www.amazon.co.uk/amazonprime" target="_blank" rel="nofollow">sign up for a Prime membership</a> to get ready for more Prime Day deals.)</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.amazon.co.uk/deals" target="_blank" rel="nofollow"><strong>shop all deals at Amazon</strong></a></li><li><strong>Alexa devices: </strong><a href="https://www.amazon.co.uk/s?rh=n%3A341686031%2Cp_n_deal_type%3A26901100031" target="_blank" rel="nofollow"><strong>Ring, Blink, Fire TV from £16</strong></a></li><li><strong>Blink Mini 2K+: </strong><a href="https://www.amazon.co.uk/blink-mini-2k-/dp/B0F3BCVPNJ" target="_blank" rel="nofollow"><strong>was £39 now £16</strong></a></li><li><strong>Blink Outdoor 4 Camera + Video Doorbell + Sync Module Core: </strong><a href="https://www.amazon.co.uk/Blink-Doorbell-Wireless-security-detection/dp/B0FLY6B25Q" target="_blank" rel="nofollow"><strong>was £119 now £24</strong></a></li><li><strong>Ring Video Doorbell: </strong><a href="https://www.amazon.co.uk/ring-battery-video-doorbell-diy-wireless-video-doorbell-camera-with-head-to-toe-view-hd-video-easy-to-install-5-min-30-day-free-trial-of-ring-protect/dp/B0BZWQP9Z1" target="_blank" rel="nofollow"><strong>was £99 now £34</strong></a></li><li><strong>Ring Outdoor Cam Plus: </strong><a href="https://www.amazon.co.uk/ring-outdoor-camera-plus-battery/dp/B0D23XCY18" target="_blank" rel="nofollow"><strong>was £99 now £49</strong></a></li><li><strong>Amazon Fire TV 50" 4-Series: </strong><a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow"><strong>was £499 now £279</strong></a></li><li><strong>Amazon Ember 75" Mini-LED Series with Fire TV: </strong><a href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow"><strong>was £1,599 now £999</strong></a></li></ul><h3 class="article-body__section" id="section-blink"><span>Blink</span></h3><div class="product"><a data-dimension112="670c12b4-f861-41cf-b5db-5db12f33e754" data-action="Deal Block" data-label="Mini 2K+" data-dimension48="Mini 2K+" data-dimension25="£16" href="https://www.amazon.co.uk/blink-mini-2k-/dp/B0F3BCVPNJ" 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:148.56%;"><img id="Mqm7zhkLf5CESquJhuX7Zg" name="Blink Mini 2K+ deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Mqm7zhkLf5CESquJhuX7Zg.jpg" mos="" align="middle" fullscreen="" width="900" height="1337" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Blink Mini 2K+ debuted in 2025 and offers higher resolution (2560 x 1440) than its predecessor for indoor monitoring. It offers up to 4x zoom, night color vision and a 138-degree field of view. It can also be paired with the Blink Arc mount accessory for a wider scope.<a class="view-deal button" href="https://www.amazon.co.uk/blink-mini-2k-/dp/B0F3BCVPNJ" target="_blank" rel="nofollow" data-dimension112="670c12b4-f861-41cf-b5db-5db12f33e754" data-action="Deal Block" data-label="Mini 2K+" data-dimension48="Mini 2K+" data-dimension25="£16">View Deal</a></p></div><div class="product"><a data-dimension112="7d8557dc-77a8-42b6-b480-ac7e34480c4b" data-action="Deal Block" data-label="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension48="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension25="£24" href="https://www.amazon.co.uk/Blink-Doorbell-Wireless-security-detection/dp/B0FLY6B25Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="U67HYXvzJyMdSNeUaoT4Ai" name="Outdoor 4 Camera + Video Doorbell + Sync Module Core" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/U67HYXvzJyMdSNeUaoT4Ai.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Blink-Doorbell-Wireless-security-detection/dp/B0FLY6B25Q" target="_blank" rel="nofollow" data-dimension112="7d8557dc-77a8-42b6-b480-ac7e34480c4b" data-action="Deal Block" data-label="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension48="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension25="£24">Outdoor 4 Camera + Video Doorbell + Sync Module Core: was £119 now £24</a></strong><br>This bundle is 79% off and provides unbelievably good value for money. For just £24, you're getting a Blink Outdoor 4 Camera with a Sync Module and a Video Doorbell too. It's the perfect way to set up a smart home security system for the first time.<a class="view-deal button" href="https://www.amazon.co.uk/Blink-Doorbell-Wireless-security-detection/dp/B0FLY6B25Q" target="_blank" rel="nofollow" data-dimension112="7d8557dc-77a8-42b6-b480-ac7e34480c4b" data-action="Deal Block" data-label="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension48="Outdoor 4 Camera + Video Doorbell + Sync Module Core" data-dimension25="£24">View Deal</a></p></div><div class="product"><a data-dimension112="a19da4a6-e601-4fbd-8dd7-757265235fc4" data-action="Deal Block" data-label="Battery Doorbell 2K+" data-dimension48="Battery Doorbell 2K+" data-dimension25="£29" href="https://www.amazon.co.uk/blink-battery-doorbell-2k-/dp/B0G62C2L2W" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:938px;"><p class="vanilla-image-block" style="padding-top:159.91%;"><img id="tzHURhDDBH7RCousLAcAuA" name="Battery Doorbell 2K+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tzHURhDDBH7RCousLAcAuA.jpg" mos="" align="middle" fullscreen="" width="938" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/home/smart-home/the-blink-battery-doorbell-2k-checks-all-of-the-boxes-for-a-budget-friendly-video-doorbell" data-dimension112="a19da4a6-e601-4fbd-8dd7-757265235fc4" data-action="Deal Block" data-label="Battery Doorbell 2K+" data-dimension48="Battery Doorbell 2K+" data-dimension25="£29">Blink Battery Doorbell 2K+</a> is our new winner for the <a href="https://www.tomsguide.com/us/best-video-doorbells,review-4468.html">best video doorbell</a> on a budget. You get sharp 2K video and incredible battery life that lasts up to 22 months. Right now you can get it for 58% off — that means this deal is pretty much a no-brainer. (Unless you want to pick up the older doorbell in the bundle deal above.)<a class="view-deal button" href="https://www.amazon.co.uk/blink-battery-doorbell-2k-/dp/B0G62C2L2W" target="_blank" rel="nofollow" data-dimension112="a19da4a6-e601-4fbd-8dd7-757265235fc4" data-action="Deal Block" data-label="Battery Doorbell 2K+" data-dimension48="Battery Doorbell 2K+" data-dimension25="£29">View Deal</a></p></div><h3 class="article-body__section" id="section-fire-tv-sticks"><span>Fire TV Sticks</span></h3><div class="product"><a data-dimension112="ef17373b-d353-4ee3-80a5-aa1b5a16a87c" data-action="Deal Block" data-label="Fire TV Stick 4K Plus" data-dimension48="Fire TV Stick 4K Plus" data-dimension25="£24" href="https://www.amazon.co.uk/Amazon-streaming-device-supports-Vision/dp/B0F7ZFCZNL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:80.33%;"><img id="aQREGkw7zzGLw4rboeHqp8" name="Stick 4K Max" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aQREGkw7zzGLw4rboeHqp8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1205" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fire TV Stick 4K Plus sits in the middle of the Fire TV range, above the HD and 4K Select, but below the 4K Max and Cube. You get 4K video, Dolby Vision/HDR10/HDR10+/HLG support, Dolby Atmos audio, and most importantly, full support for almost all VPNs. For less than £25, though, it's a cheap way into true 4K TV.<a class="view-deal button" href="https://www.amazon.co.uk/Amazon-streaming-device-supports-Vision/dp/B0F7ZFCZNL" target="_blank" rel="nofollow" data-dimension112="ef17373b-d353-4ee3-80a5-aa1b5a16a87c" data-action="Deal Block" data-label="Fire TV Stick 4K Plus" data-dimension48="Fire TV Stick 4K Plus" data-dimension25="£24">View Deal</a></p></div><h3 class="article-body__section" id="section-ring"><span>Ring</span></h3><div class="product"><a data-dimension112="3cedf890-1736-47da-be64-8bfd293d2ae6" data-action="Deal Block" data-label="Indoor Cam Plus" data-dimension48="Indoor Cam Plus" data-dimension25="£24" href="https://www.amazon.co.uk/ring-indoor-camera-plus/dp/B0DXMGKCN1?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:938px;"><p class="vanilla-image-block" style="padding-top:159.91%;"><img id="EYHH5SV2AKX4RqSSgiNCGG" name="Indoor Cam Plus" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EYHH5SV2AKX4RqSSgiNCGG.jpg" mos="" align="middle" fullscreen="" width="938" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>On sale for £24, the all-new Ring Indoor Cam Plus is a great addition to the Ring ecosystem. It pumps out sharp video, even in low light, offers versatile placement options and is super easy to set up. <a class="view-deal button" href="https://www.amazon.co.uk/ring-indoor-camera-plus/dp/B0DXMGKCN1?" target="_blank" rel="nofollow" data-dimension112="3cedf890-1736-47da-be64-8bfd293d2ae6" data-action="Deal Block" data-label="Indoor Cam Plus" data-dimension48="Indoor Cam Plus" data-dimension25="£24">View Deal</a></p></div><div class="product"><a data-dimension112="ebaed17d-30d7-4c70-9039-558653cdff87" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£34" href="https://www.amazon.co.uk/ring-battery-video-doorbell-diy-wireless-video-doorbell-camera-with-head-to-toe-view-hd-video-easy-to-install-5-min-30-day-free-trial-of-ring-protect/dp/B0BZWQP9Z1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="uGHuDwiBGmuWDsES3TwwoJ" name="1657639746.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uGHuDwiBGmuWDsES3TwwoJ.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/ring-battery-video-doorbell-diy-wireless-video-doorbell-camera-with-head-to-toe-view-hd-video-easy-to-install-5-min-30-day-free-trial-of-ring-protect/dp/B0BZWQP9Z1" target="_blank" rel="nofollow" data-dimension112="ebaed17d-30d7-4c70-9039-558653cdff87" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£34">Battery Doorbell: was £99 now £34</a></strong><br>At just £34, the best value Ring Video Doorbell got even better. The newest of Ring's doorbells has head-to-toe video and package detection. You can't replace its battery, but it's a fantastic option at this price. <a class="view-deal button" href="https://www.amazon.co.uk/ring-battery-video-doorbell-diy-wireless-video-doorbell-camera-with-head-to-toe-view-hd-video-easy-to-install-5-min-30-day-free-trial-of-ring-protect/dp/B0BZWQP9Z1" target="_blank" rel="nofollow" data-dimension112="ebaed17d-30d7-4c70-9039-558653cdff87" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£34">View Deal</a></p></div><div class="product"><a data-dimension112="312e6c34-aab1-4984-a3e9-e09562b496b2" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£39" href="https://www.amazon.co.uk/ring-battery-video-doorbell/dp/B0FHJ91JY5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:938px;"><p class="vanilla-image-block" style="padding-top:159.91%;"><img id="uJxu2kMc4UDAJ9YdqYqo6Q" name="Battery Doorbell" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uJxu2kMc4UDAJ9YdqYqo6Q.jpg" mos="" align="middle" fullscreen="" width="938" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/ring-battery-video-doorbell/dp/B0FHJ91JY5" target="_blank" rel="nofollow" data-dimension112="312e6c34-aab1-4984-a3e9-e09562b496b2" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£39">Battery Doorbell: was £79 now £39</a></strong><br>The Ring Video Doorbell (2nd Gen) now comes in a slimmer shell, and new colorways — this one has a speckled gray finish. You get Retinal 2K video, 6x zoom and two-way talk.<a class="view-deal button" href="https://www.amazon.co.uk/ring-battery-video-doorbell/dp/B0FHJ91JY5" target="_blank" rel="nofollow" data-dimension112="312e6c34-aab1-4984-a3e9-e09562b496b2" data-action="Deal Block" data-label="Battery Doorbell" data-dimension48="Battery Doorbell" data-dimension25="£39">View Deal</a></p></div><div class="product"><a data-dimension112="f090d0cf-46e2-4f4c-9b40-2ad1ae4f17a1" data-action="Deal Block" data-label="Outdoor Cam Plus" data-dimension48="Outdoor Cam Plus" data-dimension25="£49" href="https://www.amazon.co.uk/ring-outdoor-camera-plus-battery/dp/B0D23XCY18" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="pVEPLNb4BwzSVyTsLwCC9f" name="Outdoor Cam" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pVEPLNb4BwzSVyTsLwCC9f.jpg" mos="" align="middle" fullscreen="" width="3000" height="3000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/ring-outdoor-camera-plus-battery/dp/B0D23XCY18" target="_blank" rel="nofollow" data-dimension112="f090d0cf-46e2-4f4c-9b40-2ad1ae4f17a1" data-action="Deal Block" data-label="Outdoor Cam Plus" data-dimension48="Outdoor Cam Plus" data-dimension25="£49">Outdoor Cam Plus: was £99 now £49</a></strong><br>If you don't need a spotlight or a floodlight camera, the Stick Up Cam is a cheaper way to monitor the outside of your house. It features Retinal 2K video and two-way talk.<a class="view-deal button" href="https://www.amazon.co.uk/ring-outdoor-camera-plus-battery/dp/B0D23XCY18" target="_blank" rel="nofollow" data-dimension112="f090d0cf-46e2-4f4c-9b40-2ad1ae4f17a1" data-action="Deal Block" data-label="Outdoor Cam Plus" data-dimension48="Outdoor Cam Plus" data-dimension25="£49">View Deal</a></p></div><h3 class="article-body__section" id="section-fire-tvs"><span>Fire TVs</span></h3><div class="product"><a data-dimension112="69d4fe9b-fad7-45bc-ba49-b7000d0b2179" data-action="Deal Block" data-label="32" 2-Series Fire TV" data-dimension48="32" 2-Series Fire TV" data-dimension25="£129" href="https://www.amazon.co.uk/fire-tv-2-series/dp/B0F75D71RN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1106px;"><p class="vanilla-image-block" style="padding-top:60.04%;"><img id="ua6tAad9cyE65ngXrJ9eja" name="Amazon Fire TV 2 Series deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ua6tAad9cyE65ngXrJ9eja.jpg" mos="" align="middle" fullscreen="" width="1106" height="664" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/fire-tv-2-series/dp/B0F75D71RN" target="_blank" rel="nofollow" data-dimension112="69d4fe9b-fad7-45bc-ba49-b7000d0b2179" data-action="Deal Block" data-label='32" 2-Series Fire TV' data-dimension48='32" 2-Series Fire TV' data-dimension25="£129">32" 2-Series Fire TV: was £249 now £129</a></strong><br>This budget-friendly TV is the cheapest in Amazon's Fire TV lineup. It offers Wi-Fi 6 support, HDR10/HLG support and Dolby audio. The included Alexa Voice Remote allows for voice control and can manage power and volume on compatible devices.<a class="view-deal button" href="https://www.amazon.co.uk/fire-tv-2-series/dp/B0F75D71RN" target="_blank" rel="nofollow" data-dimension112="69d4fe9b-fad7-45bc-ba49-b7000d0b2179" data-action="Deal Block" data-label="32" 2-Series Fire TV" data-dimension48="32" 2-Series Fire TV" data-dimension25="£129">View Deal</a></p></div><div class="product"><a data-dimension112="98a6bb38-6f5f-4c8c-8089-e853a8a56e69" data-action="Deal Block" data-label="50" 4-Series 4K Fire TV" data-dimension48="50" 4-Series 4K Fire TV" data-dimension25="£279" href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:68.06%;"><img id="aUodJSoNAstkNUc4Lq2DSV" name="Amazon Fire TV 4-Series deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aUodJSoNAstkNUc4Lq2DSV.jpg" mos="" align="middle" fullscreen="" width="1080" height="735" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow" data-dimension112="98a6bb38-6f5f-4c8c-8089-e853a8a56e69" data-action="Deal Block" data-label='50" 4-Series 4K Fire TV' data-dimension48='50" 4-Series 4K Fire TV' data-dimension25="£279">50" 4-Series 4K Fire TV: was £499 now £279</a></strong><br>This budget-friendly 4K TV is an upgrade from the entry-level 2-Series, offering better picture quality and faster performance. You also get Wi-Fi 6 support, HDR10/HLG support and Dolby Digital Plus audio. The included Alexa Voice Remote allows for voice control and can manage power and volume on compatible devices. <a class="view-deal button" href="https://www.amazon.co.uk/fire-tv-4-series/dp/B0DFNB2JCM" target="_blank" rel="nofollow" data-dimension112="98a6bb38-6f5f-4c8c-8089-e853a8a56e69" data-action="Deal Block" data-label="50" 4-Series 4K Fire TV" data-dimension48="50" 4-Series 4K Fire TV" data-dimension25="£279">View Deal</a></p></div><div class="product"><a data-dimension112="ecdb8094-bf35-4d7c-abdb-15b9cc4d4c0f" data-action="Deal Block" data-label="40" 2-Series 4K Fire TV & Soundbar Bundle" data-dimension48="40" 2-Series 4K Fire TV & Soundbar Bundle" data-dimension25="£329" href="https://www.amazon.co.uk/dp/B0GL37W5Y4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1097px;"><p class="vanilla-image-block" style="padding-top:78.58%;"><img id="qLWzcGUpHB4XPhQUxbz4eb" name="40" 2-Series 4K Fire TV & Soundbar Bundle" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qLWzcGUpHB4XPhQUxbz4eb.jpg" mos="" align="middle" fullscreen="" width="1097" height="862" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/dp/B0GL37W5Y4" target="_blank" rel="nofollow" data-dimension112="ecdb8094-bf35-4d7c-abdb-15b9cc4d4c0f" data-action="Deal Block" data-label='40" 2-Series 4K Fire TV & Soundbar Bundle' data-dimension48='40" 2-Series 4K Fire TV & Soundbar Bundle' data-dimension25="£329">40" 2-Series 4K Fire TV & Soundbar Bundle: was £419 now £329</a></strong><br>This budget-friendly bundle comes with a HD Fire TV and a soundbar, getting you a super-cheap screen and sound combo. It offers Wi-Fi 6 support, HDR10/HLG support, and Dolby audio. The included Alexa Voice Remote allows for voice control and can manage power and volume on compatible devices.<a class="view-deal button" href="https://www.amazon.co.uk/dp/B0GL37W5Y4" target="_blank" rel="nofollow" data-dimension112="ecdb8094-bf35-4d7c-abdb-15b9cc4d4c0f" data-action="Deal Block" data-label="40" 2-Series 4K Fire TV & Soundbar Bundle" data-dimension48="40" 2-Series 4K Fire TV & Soundbar Bundle" data-dimension25="£329">View Deal</a></p></div><div class="product"><a data-dimension112="9c717d88-cafa-4453-a9fc-76a9e5861dbf" data-action="Deal Block" data-label="65" Ember Artline 4K QLED Fire TV" data-dimension48="65" Ember Artline 4K QLED Fire TV" data-dimension25="£789" href="https://www.amazon.co.uk/amazon-ember-artline/dp/B0GF3DZKXR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1139px;"><p class="vanilla-image-block" style="padding-top:59.70%;"><img id="hnvrzK8aWNozBd6Mjsn3WE" name="65" Ember Artline 4K QLED Fire TV" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hnvrzK8aWNozBd6Mjsn3WE.jpg" mos="" align="middle" fullscreen="" width="1139" height="680" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/amazon-ember-artline/dp/B0GF3DZKXR" target="_blank" rel="nofollow" data-dimension112="9c717d88-cafa-4453-a9fc-76a9e5861dbf" data-action="Deal Block" data-label='65" Ember Artline 4K QLED Fire TV' data-dimension48='65" Ember Artline 4K QLED Fire TV' data-dimension25="£789">65" Ember Artline 4K QLED Fire TV: was £1199 now £789</a></strong><br>The Ember Artline is a potential rival to Samsung’s popular <a href="https://www.tomsguide.com/tvs/samsung-the-frame-tv-2024-review">The Frame</a> series, featuring Dolby Vision and HDR10+ and a matte 4K screen. It's a TV that'll blend into your decor when you're not using it, and display beautiful artwork to boot.<a class="view-deal button" href="https://www.amazon.co.uk/amazon-ember-artline/dp/B0GF3DZKXR" target="_blank" rel="nofollow" data-dimension112="9c717d88-cafa-4453-a9fc-76a9e5861dbf" data-action="Deal Block" data-label="65" Ember Artline 4K QLED Fire TV" data-dimension48="65" Ember Artline 4K QLED Fire TV" data-dimension25="£789">View Deal</a></p></div><div class="product"><a data-dimension112="0ecaa7cc-56a7-47f3-8d5a-74f867ac9a08" data-action="Deal Block" data-label="75" Fire TV Omni 4K QLED TV" data-dimension48="75" Fire TV Omni 4K QLED TV" data-dimension25="£999" href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="SG34ZWodUkLTxJvMTbjPYR" name="Amazon-Fire-TV-Omni-QLED-2025-16-by-9-deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow" data-dimension112="0ecaa7cc-56a7-47f3-8d5a-74f867ac9a08" data-action="Deal Block" data-label='75" Fire TV Omni 4K QLED TV' data-dimension48='75" Fire TV Omni 4K QLED TV' data-dimension25="£999">75" Fire TV Omni 4K QLED TV: was £1599 now £999</a></strong><br>Amazon's Fire TV Omni QLED (AKA Amazon Ember) is on sale for £999. It comes with built-in Fire TV streaming capabilities and Alexa functionality. The Omni taps an array of LED backlights with local dimming for improved contrast over TVs with edge-lit displays, but note that some TVs at or below the Omni's price range offer more-advanced display technology.<a class="view-deal button" href="https://www.amazon.co.uk/amazon-fire-tv-omni-mini-led-series/dp/B0C7SCBG8Q" target="_blank" rel="nofollow" data-dimension112="0ecaa7cc-56a7-47f3-8d5a-74f867ac9a08" data-action="Deal Block" data-label="75" Fire TV Omni 4K QLED TV" data-dimension48="75" Fire TV Omni 4K QLED TV" data-dimension25="£999">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 must-watch classic movies were just added to Prime Video — these iconic films have stood the ultimate test of time ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As the old saying goes, “they don’t make them like they used to.” There’s just something extremely special about classic movies. I wouldn’t go as far as to say that movies were <em>better </em>back then (I love plenty of modern films), but I adore watching films released decades before I was even born. </p><p>When it comes to classic movies (and I do mean <em>classic</em> here), Prime Video has always been one of the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> for finding legendary flicks from the Hollywood of yesteryear. Case in point, the platform’s <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">June 2026 slate</a> includes some truly legendary movies. I’m taking films that have influenced generations of filmmakers and still do even today.</p><p>If you also have an appreciation for classic movies, and find anything presented in stunning black-and-white very much a positive rather than a stumbling block. Here are the five classics to watch on Prime Video now.</p><h2 id="12-angry-men-1957-2">‘12 Angry Men’ (1957)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/TEN-2uTi2c0" allowfullscreen></iframe></div></div><p>Forget daredevil stunts or special effects. Director Sidney Lumet proves that all you need to craft an enthralling movie is an incredible script and magnetic performances. “12 Angry Men” is as riveting as it is simplistic in setup, but to quote another old saying, “the simplest ideas are often the best.” This legal drama will have you hooked on every word as its cast of jurors debate whether a young boy committed the murder of his father.</p><p>At the heart of the debate is Henry Fonda’s Juror #8 (none of the characters are named, bar two at the very end); initially, he's the sole dissenting voice. His fellow jurors are convinced of the boy’s guilt without need for discussion, and it’s Fonda’s job to convince them to at least consider the fact before sending the defendant to the electric chair. Set in a sweltering New York City courthouse, “12 Angry Men” is more engrossing than basically any modern crime drama. It’s a true cinematic masterpiece.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0BRHJCCH2/" target="_blank" rel="nofollow"><em><strong>"12 Angry Men" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="paths-of-glory-1957">‘Paths of Glory’ (1957)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/FESvZ0HG2p4" allowfullscreen></iframe></div></div><p>No surprise to see a Stanley Kubrick movie on this list; the director was a true master of the cinematic craft. While I wouldn’t go as far as saying “Paths of Glory” is overlooked, it doesn’t get the same modern-day attention that some of Kubrick’s other movies do, so if you’ve neglected to watch this war drama until now, that’s an error you should correct. Next to “All Quiet on the Western Front,” it’s one of the most sobering anti-war pictures ever created, with Kubrick sharply portraying the futility of conflict and the human cost.</p><p>Set during World War I, a French general seeking personal glory (Adolphe Menjou) orders his men to commit to a near-impossible offensive mission. When the doomed-from-the-start plan fails and the soldiers retreat, it’s decided that three of the platoon should be court-martialed to save face. In steps Colonel Dax (Kirk Douglas) to act as the case for the defense, arguing no man should pay the ultimate price for the foolishness of their superiors.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXCLX585/" target="_blank" rel="nofollow"><em><strong>"Paths of Glory" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WnmBKe"></div>                            </div>                            <script src="https://kwizly.com/embed/WnmBKe.js" async></script><h2 id="the-apartment-1960">‘The Apartment’ (1960)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/OcslkrBMLGc" allowfullscreen></iframe></div></div><p>“The Apartment” is probably my favorite romantic comedy of all time. It’s the ultimate feel-good watch, and a movie I’ve turned to on more than one occasion when in need of a mood-booster. Like any good rom-com, its greatest strength is the chemistry between its leads, Jack Lemmon and Shirley MacLaine. Within moments of meeting them, you’ll be rooting for their characters to figure out their baggage and just be happy together. Clearly, plenty of awards voters got swept up in their romance, as the Billy Wilder movie took home Best Picture at the 33rd Academy Awards.</p><p>“The Apartment” centers on a browbeaten insurance worker named C.C. Baxter (Lemmon), who reluctantly allows his bosses to use his Upper West Side apartment as a hook-up pad for their extramarital affairs. When company bigwig Mr. Sheldrake (Fred MacMurray) uses the apartment to liaise with elevator operator Fran (MacLaine), Baxter is heartbroken as he’s deeply infatuated with Fran himself. What follows is a charming romantic comedy-drama as Baxter tries to win the girl while also climbing the treacherous corporate ladder.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CN12673W/" target="_blank" rel="nofollow"><em><strong>"The Apartment" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="west-side-story-1961">‘West Side Story’ (1961)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/HpKbrpPiExA" allowfullscreen></iframe></div></div><p>Earlier this week, <a href="https://www.tomsguide.com/entertainment/movies/1-800-film-fans-picked-the-best-spielberg-movie-but-this-usd100-million-box-office-disaster-was-criminally-overlooked">I gave some much-deserved love to Steven Spielberg’s 2021 “West Side Story,”</a> so it’s only fitting that now it’s the turn of the first feature adaptation of the Broadway show. Nominated for 11 Oscars and winning 10 (including Best Picture), this 1961 all-singing, all-dancing musical is bursting with flair and is fortunate enough to be scored by some of Stephen Sondheim’s best work. Even non-musical enjoyers should give it a shot.</p><p>If you somehow didn’t know, “West Side Story” is based on Shakespeare’s most renowned work, “Romeo and Juliet,” but rather than being set in Verona, Italy, the story of two star-crossed lovers is transported to ‘50s New York. Maria (Natalie Wood) is the sister of the leader of a street gang named the Sharks, while Tony (Richard Beymer) runs with their rivals, the Jets. Despite belonging to opposite sides of an ongoing turf war, they meet and fall in love, but as you probably know, tragedy is awaiting.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GX1GXRK7/" target="_blank" rel="nofollow"><em><strong>"West Side Story" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="midnight-cowboy-1969">‘Midnight Cowboy’ (1969)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/o29GST0Lj28" allowfullscreen></iframe></div></div><p>Another Best Picture winner, “Midnight Cowboy" was a controversial movie upon its release. It was even branded with an X-rating (the equivalent of an NC-17), which could have sunk its chances of success out of the gate. However, the movie’s quality, and even the backlash itself, served only to heighten interest, and it went on to be an awards favorite. And even if you’ve never seen “Midnight Cowboy,” I bet you’ve heard (and probably used yourself) its most iconic line, “Hey, I’m walkin’ here!”</p><p>Texan Joe Buck (Jon Voight) heads to the bright lights of New York City with plans of making his fortune. However, making big bucks in the big city proves to be tougher than he’d expected, and he finds himself homeless, making friends with a street rat named Ratso (Dustin Hoffman). The two come to rely on each other to survive as they roam the streets and look for a hustle that might turn their fortunes around for good.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Midnight-Cowboy-John-Schlesinger/dp/B0H1FLW335/" target="_blank" rel="nofollow"><em><strong>"Midnight Cowboy" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-new-to-prime-video-movies-in-june-2026-with-90-percent-or-higher-on-rotten-tomatoes">5 new to Prime Video movies with 90% or higher on Rotten Tomatoes</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/i-bond-with-my-dad-over-classic-cinema-these-are-my-5-favorite-noir-masterpiece-movies-streaming-right-now">These are my 5 favorite classic noir masterpiece movies</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/5-must-watch-classic-movies-were-just-added-to-prime-video-these-iconic-films-have-stood-the-ultimate-test-of-time</link>
                                                                            <description>
                            <![CDATA[ Prime Video is one of the best streaming services for classic movies, and this month it's added a collection of the best films ever made. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">petcLZp8uYc8h4j4FWJTwc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Q8sem24pb6UmcqdsVtCnbU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/Q8sem24pb6UmcqdsVtCnbU-1280-80.jpg">
                                                            <media:credit><![CDATA[Future/Prime Video]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on glowing background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on glowing background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on glowing background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Q8sem24pb6UmcqdsVtCnbU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As the old saying goes, “they don’t make them like they used to.” There’s just something extremely special about classic movies. I wouldn’t go as far as to say that movies were <em>better </em>back then (I love plenty of modern films), but I adore watching films released decades before I was even born. </p><p>When it comes to classic movies (and I do mean <em>classic</em> here), Prime Video has always been one of the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> for finding legendary flicks from the Hollywood of yesteryear. Case in point, the platform’s <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">June 2026 slate</a> includes some truly legendary movies. I’m taking films that have influenced generations of filmmakers and still do even today.</p><p>If you also have an appreciation for classic movies, and find anything presented in stunning black-and-white very much a positive rather than a stumbling block. Here are the five classics to watch on Prime Video now.</p><h2 id="12-angry-men-1957-2">‘12 Angry Men’ (1957)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/TEN-2uTi2c0" allowfullscreen></iframe></div></div><p>Forget daredevil stunts or special effects. Director Sidney Lumet proves that all you need to craft an enthralling movie is an incredible script and magnetic performances. “12 Angry Men” is as riveting as it is simplistic in setup, but to quote another old saying, “the simplest ideas are often the best.” This legal drama will have you hooked on every word as its cast of jurors debate whether a young boy committed the murder of his father.</p><p>At the heart of the debate is Henry Fonda’s Juror #8 (none of the characters are named, bar two at the very end); initially, he's the sole dissenting voice. His fellow jurors are convinced of the boy’s guilt without need for discussion, and it’s Fonda’s job to convince them to at least consider the fact before sending the defendant to the electric chair. Set in a sweltering New York City courthouse, “12 Angry Men” is more engrossing than basically any modern crime drama. It’s a true cinematic masterpiece.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0BRHJCCH2/" target="_blank" rel="nofollow"><em><strong>"12 Angry Men" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="paths-of-glory-1957">‘Paths of Glory’ (1957)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/FESvZ0HG2p4" allowfullscreen></iframe></div></div><p>No surprise to see a Stanley Kubrick movie on this list; the director was a true master of the cinematic craft. While I wouldn’t go as far as saying “Paths of Glory” is overlooked, it doesn’t get the same modern-day attention that some of Kubrick’s other movies do, so if you’ve neglected to watch this war drama until now, that’s an error you should correct. Next to “All Quiet on the Western Front,” it’s one of the most sobering anti-war pictures ever created, with Kubrick sharply portraying the futility of conflict and the human cost.</p><p>Set during World War I, a French general seeking personal glory (Adolphe Menjou) orders his men to commit to a near-impossible offensive mission. When the doomed-from-the-start plan fails and the soldiers retreat, it’s decided that three of the platoon should be court-martialed to save face. In steps Colonel Dax (Kirk Douglas) to act as the case for the defense, arguing no man should pay the ultimate price for the foolishness of their superiors.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXCLX585/" target="_blank" rel="nofollow"><em><strong>"Paths of Glory" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WnmBKe"></div>                            </div>                            <script src="https://kwizly.com/embed/WnmBKe.js" async></script><h2 id="the-apartment-1960">‘The Apartment’ (1960)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/OcslkrBMLGc" allowfullscreen></iframe></div></div><p>“The Apartment” is probably my favorite romantic comedy of all time. It’s the ultimate feel-good watch, and a movie I’ve turned to on more than one occasion when in need of a mood-booster. Like any good rom-com, its greatest strength is the chemistry between its leads, Jack Lemmon and Shirley MacLaine. Within moments of meeting them, you’ll be rooting for their characters to figure out their baggage and just be happy together. Clearly, plenty of awards voters got swept up in their romance, as the Billy Wilder movie took home Best Picture at the 33rd Academy Awards.</p><p>“The Apartment” centers on a browbeaten insurance worker named C.C. Baxter (Lemmon), who reluctantly allows his bosses to use his Upper West Side apartment as a hook-up pad for their extramarital affairs. When company bigwig Mr. Sheldrake (Fred MacMurray) uses the apartment to liaise with elevator operator Fran (MacLaine), Baxter is heartbroken as he’s deeply infatuated with Fran himself. What follows is a charming romantic comedy-drama as Baxter tries to win the girl while also climbing the treacherous corporate ladder.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CN12673W/" target="_blank" rel="nofollow"><em><strong>"The Apartment" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="west-side-story-1961">‘West Side Story’ (1961)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/HpKbrpPiExA" allowfullscreen></iframe></div></div><p>Earlier this week, <a href="https://www.tomsguide.com/entertainment/movies/1-800-film-fans-picked-the-best-spielberg-movie-but-this-usd100-million-box-office-disaster-was-criminally-overlooked">I gave some much-deserved love to Steven Spielberg’s 2021 “West Side Story,”</a> so it’s only fitting that now it’s the turn of the first feature adaptation of the Broadway show. Nominated for 11 Oscars and winning 10 (including Best Picture), this 1961 all-singing, all-dancing musical is bursting with flair and is fortunate enough to be scored by some of Stephen Sondheim’s best work. Even non-musical enjoyers should give it a shot.</p><p>If you somehow didn’t know, “West Side Story” is based on Shakespeare’s most renowned work, “Romeo and Juliet,” but rather than being set in Verona, Italy, the story of two star-crossed lovers is transported to ‘50s New York. Maria (Natalie Wood) is the sister of the leader of a street gang named the Sharks, while Tony (Richard Beymer) runs with their rivals, the Jets. Despite belonging to opposite sides of an ongoing turf war, they meet and fall in love, but as you probably know, tragedy is awaiting.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GX1GXRK7/" target="_blank" rel="nofollow"><em><strong>"West Side Story" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="midnight-cowboy-1969">‘Midnight Cowboy’ (1969)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/o29GST0Lj28" allowfullscreen></iframe></div></div><p>Another Best Picture winner, “Midnight Cowboy" was a controversial movie upon its release. It was even branded with an X-rating (the equivalent of an NC-17), which could have sunk its chances of success out of the gate. However, the movie’s quality, and even the backlash itself, served only to heighten interest, and it went on to be an awards favorite. And even if you’ve never seen “Midnight Cowboy,” I bet you’ve heard (and probably used yourself) its most iconic line, “Hey, I’m walkin’ here!”</p><p>Texan Joe Buck (Jon Voight) heads to the bright lights of New York City with plans of making his fortune. However, making big bucks in the big city proves to be tougher than he’d expected, and he finds himself homeless, making friends with a street rat named Ratso (Dustin Hoffman). The two come to rely on each other to survive as they roam the streets and look for a hustle that might turn their fortunes around for good.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Midnight-Cowboy-John-Schlesinger/dp/B0H1FLW335/" target="_blank" rel="nofollow"><em><strong>"Midnight Cowboy" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-new-to-prime-video-movies-in-june-2026-with-90-percent-or-higher-on-rotten-tomatoes">5 new to Prime Video movies with 90% or higher on Rotten Tomatoes</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/i-bond-with-my-dad-over-classic-cinema-these-are-my-5-favorite-noir-masterpiece-movies-streaming-right-now">These are my 5 favorite classic noir masterpiece movies</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 new to Prime Video thriller movies to stream this week — including a forgotten crime mystery with Denzel Washington and Eva Mendes (June 16-22) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Prime Video is always adding thriller movies to its library, and it’s not a surprise. I track <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> charts for a living and can tell you firsthand that the genre is extremely popular across platforms. The Amazon-owned service is no exception to this trend. </p><p>So, if you’re a Prime Video subscriber with a love of thrillers (join the club!), I’ve combed through the new additions to the service in June 2026 and found three that are sure to give your watchlist a jolt of adrenaline. This week’s trio includes thrillers led by Gerard Butler, Denzel Washington and…Helen Mirren!</p><p>These are the Prime Video thriller movies you need to consider streaming this week.</p><h3 class="article-body__section" id="section-best-new-to-prime-video-thriller-movies-this-week"><span>Best new to Prime Video thriller movies this week</span></h3><h2 id="plane-2023-2">‘Plane’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/M25zXBIUVr0" allowfullscreen></iframe></div></div><p>If you like your thrillers to be on the nose, then “Plane” is the pick for you this week. This Gerard Butler-led action effort disregards subtlety in favor of big thrills and ludicrous narrative leaps. But, most surprisingly, it all works. “Plane” could never be labeled Oscar-worthy, but it’s consistently enjoyable from start to finish. Butler and co-star Mike Colter also make for a great buddy-cop-style team, even if their alliance is a fragile one.</p><p>Brodie Torrance (Butler) is a pilot forced to take drastic measures when lightning threatens the safety of his plane and its passengers. With no choice but to land in a war-torn region, the crash is just the start of the ordeal. Teaming up with an accused murderer, Louis Gaspare (Colter), who was on the airplane in FBI custody, Torrance and his unlikely ally have to rescue the passengers from rebel fighters who have taken them hostage.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FP45BB2L/" target="_blank" rel="nofollow"><em><strong>"Plane" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePjbzO"></div>                            </div>                            <script src="https://kwizly.com/embed/ePjbzO.js" async></script><h2 id="out-of-time-2003">‘Out Of Time’ (2003)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/gtVWtSTsn4M" allowfullscreen></iframe></div></div><p>Here at Tom’s Guide, we’ve marked 2026 the “Year of Denzel Washington.” To celebrate the occasion, my colleague, Malcolm McMillan, is <a href="https://www.tomsguide.com/tag/denzelwatchathon">watching every single Denzel Washington movie</a> over the course of the year (there are exactly 52, so it lines up perfectly). As he’s checking them out chronologically, he’s still in the 1990s, so if you want to get a jumpstart on Malcolm’s efforts, you can stream 2003’s “Out of Time” right now.</p><p>This movie, which was Washington’s second collaboration with Carl Franklin after 1995’s “Devil in a Blue Dress,” doesn’t have the enduring popularity of the Hollywood icon’s strongest work. However, it remains worth a look with the right expectation. Matt (Washington) is the chief of police in a small Florida Keys town who gets entangled in a corruption conspiracy when his lover is killed, and he’s set up to be the fall guy. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B09PRSVYQN/" target="_blank" rel="nofollow"><em><strong>"Out of Time" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-debt-2011">‘The Debt’ (2011)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DbYw8SPKj1E" allowfullscreen></iframe></div></div><p>Thriller fans looking for star power alongside twists should check out “The Debt” now that it’s been added to Prime Video. This 2010 thriller is headlined by Helen Mirren, Jessica Chastain and Sam Worthington, and is actually a remake of a 2007 Israeli film. Like the other two picks on this list, it has its issues and flaws, but if you crave excitement set in the world of international covert ops, “The Debt” won’t leave you feeling shortchanged.</p><p>Opening in 1965, “The Debt” sees three Mossad agents travel to East Berlin to find and eliminate a German war criminal who is now working as a gynecologist. When the mission goes poorly and the target escapes capture, the agents agree to lie about the outcome to avoid disgrace upon their return home. Eventually, years later, their charade threatens to unravel, with grim consequences for all involved in the dangerous lie.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Debt-Helen-Mirren/dp/B006INDMEE" target="_blank" rel="nofollow"><em><strong>"The Debt" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/news/how-to-get-prime-video-for-free">How to get Prime Video for free</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-june-15-21">Prime Video top 10 movies — here’s the 3 worth watching</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-forgotten-crime-mystery-with-denzel-washington-and-eva-mendes-june-16-22</link>
                                                                            <description>
                            <![CDATA[ Looking for the latest thriller movies added to Prime Video? I've found a trio of recent arrivals that pack action, tension, and twists. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">P4ouj8JfjaxqGBZU6LA5Wh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 16 Jun 2026 11:47:12 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a laser speed abstract background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a laser speed abstract background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a laser speed abstract background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prime Video is always adding thriller movies to its library, and it’s not a surprise. I track <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> charts for a living and can tell you firsthand that the genre is extremely popular across platforms. The Amazon-owned service is no exception to this trend. </p><p>So, if you’re a Prime Video subscriber with a love of thrillers (join the club!), I’ve combed through the new additions to the service in June 2026 and found three that are sure to give your watchlist a jolt of adrenaline. This week’s trio includes thrillers led by Gerard Butler, Denzel Washington and…Helen Mirren!</p><p>These are the Prime Video thriller movies you need to consider streaming this week.</p><h3 class="article-body__section" id="section-best-new-to-prime-video-thriller-movies-this-week"><span>Best new to Prime Video thriller movies this week</span></h3><h2 id="plane-2023-2">‘Plane’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/M25zXBIUVr0" allowfullscreen></iframe></div></div><p>If you like your thrillers to be on the nose, then “Plane” is the pick for you this week. This Gerard Butler-led action effort disregards subtlety in favor of big thrills and ludicrous narrative leaps. But, most surprisingly, it all works. “Plane” could never be labeled Oscar-worthy, but it’s consistently enjoyable from start to finish. Butler and co-star Mike Colter also make for a great buddy-cop-style team, even if their alliance is a fragile one.</p><p>Brodie Torrance (Butler) is a pilot forced to take drastic measures when lightning threatens the safety of his plane and its passengers. With no choice but to land in a war-torn region, the crash is just the start of the ordeal. Teaming up with an accused murderer, Louis Gaspare (Colter), who was on the airplane in FBI custody, Torrance and his unlikely ally have to rescue the passengers from rebel fighters who have taken them hostage.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FP45BB2L/" target="_blank" rel="nofollow"><em><strong>"Plane" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePjbzO"></div>                            </div>                            <script src="https://kwizly.com/embed/ePjbzO.js" async></script><h2 id="out-of-time-2003">‘Out Of Time’ (2003)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/gtVWtSTsn4M" allowfullscreen></iframe></div></div><p>Here at Tom’s Guide, we’ve marked 2026 the “Year of Denzel Washington.” To celebrate the occasion, my colleague, Malcolm McMillan, is <a href="https://www.tomsguide.com/tag/denzelwatchathon">watching every single Denzel Washington movie</a> over the course of the year (there are exactly 52, so it lines up perfectly). As he’s checking them out chronologically, he’s still in the 1990s, so if you want to get a jumpstart on Malcolm’s efforts, you can stream 2003’s “Out of Time” right now.</p><p>This movie, which was Washington’s second collaboration with Carl Franklin after 1995’s “Devil in a Blue Dress,” doesn’t have the enduring popularity of the Hollywood icon’s strongest work. However, it remains worth a look with the right expectation. Matt (Washington) is the chief of police in a small Florida Keys town who gets entangled in a corruption conspiracy when his lover is killed, and he’s set up to be the fall guy. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B09PRSVYQN/" target="_blank" rel="nofollow"><em><strong>"Out of Time" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-debt-2011">‘The Debt’ (2011)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DbYw8SPKj1E" allowfullscreen></iframe></div></div><p>Thriller fans looking for star power alongside twists should check out “The Debt” now that it’s been added to Prime Video. This 2010 thriller is headlined by Helen Mirren, Jessica Chastain and Sam Worthington, and is actually a remake of a 2007 Israeli film. Like the other two picks on this list, it has its issues and flaws, but if you crave excitement set in the world of international covert ops, “The Debt” won’t leave you feeling shortchanged.</p><p>Opening in 1965, “The Debt” sees three Mossad agents travel to East Berlin to find and eliminate a German war criminal who is now working as a gynecologist. When the mission goes poorly and the target escapes capture, the agents agree to lie about the outcome to avoid disgrace upon their return home. Eventually, years later, their charade threatens to unravel, with grim consequences for all involved in the dangerous lie.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Debt-Helen-Mirren/dp/B006INDMEE" target="_blank" rel="nofollow"><em><strong>"The Debt" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/news/how-to-get-prime-video-for-free">How to get Prime Video for free</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-june-15-21">Prime Video top 10 movies — here’s the 3 worth watching</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video shows to binge-watch this weekend (June 12-14) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you're in the mood for a new <a href="https://www.tomsguide.com/entertainment/streaming/prime-video"><strong>Prime Video</strong></a> show but can't figure out what to watch this weekend, don't worry. I've scoured everything newly added to <a href="https://www.tomsguide.com/tag/amazon">Amazon</a>'s <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> and checked out what's trending, and I've found a few shows worthy of binging.</p><p>Top of the list is <strong>"Every Year After," </strong>a new romantic drama set in Canada that just arrived on Prime Video this Wednesday. Then, for a change of pace, there's <strong>"The Legend of Vox Machina,"</strong> a beloved adult animated series returning for a fourth season. Finally, we're bringing things back into the realm of young romance with <strong>"Off Campus,"</strong> a steamy college drama that's garnered comparisons with "Heated Rivalry."</p><p>So without further ado, here are the 3 best new to Prime Video shows to binge-watch this weekend.</p><h2 id="every-year-after-2">'Every Year After'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/F5SpqQ8dNa8" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Romantic drama series</p><p><strong>What it's about: </strong>Adapted from a bestselling novel, "Every Year After" is told over the course of six summers, flashing back and forward from a decade later to tell the story of summer love and loss. It stars Sadie Soverall as Percy, but also features a deep ensemble main and supporting cast to tell this tale.</p><p><strong>Why you should watch it: </strong>If you enjoy a young adult romantic drama, then "Every Year After" should be right up your alley. Fair warning, though, <a href="https://www.rottentomatoes.com/tv/every_year_after/s01" target="_blank">reviews</a> have been mixed from critics and audiences alike, so this may be a case of you either love it or hate it.</p><p><em>Stream </em><a href="https://www.amazon.com/gp/video/detail/B0GXTM8G3W/" target="_blank" rel="nofollow"><em>"Every Year After" season 1 on Prime Video</em></a><em> now</em></p><h2 id="the-legend-of-vox-machina-season-4-2">'The Legend of Vox Machina' 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/FkqIXFztj6Q" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Adult animated fantasy series</p><p><strong>What it's about:</strong>  "The Legend of Vox Machina" is set around an ensemble of intrepid but unlikely heroes. In season 4, it's been a year since they defeated the dragons of the Chroma Conclave, and some of the group are taking the lack of a quest harder than others. But their moment of peace is quickly shattered when "The Whispered One" raises a cult of deadly followers to escape a hellish prison. </p><p><strong>Why you should watch it: </strong>I love this show, and I've already <a href="https://www.tiktok.com/@tomsguideentertainment/video/7647260280967253278" target="_blank">binged the entire fourth season</a>. Things start a bit slow, but once the story gets going, the show is as good as it's ever been. If you like shows like the original "Avatar: The Last Airbender," this show is a must-watch.</p><p><em>Stream the first six episodes of  </em><a href="https://www.amazon.com/gp/video/detail/B09PZHFHFS/" target="_blank" rel="nofollow"><em>"The Legend of Vox Machina" season 4 on Prime Video</em></a><em> now</em></p><h2 id="off-campus-season-1">'Off Campus' season 1</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wAozjf2frxw" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Romantic drama series</p><p><strong>What it's about:</strong> "Off Campus" focuses on the fake relationship between hockey-hating music major Hannah Wells (Ella Bright) and the university's all-star center player, Garret Graham (Belmont Cameli). But while they initially pretend to date to help each other out, they find their fake romance might not be an act after all.</p><p><strong>Why you should watch it: </strong>Dubbed by some as the straight version of "Heated Rivalry" because ... well, sex and hockey, this show definitely manages to keep things heated, both on and off the ice. It's been a smash hit for Prime Video, and you can binge the entire first season right now.</p><p><em>Stream </em><a href="https://www.amazon.com/gp/video/detail/B0GN8NL4Q1" target="_blank" rel="nofollow"><em>"Off Campus" season 1 on Prime Video</em></a><em> now</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xj3QYe"></div>                            </div>                            <script src="https://kwizly.com/embed/Xj3QYe.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/paramount-plus/3-new-to-paramount-shows-you-need-to-binge-watch-this-weekend-june-12-14">3 new to Paramount+ shows you need to binge-watch this weekend (June 12-14)</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 movies for free — no Prime membership required</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/disclosure-day-review">'Disclosure Day' review: Steven Spielberg reminds us of his greatness in his latest sci-fi epic</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-shows-to-binge-watch-this-weekend-june-12-14-2026</link>
                                                                            <description>
                            <![CDATA[ Planning to binge-watch something new this weekend? Here's our weekly guide to the best new to Prime Video series you should be streaming right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8tgkWvNBEhDeKq5H2GaW2V</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 12 Jun 2026 18:29:47 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></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/jpeg" url="https://cdn.mos.cms.futurecdn.net/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg">
                                                            <media:credit><![CDATA[Mimadeo / Alamy]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sunset background for Prime Video logo]]></media:description>                                                            <media:text><![CDATA[Sunset background for Prime Video logo]]></media:text>
                                <media:title type="plain"><![CDATA[Sunset background for Prime Video logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you're in the mood for a new <a href="https://www.tomsguide.com/entertainment/streaming/prime-video"><strong>Prime Video</strong></a> show but can't figure out what to watch this weekend, don't worry. I've scoured everything newly added to <a href="https://www.tomsguide.com/tag/amazon">Amazon</a>'s <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> and checked out what's trending, and I've found a few shows worthy of binging.</p><p>Top of the list is <strong>"Every Year After," </strong>a new romantic drama set in Canada that just arrived on Prime Video this Wednesday. Then, for a change of pace, there's <strong>"The Legend of Vox Machina,"</strong> a beloved adult animated series returning for a fourth season. Finally, we're bringing things back into the realm of young romance with <strong>"Off Campus,"</strong> a steamy college drama that's garnered comparisons with "Heated Rivalry."</p><p>So without further ado, here are the 3 best new to Prime Video shows to binge-watch this weekend.</p><h2 id="every-year-after-2">'Every Year After'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/F5SpqQ8dNa8" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Romantic drama series</p><p><strong>What it's about: </strong>Adapted from a bestselling novel, "Every Year After" is told over the course of six summers, flashing back and forward from a decade later to tell the story of summer love and loss. It stars Sadie Soverall as Percy, but also features a deep ensemble main and supporting cast to tell this tale.</p><p><strong>Why you should watch it: </strong>If you enjoy a young adult romantic drama, then "Every Year After" should be right up your alley. Fair warning, though, <a href="https://www.rottentomatoes.com/tv/every_year_after/s01" target="_blank">reviews</a> have been mixed from critics and audiences alike, so this may be a case of you either love it or hate it.</p><p><em>Stream </em><a href="https://www.amazon.com/gp/video/detail/B0GXTM8G3W/" target="_blank" rel="nofollow"><em>"Every Year After" season 1 on Prime Video</em></a><em> now</em></p><h2 id="the-legend-of-vox-machina-season-4-2">'The Legend of Vox Machina' 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/FkqIXFztj6Q" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Adult animated fantasy series</p><p><strong>What it's about:</strong>  "The Legend of Vox Machina" is set around an ensemble of intrepid but unlikely heroes. In season 4, it's been a year since they defeated the dragons of the Chroma Conclave, and some of the group are taking the lack of a quest harder than others. But their moment of peace is quickly shattered when "The Whispered One" raises a cult of deadly followers to escape a hellish prison. </p><p><strong>Why you should watch it: </strong>I love this show, and I've already <a href="https://www.tiktok.com/@tomsguideentertainment/video/7647260280967253278" target="_blank">binged the entire fourth season</a>. Things start a bit slow, but once the story gets going, the show is as good as it's ever been. If you like shows like the original "Avatar: The Last Airbender," this show is a must-watch.</p><p><em>Stream the first six episodes of  </em><a href="https://www.amazon.com/gp/video/detail/B09PZHFHFS/" target="_blank" rel="nofollow"><em>"The Legend of Vox Machina" season 4 on Prime Video</em></a><em> now</em></p><h2 id="off-campus-season-1">'Off Campus' season 1</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wAozjf2frxw" allowfullscreen></iframe></div></div><p><strong>Genre:</strong> Romantic drama series</p><p><strong>What it's about:</strong> "Off Campus" focuses on the fake relationship between hockey-hating music major Hannah Wells (Ella Bright) and the university's all-star center player, Garret Graham (Belmont Cameli). But while they initially pretend to date to help each other out, they find their fake romance might not be an act after all.</p><p><strong>Why you should watch it: </strong>Dubbed by some as the straight version of "Heated Rivalry" because ... well, sex and hockey, this show definitely manages to keep things heated, both on and off the ice. It's been a smash hit for Prime Video, and you can binge the entire first season right now.</p><p><em>Stream </em><a href="https://www.amazon.com/gp/video/detail/B0GN8NL4Q1" target="_blank" rel="nofollow"><em>"Off Campus" season 1 on Prime Video</em></a><em> now</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xj3QYe"></div>                            </div>                            <script src="https://kwizly.com/embed/Xj3QYe.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/paramount-plus/3-new-to-paramount-shows-you-need-to-binge-watch-this-weekend-june-12-14">3 new to Paramount+ shows you need to binge-watch this weekend (June 12-14)</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 movies for free — no Prime membership required</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/disclosure-day-review">'Disclosure Day' review: Steven Spielberg reminds us of his greatness in his latest sci-fi epic</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 new to Prime Video thriller movies to watch this week — including a Gerard Butler-led hit with a 94% Rotten Tomatoes score (June 9-15) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>On the hunt for the latest thriller movies on Prime Video to watch? I've got you covered. Every week, we sift through the latest arrivals on the Amazon-owned streaming service to spotlight the standout thrillers that won't waste your precious streaming time. </p><p>As usual, Amazon kicked off the month with a huge movie drop, adding more than 70 movies on June 1, including several thrillers. Several more have trickled in throughout the first week of June. I've narrowed the list down so you don't have to spend your evening scrolling through endless titles.</p><p>If you're craving tense twists, edge-of-your-seat suspense, and a shot of adrenaline, these are the new thriller movies on Prime Video that deserve a place on your watchlist this week.</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-best-new-to-prime-video-thriller-movies-this-week"><span>Best new to Prime Video thriller movies this week</span></h3><h2 id="plane-2023-3">'Plane’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/M25zXBIUVr0" allowfullscreen></iframe></div></div><p>Netflix subscribers were obsessed with "Plane" when it landed on the platform last summer, and now audiences on Prime Video can see whether it lives up to its 94% audience score on <a href="https://www.rottentomatoes.com/m/plane" target="_blank">Rotten Tomatoes</a>. "Plane" stars Gerard Butler as Brodie Torrance, a former Royal Air Force pilot who's stuck in a desperate situation when a mid-air lightning strike forces him to land on a war-torn island. </p><p>Though he manages to land safely and save everyone on board, that relief is short-lived when local rebels start picking off passengers one by one. He must team up with a fugitive who was being transported on board ("Luke Cage's" Mike Colter) to save the rest of the survivors from the same gruesome fate.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Plane-Jean-Fran%C3%A7ois-Richet/dp/B0FP3HQYRW" target="_blank" rel="nofollow"><em><strong>"Plane" on Prime Video</strong></em></a><em><strong> from June 12</strong></em></p><h2 id="the-protege-2021">‘The Protégé' (2021)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/fSqa0a3mGk8" allowfullscreen></iframe></div></div><p>Maggie Q and Michael Keaton have an electric chemistry in "The Protégé," an action thriller from James Bond director Martin Campbell that mixes globe-trotting action and espionage with a cat-and-mouse relationship between its two leads. After surviving a massacre as a child, Anna (Q) is trained by the legendary hitman Moody (Samuel L. Jackson) to become one of the world's deadliest assassins. </p><p>When her mentor winds up dead, she hunts down the people responsible and uncovers a conspiracy tied to a powerful figure from Moody's past. Her investigation also sends her on a collision course with fellow assassin Rembrandt (Keaton), who, even in his 70s, manages to keep pace with her in electrifyingly choreographed fight scenes. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Prot%C3%A9g%C3%A9-Michael-Keaton/dp/B09FKQZP6H" target="_blank" rel="nofollow"><em><strong>"The Protégé" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-debt-2011-2">‘The Debt' (2011)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DbYw8SPKj1E" allowfullscreen></iframe></div></div><p>"The Debt" is another well-crafted espionage thriller with a twist I honestly didn't see coming. Israeli Mossad agents Rachel Singer (Helen Mirren), David Peretz (Ciarán Hinds ), and Stefan Gold (Tom Wilkinson) are celebrated as national heroes for a daring mission to capture a Nazi war criminal in the 1960s, but the sanitized PR version may not be the whole story. </p><p>The trio cross paths again when Rachel's daughter publishes a book about their exploits, an uneasy reunion that reveals what actually went down in 1965 was not what they told the world. Through flashbacks, younger versions of the trio portrayed by Jessica Chastain, Sam Worthington, and Marton Csokas show how sideways the mission actually went, and how they've been haunted by guilt ever since. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Debt-Helen-Mirren/dp/B006INDMEE" target="_blank" rel="nofollow"><em><strong>"The Debt" 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/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-june-8-14">Prime Video top 10 movies — here’s the 3 worth watching this week (June 8-14)</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-has-the-most-perfect-darkly-funny-indie-movie-ive-ever-seen-and-it-stars-a-young-natasha-lyonne">Prime Video has the most perfect, darkly funny indie movie I've ever seen — and it stars a young Natasha Lyonne</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-watch-this-week-including-a-gerard-butler-led-hit-with-a-94-percent-rotten-tomatoes-score-june-9-15</link>
                                                                            <description>
                            <![CDATA[ These are the latest thriller movies added to Prime Video's thriller library this week, including a Gerard Butler-led hit with a 94% audience score on Rotten Tomatoes. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dbLYM84RhzNDADThGbNqKA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 09 Jun 2026 13:15:51 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo ]]></media:description>                                                            <media:text><![CDATA[Prime Video logo ]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>On the hunt for the latest thriller movies on Prime Video to watch? I've got you covered. Every week, we sift through the latest arrivals on the Amazon-owned streaming service to spotlight the standout thrillers that won't waste your precious streaming time. </p><p>As usual, Amazon kicked off the month with a huge movie drop, adding more than 70 movies on June 1, including several thrillers. Several more have trickled in throughout the first week of June. I've narrowed the list down so you don't have to spend your evening scrolling through endless titles.</p><p>If you're craving tense twists, edge-of-your-seat suspense, and a shot of adrenaline, these are the new thriller movies on Prime Video that deserve a place on your watchlist this week.</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-best-new-to-prime-video-thriller-movies-this-week"><span>Best new to Prime Video thriller movies this week</span></h3><h2 id="plane-2023-3">'Plane’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/M25zXBIUVr0" allowfullscreen></iframe></div></div><p>Netflix subscribers were obsessed with "Plane" when it landed on the platform last summer, and now audiences on Prime Video can see whether it lives up to its 94% audience score on <a href="https://www.rottentomatoes.com/m/plane" target="_blank">Rotten Tomatoes</a>. "Plane" stars Gerard Butler as Brodie Torrance, a former Royal Air Force pilot who's stuck in a desperate situation when a mid-air lightning strike forces him to land on a war-torn island. </p><p>Though he manages to land safely and save everyone on board, that relief is short-lived when local rebels start picking off passengers one by one. He must team up with a fugitive who was being transported on board ("Luke Cage's" Mike Colter) to save the rest of the survivors from the same gruesome fate.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Plane-Jean-Fran%C3%A7ois-Richet/dp/B0FP3HQYRW" target="_blank" rel="nofollow"><em><strong>"Plane" on Prime Video</strong></em></a><em><strong> from June 12</strong></em></p><h2 id="the-protege-2021">‘The Protégé' (2021)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/fSqa0a3mGk8" allowfullscreen></iframe></div></div><p>Maggie Q and Michael Keaton have an electric chemistry in "The Protégé," an action thriller from James Bond director Martin Campbell that mixes globe-trotting action and espionage with a cat-and-mouse relationship between its two leads. After surviving a massacre as a child, Anna (Q) is trained by the legendary hitman Moody (Samuel L. Jackson) to become one of the world's deadliest assassins. </p><p>When her mentor winds up dead, she hunts down the people responsible and uncovers a conspiracy tied to a powerful figure from Moody's past. Her investigation also sends her on a collision course with fellow assassin Rembrandt (Keaton), who, even in his 70s, manages to keep pace with her in electrifyingly choreographed fight scenes. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Prot%C3%A9g%C3%A9-Michael-Keaton/dp/B09FKQZP6H" target="_blank" rel="nofollow"><em><strong>"The Protégé" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-debt-2011-2">‘The Debt' (2011)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DbYw8SPKj1E" allowfullscreen></iframe></div></div><p>"The Debt" is another well-crafted espionage thriller with a twist I honestly didn't see coming. Israeli Mossad agents Rachel Singer (Helen Mirren), David Peretz (Ciarán Hinds ), and Stefan Gold (Tom Wilkinson) are celebrated as national heroes for a daring mission to capture a Nazi war criminal in the 1960s, but the sanitized PR version may not be the whole story. </p><p>The trio cross paths again when Rachel's daughter publishes a book about their exploits, an uneasy reunion that reveals what actually went down in 1965 was not what they told the world. Through flashbacks, younger versions of the trio portrayed by Jessica Chastain, Sam Worthington, and Marton Csokas show how sideways the mission actually went, and how they've been haunted by guilt ever since. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Debt-Helen-Mirren/dp/B006INDMEE" target="_blank" rel="nofollow"><em><strong>"The Debt" 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/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-june-8-14">Prime Video top 10 movies — here’s the 3 worth watching this week (June 8-14)</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-has-the-most-perfect-darkly-funny-indie-movie-ive-ever-seen-and-it-stars-a-young-natasha-lyonne">Prime Video has the most perfect, darkly funny indie movie I've ever seen — and it stars a young Natasha Lyonne</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I watch movies for a living and these are the 5 Prime Video films I’m adding to my summer watchlist ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Much as I love being outdoors in the summer, my plans for the warmer months always include spending some time inside where it's nice and cool (thank you, AC), enjoying some of the best seasonal watch on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> like Prime Video. </p><p>For me, the best summer movies range from feel-good comedies to adventurous blockbusters, and if they can appeal to the whole family, even better. Fortunately, Prime Video has plenty of options in its library that feel almost tailor-made for the summer season. </p><p>I’ve dived into Prime Video’s sizeable content catalog and picked out a handful of movies that are definitely on my watchlist this summer. These movies deliver laughs, adventure, thrills and more, and are certainly good enough to have you skip spending time in the sun.  </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="instant-family-2018">‘Instant Family’ (2018)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IUfZq3DUd3Y" allowfullscreen></iframe></div></div><p>Sometimes all you need for a feel-good watch is a simple idea, and that’s the case with “Instant Family.” This comedy-drama is inspired by writer/director Sean Anders’ own personal experience with the foster care system, and it’s not ashamed of its very big heart and celebration of family in all its forms. With a great cast headlined by Mark Wahlberg, Rose Byrne, Isabela Merced and Octavia Spencer, “Instant Family” is a great pick if you need some laughs and maybe want to shed a couple of happy tears, too.</p><p>Pete (Wahlberg) and Ellie (Byrne) are a long-term couple who leap into the world of foster care adoption. Their initial plan to take in a single younger child is upended when they become new parents to three siblings, including a cynical 15-year-old (Merced). With three new kids in their household, Pete and Ellie have to learn how to parent on the job.  </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G34KGQSB/" target="_blank" rel="nofollow"><em><strong>"Instant Family" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-bluff-2026">‘The Bluff’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/uUYMqRjNxhM" allowfullscreen></iframe></div></div><p>For the most part, I find myself unimpressed with Prime Video’s original movie lineup, but “The Bluff” was a pleasant surprise in that regard. Far from flawless, it’s a thrilling swashbuckling action movie set in the world of piracy. And we really do need more pirate movies. Just be aware it’s significantly more R-rated than something like “Pirates of the Caribbean,” so don’t pick this one if you need a movie the whole family can watch. </p><p>Set in the late 19th century, during the dying age of piracy, Ercell Bodden (Chopra Jonas) is a former pirate, once known as Bloody Mary, now living in peace on a tropical Caribbean island with her family. She might be done with her cutthroat past, but the past, or more specifically Captain Connor (Urban), isn’t finished with her. When Connor and his crew come looking for revenge, Ercell must become her past self to protect her loved ones.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G569YVZW/" target="_blank" rel="nofollow"><em><strong>"The Bluff" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-idea-of-you-2024">‘The Idea of You’ (2024)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/V8i6PB0gGOA" allowfullscreen></iframe></div></div><p>Am I including Prime Video rom-com “The Idea of You” just because I unironically think the tune “Dance Before We Walk” by the movie’s fictional boy band August Moon is a total summer bop? Maybe, but aside from its earworm original tracks, “The Idea of You” also boasts Anne Hathaway, and the actress brings her dependable charms and on-screen appeal to the movie. Nicholas Galitzine isn’t too unappealing as the male lead, either.</p><p>Hathaway plays Solène Marchand, a divorced art gallery owner, who takes her daughter to the Coachella music festival, only to stumble into the backstage artist area and meet Hayes Campbell (Galitzine), the dreamy lead singer of August Moon (think One Direction with the serial number filed off). Despite their age difference, Solène and Hayes start a romance, which draws the attention of the paparazzi and much social media comment.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CV74LGPX/" target="_blank" rel="nofollow"><em><strong>"The Idea of You" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="transformers-one-2024">‘Transformers One’ (2024)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/0rmJXXKDrsM" allowfullscreen></iframe></div></div><p>It speaks to the brand damage that the later, truly terrible, live-action “Transformers” movies inflicted on the franchise that the return-to-form “Transformers One” underperformed at the box office, likely costing us a chance at a sequel.  That’s frustrating because this animated prequel is perhaps the best big-screen interpretation of the robots-in-disguise to date, and it’s a great summer Blockbuster that the whole family can enjoy. </p><p>Set in the futuristic world of Cybertron, Orion Pax (voiced by Chris Hemsworth) and D-16 (Brian Tyree Henry) are best friends working in the Energon mines. Desperate to prove themselves heroes, they set off on a quest to find the fabled Matrix of Leadership, which inadvertently sets them on a course to becoming sworn enemies, Optimus Prime and Megatron. “Transformers One” is an action-packed ride, combined with well-written comedy and a surprising layer of moral complexity. It’s much more than a sign of the “Transformers” franchise running on fumes.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G3D5XHTX/" target="_blank" rel="nofollow"><em><strong>"Transformers One" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePVRlO"></div>                            </div>                            <script src="https://kwizly.com/embed/ePVRlO.js" async></script><h2 id="heat-1995">‘Heat’ (1995)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/14oNcFxiVaQ" allowfullscreen></iframe></div></div><p>Michael Mann’s classic “Heat” has been inspiring modern crime thrillers for more than two decades, and considering its setting in the sweltering <em>heat </em>of Los Angeles, it’s a great summer watch if you’re looking for a movie that is a little more grown-up. It’s a real epic drama, anchored by a strong cast (Al Pacino, Robert DeNiro and Val Kilmer), and has often been cited as one of the most influential crime movies ever. What more do I need to say?</p><p>Neil McCauley (De Niro) is a master career thief planning one last major score before retirement. At the same time, Lieutenant Hanna (Al Pacino) is circling, willing to go to extreme lengths to catch McCauley and his crew. As this cat-and-mouse game unfolds, the two men on opposite sides of the law develop a mutual respect. “Heat” is a titan of the crime thriller genre and a must-watch if you enjoyed recent Prime Video films like “Crime 101.”</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Heat-Michael-Mann/dp/B06XC8WKX1/" target="_blank" rel="nofollow"><em><strong>"Heat" 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/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">The best streaming services to subscribe to right now</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/i-watch-netflix-movies-for-a-living-and-these-are-the-5-films-im-adding-to-my-summer-watchlist">5 Netflix movies I’m adding to my summer watchlist</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/i-watch-movies-for-a-living-and-these-are-the-5-prime-video-films-im-adding-to-my-summer-watchlist</link>
                                                                            <description>
                            <![CDATA[ Prime Video is one of my top choices for seasonal movies, and here are the five picks I'm adding to my summer watchlist this year. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xDTNsGAnmcZVWc5uocUkEK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jei6mM4DzGfkzn9S6Ezz7U-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 06 Jun 2026 08:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/jei6mM4DzGfkzn9S6Ezz7U-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a yellow popcorn background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a yellow popcorn background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a yellow popcorn background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jei6mM4DzGfkzn9S6Ezz7U-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Much as I love being outdoors in the summer, my plans for the warmer months always include spending some time inside where it's nice and cool (thank you, AC), enjoying some of the best seasonal watch on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> like Prime Video. </p><p>For me, the best summer movies range from feel-good comedies to adventurous blockbusters, and if they can appeal to the whole family, even better. Fortunately, Prime Video has plenty of options in its library that feel almost tailor-made for the summer season. </p><p>I’ve dived into Prime Video’s sizeable content catalog and picked out a handful of movies that are definitely on my watchlist this summer. These movies deliver laughs, adventure, thrills and more, and are certainly good enough to have you skip spending time in the sun.  </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="instant-family-2018">‘Instant Family’ (2018)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IUfZq3DUd3Y" allowfullscreen></iframe></div></div><p>Sometimes all you need for a feel-good watch is a simple idea, and that’s the case with “Instant Family.” This comedy-drama is inspired by writer/director Sean Anders’ own personal experience with the foster care system, and it’s not ashamed of its very big heart and celebration of family in all its forms. With a great cast headlined by Mark Wahlberg, Rose Byrne, Isabela Merced and Octavia Spencer, “Instant Family” is a great pick if you need some laughs and maybe want to shed a couple of happy tears, too.</p><p>Pete (Wahlberg) and Ellie (Byrne) are a long-term couple who leap into the world of foster care adoption. Their initial plan to take in a single younger child is upended when they become new parents to three siblings, including a cynical 15-year-old (Merced). With three new kids in their household, Pete and Ellie have to learn how to parent on the job.  </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G34KGQSB/" target="_blank" rel="nofollow"><em><strong>"Instant Family" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-bluff-2026">‘The Bluff’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/uUYMqRjNxhM" allowfullscreen></iframe></div></div><p>For the most part, I find myself unimpressed with Prime Video’s original movie lineup, but “The Bluff” was a pleasant surprise in that regard. Far from flawless, it’s a thrilling swashbuckling action movie set in the world of piracy. And we really do need more pirate movies. Just be aware it’s significantly more R-rated than something like “Pirates of the Caribbean,” so don’t pick this one if you need a movie the whole family can watch. </p><p>Set in the late 19th century, during the dying age of piracy, Ercell Bodden (Chopra Jonas) is a former pirate, once known as Bloody Mary, now living in peace on a tropical Caribbean island with her family. She might be done with her cutthroat past, but the past, or more specifically Captain Connor (Urban), isn’t finished with her. When Connor and his crew come looking for revenge, Ercell must become her past self to protect her loved ones.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G569YVZW/" target="_blank" rel="nofollow"><em><strong>"The Bluff" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-idea-of-you-2024">‘The Idea of You’ (2024)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/V8i6PB0gGOA" allowfullscreen></iframe></div></div><p>Am I including Prime Video rom-com “The Idea of You” just because I unironically think the tune “Dance Before We Walk” by the movie’s fictional boy band August Moon is a total summer bop? Maybe, but aside from its earworm original tracks, “The Idea of You” also boasts Anne Hathaway, and the actress brings her dependable charms and on-screen appeal to the movie. Nicholas Galitzine isn’t too unappealing as the male lead, either.</p><p>Hathaway plays Solène Marchand, a divorced art gallery owner, who takes her daughter to the Coachella music festival, only to stumble into the backstage artist area and meet Hayes Campbell (Galitzine), the dreamy lead singer of August Moon (think One Direction with the serial number filed off). Despite their age difference, Solène and Hayes start a romance, which draws the attention of the paparazzi and much social media comment.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CV74LGPX/" target="_blank" rel="nofollow"><em><strong>"The Idea of You" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="transformers-one-2024">‘Transformers One’ (2024)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/0rmJXXKDrsM" allowfullscreen></iframe></div></div><p>It speaks to the brand damage that the later, truly terrible, live-action “Transformers” movies inflicted on the franchise that the return-to-form “Transformers One” underperformed at the box office, likely costing us a chance at a sequel.  That’s frustrating because this animated prequel is perhaps the best big-screen interpretation of the robots-in-disguise to date, and it’s a great summer Blockbuster that the whole family can enjoy. </p><p>Set in the futuristic world of Cybertron, Orion Pax (voiced by Chris Hemsworth) and D-16 (Brian Tyree Henry) are best friends working in the Energon mines. Desperate to prove themselves heroes, they set off on a quest to find the fabled Matrix of Leadership, which inadvertently sets them on a course to becoming sworn enemies, Optimus Prime and Megatron. “Transformers One” is an action-packed ride, combined with well-written comedy and a surprising layer of moral complexity. It’s much more than a sign of the “Transformers” franchise running on fumes.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G3D5XHTX/" target="_blank" rel="nofollow"><em><strong>"Transformers One" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePVRlO"></div>                            </div>                            <script src="https://kwizly.com/embed/ePVRlO.js" async></script><h2 id="heat-1995">‘Heat’ (1995)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/14oNcFxiVaQ" allowfullscreen></iframe></div></div><p>Michael Mann’s classic “Heat” has been inspiring modern crime thrillers for more than two decades, and considering its setting in the sweltering <em>heat </em>of Los Angeles, it’s a great summer watch if you’re looking for a movie that is a little more grown-up. It’s a real epic drama, anchored by a strong cast (Al Pacino, Robert DeNiro and Val Kilmer), and has often been cited as one of the most influential crime movies ever. What more do I need to say?</p><p>Neil McCauley (De Niro) is a master career thief planning one last major score before retirement. At the same time, Lieutenant Hanna (Al Pacino) is circling, willing to go to extreme lengths to catch McCauley and his crew. As this cat-and-mouse game unfolds, the two men on opposite sides of the law develop a mutual respect. “Heat” is a titan of the crime thriller genre and a must-watch if you enjoyed recent Prime Video films like “Crime 101.”</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Heat-Michael-Mann/dp/B06XC8WKX1/" target="_blank" rel="nofollow"><em><strong>"Heat" 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/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">The best streaming services to subscribe to right now</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/i-watch-netflix-movies-for-a-living-and-these-are-the-5-films-im-adding-to-my-summer-watchlist">5 Netflix movies I’m adding to my summer watchlist</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 new to Prime Video thriller movies to watch this week — including a neo-noir pick starring Liam Neeson (June 2-8) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Looking for the latest thriller movies on Prime Video? You're in the right place. Every week, I take a look through the recent additions to the Amazon-owned streaming service and pick out the best thrillers. </p><p>Amazon typically kicks off the month with a huge movie drop, and June 2026 has been no different. Prime Video added more than 70 movies on June 1, including several thrillers. To save you the headache of combing through dozens of movies, I've done the legwork for you down below. </p><p>These are the new to Prime Video thriller movies you need to know about; add them to your watchlist this week if you need a dose of adrenaline.</p><h3 class="article-body__section" id="section-best-new-to-prime-video-thriller-movies-this-week"><span>Best new to Prime Video thriller movies this week</span></h3><h2 id="a-walk-among-the-tombstones-2014-2">‘A Walk Among the Tombstones’ (2014)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aTKBowDjMQg" allowfullscreen></iframe></div></div><p>Liam Neeson has become one of the most prominent names in the thriller genre. The Northern Irish actor has starred in more than a dozen action-thriller films, including 2014’s “A Walk Among the Tombstones.” Based on the novel by Lawrence Block, this one ranks among Neeson’s strongest efforts, giving the actor a meaty character to dig into, and its neo-noir style helps it stand apart from some of his blander action-thriller projects.</p><p>Matt Scudder (Neeson) is a retired NYPD detective, now working as a private investigator, and attending Alcoholics Anonymous meetings to help battle his demons. When he’s approached by a wealthy drug dealer (Dan Stevens), he’s hired for a twisting case. The dealer’s wife was kidnapped, and despite the requested ransom being paid, she was still brutally murdered. He wants her killers found and brought to justice. As Scudder investigates the killing, he sinks into New York’s criminal underworld and also encounters Ray (David Harbour), a sadistic criminal.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B00QHMEGXC/" target="_blank" rel="nofollow"><em><strong>"A Walk Among the Tombstones" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eM76lO"></div>                            </div>                            <script src="https://kwizly.com/embed/eM76lO.js" async></script><h2 id="mad-max-1979">‘Mad Max’ (1979)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/76jy3zJ9_PE" allowfullscreen></iframe></div></div><p>2014’s “Fury Road” might be my favorite of the “Mad Max” series, not to mention one of the finest action movies ever made, but there’s still value in celebrating the franchise originator. This influential post-apocalyptic action-thriller stars Mel Gibson as the titular Max and is directed by George Miller, who has helmed every installment in the saga to date. It doesn’t have the spectacle of “Fury Road” or the truly wild streak of later sequels like 1985’s “Beyond Thunderdome,” but it’s a gritty dystopian flick, fueled by carnage, chaos and engine fumes.</p><p>Set in a future Australia where society has collapsed due to environmental destruction, Max Rockatansky (Gibson) is a highway patrolman and the top agent for the Main Force Patrol, one of the few remaining law enforcement bodies in this increasingly lawless world. But when Max encounters a ruthless motorcycle gang and his family is left in ruins, he resolves to operate outside of the law. The road warrior sets out across the barren wasteland in search of revenge against those who have wronged him.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GKJZV3KK/" target="_blank" rel="nofollow"><em><strong>"Mad Max" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="guns-akimbo-2020">‘Guns Akimbo’ (2020)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ZOFatKD0Vzo" allowfullscreen></iframe></div></div><p>After wrapping up the “Harry Potter" series in the early 2010s, Daniel Radcliffe hasn't been afraid to experiment. Instead of leaping into another blockbuster franchise, he’s taken on a range of quirky and oddball projects. These include “Guns Akimbo,” a gloriously silly and completely over-the-top action-thriller cut with plenty of dark comedy. Its brash tone might not connect with everybody, but if you’re on board with its juvenile humor, there’s much to enjoy in this truly bonkers flick. </p><p>Set in a world where an online death match has become popular entertainment. Miles Lee Harris (Radcliffe) is an outspoken computer programmer who blasts viewers for taking pleasure in watching live-streamed death matches. This results in him awaking with two pistols bolted to his hands, and if that wasn’t bad enough, he’s forced to participate in the internet fight club. His odds of survival appear particularly remote when it’s revealed that his opponent is one of the game’s top killers, Nix (Samara Weaving). But can Miles bring down the game from within?</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G5FRG4JS/" target="_blank" rel="nofollow"><em><strong>"Guns Akimbo" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-canceled-this-dark-comedy-way-too-soon-now-is-your-chance-to-binge-it">Prime Video canceled this comedy too soon — binge it now</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-71-new-movies-here-are-the-5-im-streaming-first">Prime Video just added 71 new movies — here's 5 I’m streaming</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-watch-this-week-including-a-neo-noir-pick-starring-liam-neeson-june-2-8</link>
                                                                            <description>
                            <![CDATA[ These are the latest thriller movies added to Prime Video's thriller library this week, including a dark noir epic starring Liam Neeson. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gbUSqzx5boMjjXTCESo5H3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 02 Jun 2026 10:44:46 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg">
                                                            <media:credit><![CDATA[Mimadeo / Alamy]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sunset background for Prime Video logo]]></media:description>                                                            <media:text><![CDATA[Sunset background for Prime Video logo]]></media:text>
                                <media:title type="plain"><![CDATA[Sunset background for Prime Video logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7v7XNmW6osSrU2CPPHzmb7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Looking for the latest thriller movies on Prime Video? You're in the right place. Every week, I take a look through the recent additions to the Amazon-owned streaming service and pick out the best thrillers. </p><p>Amazon typically kicks off the month with a huge movie drop, and June 2026 has been no different. Prime Video added more than 70 movies on June 1, including several thrillers. To save you the headache of combing through dozens of movies, I've done the legwork for you down below. </p><p>These are the new to Prime Video thriller movies you need to know about; add them to your watchlist this week if you need a dose of adrenaline.</p><h3 class="article-body__section" id="section-best-new-to-prime-video-thriller-movies-this-week"><span>Best new to Prime Video thriller movies this week</span></h3><h2 id="a-walk-among-the-tombstones-2014-2">‘A Walk Among the Tombstones’ (2014)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aTKBowDjMQg" allowfullscreen></iframe></div></div><p>Liam Neeson has become one of the most prominent names in the thriller genre. The Northern Irish actor has starred in more than a dozen action-thriller films, including 2014’s “A Walk Among the Tombstones.” Based on the novel by Lawrence Block, this one ranks among Neeson’s strongest efforts, giving the actor a meaty character to dig into, and its neo-noir style helps it stand apart from some of his blander action-thriller projects.</p><p>Matt Scudder (Neeson) is a retired NYPD detective, now working as a private investigator, and attending Alcoholics Anonymous meetings to help battle his demons. When he’s approached by a wealthy drug dealer (Dan Stevens), he’s hired for a twisting case. The dealer’s wife was kidnapped, and despite the requested ransom being paid, she was still brutally murdered. He wants her killers found and brought to justice. As Scudder investigates the killing, he sinks into New York’s criminal underworld and also encounters Ray (David Harbour), a sadistic criminal.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B00QHMEGXC/" target="_blank" rel="nofollow"><em><strong>"A Walk Among the Tombstones" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eM76lO"></div>                            </div>                            <script src="https://kwizly.com/embed/eM76lO.js" async></script><h2 id="mad-max-1979">‘Mad Max’ (1979)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/76jy3zJ9_PE" allowfullscreen></iframe></div></div><p>2014’s “Fury Road” might be my favorite of the “Mad Max” series, not to mention one of the finest action movies ever made, but there’s still value in celebrating the franchise originator. This influential post-apocalyptic action-thriller stars Mel Gibson as the titular Max and is directed by George Miller, who has helmed every installment in the saga to date. It doesn’t have the spectacle of “Fury Road” or the truly wild streak of later sequels like 1985’s “Beyond Thunderdome,” but it’s a gritty dystopian flick, fueled by carnage, chaos and engine fumes.</p><p>Set in a future Australia where society has collapsed due to environmental destruction, Max Rockatansky (Gibson) is a highway patrolman and the top agent for the Main Force Patrol, one of the few remaining law enforcement bodies in this increasingly lawless world. But when Max encounters a ruthless motorcycle gang and his family is left in ruins, he resolves to operate outside of the law. The road warrior sets out across the barren wasteland in search of revenge against those who have wronged him.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GKJZV3KK/" target="_blank" rel="nofollow"><em><strong>"Mad Max" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="guns-akimbo-2020">‘Guns Akimbo’ (2020)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ZOFatKD0Vzo" allowfullscreen></iframe></div></div><p>After wrapping up the “Harry Potter" series in the early 2010s, Daniel Radcliffe hasn't been afraid to experiment. Instead of leaping into another blockbuster franchise, he’s taken on a range of quirky and oddball projects. These include “Guns Akimbo,” a gloriously silly and completely over-the-top action-thriller cut with plenty of dark comedy. Its brash tone might not connect with everybody, but if you’re on board with its juvenile humor, there’s much to enjoy in this truly bonkers flick. </p><p>Set in a world where an online death match has become popular entertainment. Miles Lee Harris (Radcliffe) is an outspoken computer programmer who blasts viewers for taking pleasure in watching live-streamed death matches. This results in him awaking with two pistols bolted to his hands, and if that wasn’t bad enough, he’s forced to participate in the internet fight club. His odds of survival appear particularly remote when it’s revealed that his opponent is one of the game’s top killers, Nix (Samara Weaving). But can Miles bring down the game from within?</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G5FRG4JS/" target="_blank" rel="nofollow"><em><strong>"Guns Akimbo" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month">New on Prime Video in June 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-canceled-this-dark-comedy-way-too-soon-now-is-your-chance-to-binge-it">Prime Video canceled this comedy too soon — binge it now</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-71-new-movies-here-are-the-5-im-streaming-first">Prime Video just added 71 new movies — here's 5 I’m streaming</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video shows to binge-watch this weekend (May 29-31) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>In the mood for a new <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> show? If your plan for the weekend is to unwind with <a href="https://www.tomsguide.com/tag/amazon">Amazon</a>'s <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>, but you don't want to waste any of your downtime finding your next show, I've got your back. </p><p>We've already sorted through all the best <a href="https://www.tomsguide.com/entertainment/streaming/from-dutton-ranch-to-jack-ryan-ghost-war-21-best-new-shows-and-movies-streaming-in-may-2026">new TV shows and movies </a>coming out in May, and below, I've rounded up a handful of recent Prime Video shows that you might want to binge-watch over the next couple of days. </p><p>Prime Video waited till Wednesday to drop its best release of the month, so I've included that plus two recent, trending releases. Here are the three new to Prime Video shows I think you should be streaming this weekend.</p><h2 id="off-campus">'Off Campus'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wAozjf2frxw" allowfullscreen></iframe></div></div><p>First up, we've got Prime Video's hit new romance series, "<a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-romantic-drama-series-is-a-pleasant-and-steamy-surprise-and-its-made-for-binge-watching">Off Campus</a>." This college drama/soap is based on the bestselling books by Elle Kennedy and revolves around the Briar University ice hockey team, their hookups, and relationships.</p><p>Each season (it's already been renewed) focuses on a different couple, and this first one revolves around the "fake dating"/ "opposites attract" relationship between hockey-hating music major Hannah Wells (Ella Bright) and the university's all-star center player, Garret Graham (Belmont Cameli). Garrett offers up his skills to help Hannah catch her <em>actual </em>crush's attention....</p><p><em><strong>Stream </strong></em><a href="https://www.primevideo.com/detail/0I4OWKAPLUWIO5013W3F3ZN952" target="_blank" rel="nofollow"><em><strong>"Off Campus" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="spider-noir">'Spider-Noir'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IJ1j7hSU6aE" allowfullscreen></iframe></div></div><p>Prime Video's newest release is also the show I'd <em>most </em>recommend on this entire list. I've already seen all eight episodes of "Spider-Noir," and I think the show's a blast: you can<a href="https://www.tomsguide.com/entertainment/prime-video/spider-noir-review-nicolas-cage-excels-in-prime-videos-binge-worthy-new-superhero-show" target="_blank"> read my "Spider-Noir" review</a> to find out why.</p><p>This new Spidey story introduces us to private detective Ben Reilly (Nicolas Cage), who <em>used to </em>protect 1930s New York as the city's only superhero. But when he takes a case that sees him crossing paths with mobsters, a femme fatale, and some powerful foes, Ben has to reckon with his past life as "The Spider."</p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/Spider-Noir/dp/B0FVGFSQ4R/" target="_blank" rel="nofollow"><em><strong>"Spider-Noir" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-boys">'The Boys' </h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/XNQbH1SDPRk" allowfullscreen></iframe></div></div><p>If you've been waiting for the perfect opportunity to get caught up on "The Boys," this weekend could be the perfect opportunity, as the series came to an end not that long ago. </p><p>In this fifth season, the irreverent superhero show saw Billy Butcher (Karl Urban), Hughie (Jack Quaid) and The Boys mounting some sort of resistance to Homelander (Antony Starr), who had taken full control of America, ruling through fear  and imprisoning his dissenters in "Freedom Camps." Their goal? To bring his tyrannical reign to an end for good. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/The-Boys/dp/B0FGFW5FSR/" target="_blank" rel="nofollow"><em><strong>"The Boys" season 5 on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ww11oX"></div>                            </div>                            <script src="https://kwizly.com/embed/Ww11oX.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/prime-video/3-best-new-to-prime-video-movies-to-stream-this-weekend-may-29-31-one-is-an-epic-western-starring-kevin-costner">3 new to Prime Video movies to stream this weekend</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 movies for free — no Prime membership required</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/james-bond-casting-is-underway-but-who-do-you-think-should-play-the-next-007">James Bond casting is underway — who do you think should play the next 007?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-shows-to-binge-watch-this-weekend-may-29-31</link>
                                                                            <description>
                            <![CDATA[ Planning to binge-watch something new this weekend? Here's our weekly guide to the best new to Prime Video series you should be streaming right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qjHBsPJNa93jBjB8BBgWBG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HhZDsjpFBh5n7m6J9bct8j-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 29 May 2026 15:54:44 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></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/HhZDsjpFBh5n7m6J9bct8j-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video streaming logo yellow]]></media:description>                                                            <media:text><![CDATA[Prime Video streaming logo yellow]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video streaming logo yellow]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HhZDsjpFBh5n7m6J9bct8j-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In the mood for a new <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> show? If your plan for the weekend is to unwind with <a href="https://www.tomsguide.com/tag/amazon">Amazon</a>'s <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>, but you don't want to waste any of your downtime finding your next show, I've got your back. </p><p>We've already sorted through all the best <a href="https://www.tomsguide.com/entertainment/streaming/from-dutton-ranch-to-jack-ryan-ghost-war-21-best-new-shows-and-movies-streaming-in-may-2026">new TV shows and movies </a>coming out in May, and below, I've rounded up a handful of recent Prime Video shows that you might want to binge-watch over the next couple of days. </p><p>Prime Video waited till Wednesday to drop its best release of the month, so I've included that plus two recent, trending releases. Here are the three new to Prime Video shows I think you should be streaming this weekend.</p><h2 id="off-campus">'Off Campus'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wAozjf2frxw" allowfullscreen></iframe></div></div><p>First up, we've got Prime Video's hit new romance series, "<a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-romantic-drama-series-is-a-pleasant-and-steamy-surprise-and-its-made-for-binge-watching">Off Campus</a>." This college drama/soap is based on the bestselling books by Elle Kennedy and revolves around the Briar University ice hockey team, their hookups, and relationships.</p><p>Each season (it's already been renewed) focuses on a different couple, and this first one revolves around the "fake dating"/ "opposites attract" relationship between hockey-hating music major Hannah Wells (Ella Bright) and the university's all-star center player, Garret Graham (Belmont Cameli). Garrett offers up his skills to help Hannah catch her <em>actual </em>crush's attention....</p><p><em><strong>Stream </strong></em><a href="https://www.primevideo.com/detail/0I4OWKAPLUWIO5013W3F3ZN952" target="_blank" rel="nofollow"><em><strong>"Off Campus" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="spider-noir">'Spider-Noir'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IJ1j7hSU6aE" allowfullscreen></iframe></div></div><p>Prime Video's newest release is also the show I'd <em>most </em>recommend on this entire list. I've already seen all eight episodes of "Spider-Noir," and I think the show's a blast: you can<a href="https://www.tomsguide.com/entertainment/prime-video/spider-noir-review-nicolas-cage-excels-in-prime-videos-binge-worthy-new-superhero-show" target="_blank"> read my "Spider-Noir" review</a> to find out why.</p><p>This new Spidey story introduces us to private detective Ben Reilly (Nicolas Cage), who <em>used to </em>protect 1930s New York as the city's only superhero. But when he takes a case that sees him crossing paths with mobsters, a femme fatale, and some powerful foes, Ben has to reckon with his past life as "The Spider."</p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/Spider-Noir/dp/B0FVGFSQ4R/" target="_blank" rel="nofollow"><em><strong>"Spider-Noir" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-boys">'The Boys' </h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/XNQbH1SDPRk" allowfullscreen></iframe></div></div><p>If you've been waiting for the perfect opportunity to get caught up on "The Boys," this weekend could be the perfect opportunity, as the series came to an end not that long ago. </p><p>In this fifth season, the irreverent superhero show saw Billy Butcher (Karl Urban), Hughie (Jack Quaid) and The Boys mounting some sort of resistance to Homelander (Antony Starr), who had taken full control of America, ruling through fear  and imprisoning his dissenters in "Freedom Camps." Their goal? To bring his tyrannical reign to an end for good. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/The-Boys/dp/B0FGFW5FSR/" target="_blank" rel="nofollow"><em><strong>"The Boys" season 5 on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ww11oX"></div>                            </div>                            <script src="https://kwizly.com/embed/Ww11oX.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/prime-video/3-best-new-to-prime-video-movies-to-stream-this-weekend-may-29-31-one-is-an-epic-western-starring-kevin-costner">3 new to Prime Video movies to stream this weekend</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 movies for free — no Prime membership required</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/james-bond-casting-is-underway-but-who-do-you-think-should-play-the-next-007">James Bond casting is underway — who do you think should play the next 007?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video movies to stream this weekend (May 29-31) — one is an epic Western starring Kevin Costner ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If your Prime Video watchlist needs bolstering ahead of the weekend, you’ve come to the right place. I’ve combed through the recent additions to the Amazon-owned streaming service and picked out a trio of fresh arrivals that are worthy of consideration. </p><p>This week, my picks range from a six-time Oscar winner that stands as one of the most acclaimed movies of the decade, a sprawling Western helmed by “Yellowstone’s” Kevin Costner, and a superhero time-waster that offers plenty of blockbuster spectacle. </p><p>These new to Prime Video movies should keep you entertained over the weekend. Add them to your watchlist now if you want to avoid the early-summer sun and stay indoors where there's AC instead.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XrmmPO"></div>                            </div>                            <script src="https://kwizly.com/embed/XrmmPO.js" async></script><h2 id="one-battle-after-another-2025">‘One Battle After Another’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/feOQFKv2Lw4" allowfullscreen></iframe></div></div><p>“One Battle After Another” has already cemented its place as a modern classic. It was this year’s awards-season darling, scooping wins at every major show, including Hollywood’s biggest prize, Best Picture, at the 2026 Oscars. From director Paul Thomas Anderson, this action-thriller epic is worthy of all the hype. It combines masterful filmmaking, pure entertainment, and a star-studded cast, all locked in and delivering peak performances. </p><p>In “One Battle After Another,” Leonardo DiCaprio plays Bob Ferguson, a former revolutionary now in hiding with his precocious daughter, Willa (Chase Infiniti). Living off the grid and deeply paranoid, Bob’s worst fear comes true when Willa goes missing, and his past catches up with him. Scrambling to locate his daughter, he must also contend with a vengeful adversary, Colonel Lockjaw (Sean Penn). The movie also packs excellent turns from Benicio del Toro and Regina Hall. It’s funny, it’s thrilling, and it’s a total must-watch.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FR5XYWH2/" target="_blank" rel="nofollow"><em><strong>"One Battle After Another" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="horizon-an-american-saga-chapter-1-2024">‘Horizon: An American Saga - Chapter 1' (2024)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YYsReoZMj1k" allowfullscreen></iframe></div></div><p>Kevin Costner’s “Horizon: An American Saga” was a hugely ambitious Western series. Planned to comprise four movies, with the first two shot back-to-back, the franchise hit a snag almost immediately when “Chapter 1” underperformed at the box office, and its sequel was indefinitely delayed. Two years later, it seems like “Horizon” might end up being a one-and-done, but in some ways, that only adds to the mystique of this Western.</p><p>Clocking in at a butt-numbing 181-minute runtime, “Horizon: An American Saga” is no quick watch, but it’s clearly Costner’s baby. Not only did he write, direct and star in this movie, but he also contributed some of his personal fortune to fund the feature. “Horizon: An American Saga” is set in the 19th century, with a sprawling story that follows multiple families as they seek prosperity in the Old West and grapple with the American Civil War. It stars Costner, Sienna Miller, Sam Worthington, Giovanni Ribisi and Jena Malone. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0D237G9QK/" target="_blank" rel="nofollow"><em><strong>"Horizon: An American Saga - Chapter 1" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="aquaman-and-the-lost-kingdom-2023">‘Aquaman and the Lost Kingdom’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/UGc5Tzz19UY" allowfullscreen></iframe></div></div><p>The DC Extended Universe concluded with “Aquaman and the Lost Kingdom” in 2023. The franchise that gave us “Batman v Superman” and the terrible “Justice League” movie isn’t exactly missed, and its successor, the James Gunn-helmed DCU, has already surpassed it with just a single entry, last year’s “Superman.” However, the two “Aquaman” movies rank among the more popular DCEU efforts, offering fantastical, underwater adventures and a likeable turn from Jason Momoa. </p><p>Four years after the first “Aquaman," Arthur Curry (Momoa) is now King of Atlantis. But in the shadows, the sinister Black Manta (Yahya Abdul-Mateen II) plots revenge and just might have the power required after uncovering the mythic Black Trident. With little choice, Arthur must form an uneasy alliance with his estranged brother, Orm (Patrick Wilson). There’s certainly a generic quality to this “Aquaman” sequel, but if you keep your expectations in check, it’s possible to enjoy this CGI-fueled superhero adventure.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CPRVTZ5W/" target="_blank" rel="nofollow"><em><strong>"Aquaman and the Lost Kingdom" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-may-2026-what-to-stream-this-month">New on Prime Video in May 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-may-25-31">Prime Video top 10 movies — here’s the 3 worth watching</a></li><li><a href="https://www.tomsguide.com/news/how-to-get-prime-video-for-free">How to get Prime Video for free</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-movies-to-stream-this-weekend-may-29-31-one-is-an-epic-western-starring-kevin-costner</link>
                                                                            <description>
                            <![CDATA[ Prime Video is always adding more movies, and these three recently added films are worthy of a spot in your watchlist this weekend. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CLEWKZx2toJep4rvHVgWBS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 29 May 2026 13:46:35 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/aozP98atByMPCDdiMyJSPC-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on teal bubbles background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on teal bubbles background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on teal bubbles background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aozP98atByMPCDdiMyJSPC-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If your Prime Video watchlist needs bolstering ahead of the weekend, you’ve come to the right place. I’ve combed through the recent additions to the Amazon-owned streaming service and picked out a trio of fresh arrivals that are worthy of consideration. </p><p>This week, my picks range from a six-time Oscar winner that stands as one of the most acclaimed movies of the decade, a sprawling Western helmed by “Yellowstone’s” Kevin Costner, and a superhero time-waster that offers plenty of blockbuster spectacle. </p><p>These new to Prime Video movies should keep you entertained over the weekend. Add them to your watchlist now if you want to avoid the early-summer sun and stay indoors where there's AC instead.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XrmmPO"></div>                            </div>                            <script src="https://kwizly.com/embed/XrmmPO.js" async></script><h2 id="one-battle-after-another-2025">‘One Battle After Another’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/feOQFKv2Lw4" allowfullscreen></iframe></div></div><p>“One Battle After Another” has already cemented its place as a modern classic. It was this year’s awards-season darling, scooping wins at every major show, including Hollywood’s biggest prize, Best Picture, at the 2026 Oscars. From director Paul Thomas Anderson, this action-thriller epic is worthy of all the hype. It combines masterful filmmaking, pure entertainment, and a star-studded cast, all locked in and delivering peak performances. </p><p>In “One Battle After Another,” Leonardo DiCaprio plays Bob Ferguson, a former revolutionary now in hiding with his precocious daughter, Willa (Chase Infiniti). Living off the grid and deeply paranoid, Bob’s worst fear comes true when Willa goes missing, and his past catches up with him. Scrambling to locate his daughter, he must also contend with a vengeful adversary, Colonel Lockjaw (Sean Penn). The movie also packs excellent turns from Benicio del Toro and Regina Hall. It’s funny, it’s thrilling, and it’s a total must-watch.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FR5XYWH2/" target="_blank" rel="nofollow"><em><strong>"One Battle After Another" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="horizon-an-american-saga-chapter-1-2024">‘Horizon: An American Saga - Chapter 1' (2024)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YYsReoZMj1k" allowfullscreen></iframe></div></div><p>Kevin Costner’s “Horizon: An American Saga” was a hugely ambitious Western series. Planned to comprise four movies, with the first two shot back-to-back, the franchise hit a snag almost immediately when “Chapter 1” underperformed at the box office, and its sequel was indefinitely delayed. Two years later, it seems like “Horizon” might end up being a one-and-done, but in some ways, that only adds to the mystique of this Western.</p><p>Clocking in at a butt-numbing 181-minute runtime, “Horizon: An American Saga” is no quick watch, but it’s clearly Costner’s baby. Not only did he write, direct and star in this movie, but he also contributed some of his personal fortune to fund the feature. “Horizon: An American Saga” is set in the 19th century, with a sprawling story that follows multiple families as they seek prosperity in the Old West and grapple with the American Civil War. It stars Costner, Sienna Miller, Sam Worthington, Giovanni Ribisi and Jena Malone. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0D237G9QK/" target="_blank" rel="nofollow"><em><strong>"Horizon: An American Saga - Chapter 1" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="aquaman-and-the-lost-kingdom-2023">‘Aquaman and the Lost Kingdom’ (2023)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/UGc5Tzz19UY" allowfullscreen></iframe></div></div><p>The DC Extended Universe concluded with “Aquaman and the Lost Kingdom” in 2023. The franchise that gave us “Batman v Superman” and the terrible “Justice League” movie isn’t exactly missed, and its successor, the James Gunn-helmed DCU, has already surpassed it with just a single entry, last year’s “Superman.” However, the two “Aquaman” movies rank among the more popular DCEU efforts, offering fantastical, underwater adventures and a likeable turn from Jason Momoa. </p><p>Four years after the first “Aquaman," Arthur Curry (Momoa) is now King of Atlantis. But in the shadows, the sinister Black Manta (Yahya Abdul-Mateen II) plots revenge and just might have the power required after uncovering the mythic Black Trident. With little choice, Arthur must form an uneasy alliance with his estranged brother, Orm (Patrick Wilson). There’s certainly a generic quality to this “Aquaman” sequel, but if you keep your expectations in check, it’s possible to enjoy this CGI-fueled superhero adventure.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CPRVTZ5W/" target="_blank" rel="nofollow"><em><strong>"Aquaman and the Lost Kingdom" on Prime Video</strong></em></a><em><strong> now</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-may-2026-what-to-stream-this-month">New on Prime Video in May 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-may-25-31">Prime Video top 10 movies — here’s the 3 worth watching</a></li><li><a href="https://www.tomsguide.com/news/how-to-get-prime-video-for-free">How to get Prime Video for free</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ New on Prime Video in June 2026: Top picks and all the new movies and shows to watch ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We’re now heading into summer, and streaming services like <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> are beginning to roll out their seasonal original content, including the romantic sequel “Your Fault: London” alongside the yearning-filled original series “Every Year After.” For viewers more in the mood for action, the adult animated fantasy “The Legend of Vox Machina” also returns for its fourth season in June. Overall, there’s a strong mix of new movies and returning shows arriving this month.</p><p>Prime Video has just released its complete June 2026 lineup, and I’ve rounded up the standout titles you can already start getting excited about this month, and I’ll keep updating this list as more arrivals are confirmed. There will also likely be a wave of standard library additions landing at the beginning of the month worth keeping an eye on. So, here are my curated picks of everything new coming to Prime Video in June 2026.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYQaAX"></div>                            </div>                            <script src="https://kwizly.com/embed/XYQaAX.js" async></script><h3 class="article-body__section" id="section-new-on-prime-video-in-june-2026-top-picks"><span>New on Prime Video in June 2026: Top picks</span></h3><h2 id="the-legend-of-vox-machina-season-4-june-3">‘The Legend of Vox Machina’ season 4 (June 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/FkqIXFztj6Q" allowfullscreen></iframe></div></div><p>Prime Video has become known for adult animated series that don’t shy away from gore, and “The Legend of Vox Machina” fits right into that space. At its core, the show follows a dysfunctional group of adventurers who must rely on one another to survive. While it leans into classic high-fantasy elements like dragons, magic, and monsters, it also puts strong emphasis on the relationships between its characters. Season 4 will bring the group back together once again to face a new threat.</p><p>“The Legend of Vox Machina” season 4 picks up after the defeat of the Chroma Conclave, with the party no longer traveling together. Scanlan (Sam Riegel) has stepped away from the group to spend time with his daughter, while Vex (Laura Bailey) and Percy (Taliesin Jaffe) settle back into Whitestone, Vax (Liam O’Brien) continues travelling with Keyleth (Marisha Ray), and Pike (Ashley Johnson) remains alongside Grog (Travis Willingham). However, their separation doesn’t last, because a long-dormant threat begins to rise.</p><p><em><strong>Stream "The Legend of Vox Machina" season 4 on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GWM48XPB/" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 3</strong></em></p><h2 id="clarkson-s-farm-season-5-june-3">‘Clarkson’s Farm’ season 5 (June 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/GJxPc3B2osU" allowfullscreen></iframe></div></div><p>“Clarkson’s Farm” is a popular documentary reality series that follows television presenter Jeremy Clarkson as he attempts to manage a 1,000-acre farm in the English countryside. While it documents real agricultural processes, it is framed through Clarkson’s characteristic humor and his fish-out-of-water experience in farming life. Plus, the series is often praised by the agricultural community for drawing national attention to the real difficulties, tight profit margins, and physical demands of farming in the U.K.</p><p>Season 5 continues to follow Jeremy Clarkson as he manages Diddly Squat Farm amid a turbulent year for British agriculture. A new government budget causes widespread disruption across the farming industry, forcing Clarkson to rethink how the farm operates. In response, he attempts to modernize parts of the business, introducing more high-tech approaches while still dealing with daily practical challenges on the land.  </p><p><em><strong>Stream "Clarkson's Farm" season 5 on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H1F6SPGZ/" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 3</strong></em></p><h2 id="every-year-after-june-10">‘Every Year After’ (June 10)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/F5SpqQ8dNa8" allowfullscreen></iframe></div></div><p>Prime Video is <em>also </em>known for its penchant for emotional romantic dramas that feel tailor-made for summer viewing. The upcoming series “Every Year After” looks set to continue that trend, with longing playing a central role in its storytelling. Spanning several years, the story follows the characters’ relationship from their formative teenage summers into adulthood, naturally capturing the bittersweet experience of first love and what follows. Not to mention, it’s set in a beautiful Canadian lake town, so at least it’ll have the views.</p><p>Percy Fraser (Sadie Soverall) spends her summers in the lakeside town of Barry’s Bay, where she forms a close bond with brothers Sam (Matt Cornett) and Charlie Florek (Michael Bradway). Over time, her relationship with Sam deepens, but an unexpected fallout causes a painful separation between them. Years later, Percy returns to Barry’s Bay for a funeral, where she is forced to face Sam again and confront the unresolved history between them. </p><p><em><strong>Stream "Every Year After" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXTM8G3W/" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 10</strong></em></p><h2 id="your-fault-london-june-17">‘Your Fault: London’ (June 17)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/A3ZbjkDxYUs" allowfullscreen></iframe></div></div><p>Speaking of romantic dramas, we also have the sequel “Your Fault: London,” the second instalment in the British take on Mercedes Ron’s best-selling Culpables trilogy. While the story was previously brought to the screen in a successful Spanish-language film series, this version reimagines it with a new cast and a London setting. Like its predecessor, it leans into a glossy, high-production style, with plenty of tension and complicated relationships at its core. If you like the forbidden love trope, you'll enjoy this movie.</p><p>Noah (Asha Banks) and Nick (Matthew Broome) find themselves trying to maintain their relationship as their lives begin to pull them in different directions. Noah moves to Oxford to continue her studies, where she meets Michael (Joel Nankervis), a fellow student who quickly becomes a close presence in her new life. Meanwhile, Nick gets absorbed in responsibilities within his family’s business, where he crosses paths with Sophia (Louisa Binder), an ambitious new colleague. However, these new connections quickly complicate their situation.</p><p><em><strong>Stream "Your Fault: London" on </strong></em><a href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 17</strong></em></p><h2 id="see-you-at-work-tomorrow-june-22">‘See You at Work Tomorrow’ (June 22)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yQDqyKaBudWzcUKH7Cfv5C" name="See You at Work Tomorrow" alt="Seo In-guk as Kang Si-woo in "See You at Work Tomorrow" coming soon to Prime Video" src="https://cdn.mos.cms.futurecdn.net/yQDqyKaBudWzcUKH7Cfv5C.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon MGM Studios)</span></figcaption></figure><p>Lastly, there’s the Korean romantic drama “See You at Work Tomorrow,” a live-action adaptation of a popular Kakao Webtoon. The series is described as a “slow-burn romance” that pairs the dry, cynical humor of office life with more emotional moments. It also follows burnout, professional exhaustion, and the small, gradual ways people begin to heal and connect. Although there’s no trailer yet, it already sounds like an easy, engaging watch to get invested in this month.</p><p>Cha Ji-yoon (Shin Min-a), a seven-year office worker experiencing professional stagnation, finds her routine is thrown off when she is reassigned to work under Kang Si-woo (Lee Jong-suk), a strict and emotionally distant department manager known for his rigid personality and reputation within the company. Over time, their professional boundaries begin to fade as their working relationship becomes increasingly complex due to shared challenges and growing familiarity within the workplace.</p><p><em><strong>Stream "See You at Work Tomorrow" on </strong></em><a href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 22</strong></em></p><h3 class="article-body__section" id="section-new-shows-on-prime-video-in-june-2026"><span>New shows on Prime Video in June 2026</span></h3><p><strong>June 3</strong></p><ul><li>The Legend of Vox Machina S4 (2026)</li><li>Clarkson's Farm season 5</li></ul><p><strong>June 10</strong></p><ul><li>Every Year After (2026)</li></ul><p><strong>June 22</strong></p><ul><li>See You at Work Tomorrow! (2026)</li><li>ACES: The ATP No. 1 Club (2026)</li></ul><p><strong>June 26</strong></p><ul><li>NWSL on Prime (2026)</li></ul><h3 class="article-body__section" id="section-new-movies-on-prime-video-in-june-2026"><span>New movies on Prime Video in June 2026</span></h3><p><strong>June 1</strong></p><ul><li>12 Angry Men (1957)</li><li>A Bridge Too Far (1977)</li><li>A Cinderella Story (2004)</li><li>A Man Called Otto (2023)</li><li>A Walk Among The Tombstones (2014)</li><li>Adventures Of Rocky And Bullwinkle (2000)</li><li>Barb Wire (1996)</li><li>Beethoven (1992)</li><li>Ben-Hur (2016)</li><li>Bill & Ted Face The Music (2020)</li><li>Bill & Ted's Bogus Journey (1991)</li><li>Bill & Ted's Excellent Adventure (1989)</li><li>Birds Like Us (2022)</li><li>Bloodsport (1988)</li><li>Blown Away (1994)</li><li>Brewster's Millions (1985)</li><li>Bring It On (2000)</li><li>Bull Durham (1988)</li><li>Career Opportunities (1991)</li><li>Crooklyn (1994)</li><li>Cyrano (2022)</li><li>Deliver Us From Eva (2003)</li><li>Doom: Annihilation (2019)</li><li>Double Impact (1991)</li><li>Dragonfly (2002)</li><li>End Of Watch (2012)</li><li>Escape Room (2019)</li><li>Four Weddings And A Funeral (2019)</li><li>Guns Akimbo (2020)</li><li>Hackers (1995)</li><li>Heartbreakers (2001)</li><li>Hellfighters (1968)</li><li>Hoosiers (1987)</li><li>How It Ends (2021)</li><li>Invasion Of The Body Snatchers (1956)</li><li>Larry Crowne (2011)</li><li>Legally Blonde (2001)</li><li>Legally Blonde 2: Red, White And Blonde (2003)</li><li>Lyle, Lyle, Crocodile (2022)</li><li>Mad Max (1980)</li><li>Mallrats (1995)</li><li>Masters of the Universe (1987)</li><li>Midnight Cowboy (1969)</li><li>Milk (2009)</li><li>Mississippi Burning (1988)</li><li>Out Of Time (2003)</li><li>Paths Of Glory (1957)</li><li>Platoon (1987)</li><li>Public Enemies (2009)</li><li>Red River (1948)</li><li>Rob Roy (1995)</li><li>Stargate (1994)</li><li>Stargate Origins: Catherine (2018)</li><li>The Apartment (1960)</li><li>The Big Country (1958)</li><li>The Birdcage (1996)</li><li>The Borrowers (1997)</li><li>The Debt (2011)</li><li>The Emoji Movie (2017)</li><li>The Jackal (1997)</li><li>The Man In The Iron Mask (1998)</li><li>The Night Of The Hunter (1955)</li><li>The Notebook (2004)</li><li>The Protege (2021)</li><li>The Secret Of My Success (1987)</li><li>Thoroughbreds (2018)</li><li>Trolls (2016)</li><li>West Side Story (1961)</li><li>Whitney Houston: I Wanna Dance With Somebody (2022)</li><li>Wimbledon (2004)</li><li>Xanadu (1980)</li></ul><p><strong>June 3</strong></p><ul><li>The Nut Job (2014)</li></ul><p><strong>June 5</strong></p><ul><li>Asterix: The Mansions Of The Gods (2017)</li><li>Asterix: The Secret Of The Magic Potion (2018)</li><li>Boonie Bears Guardian Code (2025)</li><li>Hitpig! (2024)</li><li>The Blackening (2023)</li><li>The Pout-Pout Fish (2026)</li><li>Wow: Message From Outer Space (2025)</li></ul><p><strong>June 6</strong></p><ul><li>Beetlejuice Beetlejuice (2024)</li></ul><p><strong>June 11</strong></p><ul><li>Are You There God? It's Me Margaret (2023)</li></ul><p><strong>June 12</strong></p><ul><li>Plane (2023)</li></ul><p><strong>June 16</strong></p><ul><li>Race (2016)</li></ul><p><strong>June 17</strong></p><ul><li>Your Fault: London (2026)</li></ul><p><strong>June 19</strong></p><ul><li>The Spongebob Movie: Search For Squarepants (2025)</li></ul><p><strong>June 23</strong></p><ul><li>Priscilla (2023)</li></ul><h3 class="article-body__section" id="section-live-sports"><span>Live sports</span></h3><p><strong>Yankees</strong></p><ul><li><strong>Wednesday, June 3</strong> – Cleveland Guardians at New York Yankees – 7:05 p.m.</li><li><strong>Tuesday, June 9</strong> – New York Yankees at Cleveland Guardians – 6:40 p.m.</li><li><strong>Wednesday, June 17</strong> – Chicago White Sox at New York Yankees – 7:05 p.m.</li><li><strong>Wednesday, June 24</strong> – New York Yankees at Detroit Tigers – 6:40 p.m.</li><li><strong>Tuesday, June 30 </strong>– Detroit Tigers at New York Yankees – 7:05 p.m.</li></ul><p><strong>WNBA</strong></p><ul><li><strong>Thursday, June 4</strong>: Atlanta Dream at Indiana Fever – 7 p.m. ET</li><li><strong>Thursday, June 4</strong>: Golden State Valkyries at Minnesota Lynx – 9 p.m. ET</li><li><strong>Thursday, June 11</strong>: Chicago Sky at Indiana Fever – 7 p.m. ET</li><li><strong>Thursday, June 11</strong>: Phoenix Mercury at Dallas Wings – 9 p.m. ET</li><li><strong>Thursday, June 18</strong>: Atlanta Dream at Indiana Fever – 7:30 p.m. ET</li><li><strong>Thursday, June 25</strong>: Los Angeles Sparks at Toronto Tempo – 7 p.m. ET</li><li><strong>Tuesday, June 30</strong>: WNBA Commissioner’s Cup Championship Presented by Coinbase</li></ul><p><strong>NASCAR</strong></p><ul><li><strong>Sunday, June 7, 2 p.m.</strong> – Firekeepers Casino 400 at Michigan International Speedway</li><li><strong>Sunday, June 14, 2 p.m.</strong> – NASCAR Cup Series Race at Pocono Raceway</li><li><strong>Sunday, June 21, 2:30 p.m.</strong> – Anduril 250 at Naval Base Coronado</li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OKJlmW"></div>                            </div>                            <script src="https://kwizly.com/embed/OKJlmW.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/prime-video/3-feel-good-movies-on-prime-video-you-probably-havent-seen-including-one-with-99-percent-on-rotten-tomatoes">3 feel-good movies on Prime Video you (probably) haven't seen</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 great Prime Video movies for free right now</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-netflix-movies-in-may-you-probably-havent-watched-yet">3 best Netflix movies in May you (probably) haven’t watched yet</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" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-june-2026-top-movies-and-shows-to-stream-this-month</link>
                                                                            <description>
                            <![CDATA[ Our guide to the best new movies and shows you can stream on Prime Video in June 2026, including "The Legend of Vox Machina" season 4, “Every Year After” and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">d8VdLrRoiH2w66wE69qVJS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aopDUSMe9h39PECb6wuxZF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 28 May 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Thu, 28 May 2026 13:23:51 +0000</updated>
                                                                                                                                            <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ alix.blackburn@futurenet.com (Alix Blackburn) ]]></author>                    <dc:creator><![CDATA[ Alix Blackburn ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8UxyT2McanNFLYwQ6wC7di.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/aopDUSMe9h39PECb6wuxZF-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo]]></media:description>                                                            <media:text><![CDATA[Prime Video logo]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aopDUSMe9h39PECb6wuxZF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We’re now heading into summer, and streaming services like <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> are beginning to roll out their seasonal original content, including the romantic sequel “Your Fault: London” alongside the yearning-filled original series “Every Year After.” For viewers more in the mood for action, the adult animated fantasy “The Legend of Vox Machina” also returns for its fourth season in June. Overall, there’s a strong mix of new movies and returning shows arriving this month.</p><p>Prime Video has just released its complete June 2026 lineup, and I’ve rounded up the standout titles you can already start getting excited about this month, and I’ll keep updating this list as more arrivals are confirmed. There will also likely be a wave of standard library additions landing at the beginning of the month worth keeping an eye on. So, here are my curated picks of everything new coming to Prime Video in June 2026.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYQaAX"></div>                            </div>                            <script src="https://kwizly.com/embed/XYQaAX.js" async></script><h3 class="article-body__section" id="section-new-on-prime-video-in-june-2026-top-picks"><span>New on Prime Video in June 2026: Top picks</span></h3><h2 id="the-legend-of-vox-machina-season-4-june-3">‘The Legend of Vox Machina’ season 4 (June 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/FkqIXFztj6Q" allowfullscreen></iframe></div></div><p>Prime Video has become known for adult animated series that don’t shy away from gore, and “The Legend of Vox Machina” fits right into that space. At its core, the show follows a dysfunctional group of adventurers who must rely on one another to survive. While it leans into classic high-fantasy elements like dragons, magic, and monsters, it also puts strong emphasis on the relationships between its characters. Season 4 will bring the group back together once again to face a new threat.</p><p>“The Legend of Vox Machina” season 4 picks up after the defeat of the Chroma Conclave, with the party no longer traveling together. Scanlan (Sam Riegel) has stepped away from the group to spend time with his daughter, while Vex (Laura Bailey) and Percy (Taliesin Jaffe) settle back into Whitestone, Vax (Liam O’Brien) continues travelling with Keyleth (Marisha Ray), and Pike (Ashley Johnson) remains alongside Grog (Travis Willingham). However, their separation doesn’t last, because a long-dormant threat begins to rise.</p><p><em><strong>Stream "The Legend of Vox Machina" season 4 on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GWM48XPB/" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 3</strong></em></p><h2 id="clarkson-s-farm-season-5-june-3">‘Clarkson’s Farm’ season 5 (June 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/GJxPc3B2osU" allowfullscreen></iframe></div></div><p>“Clarkson’s Farm” is a popular documentary reality series that follows television presenter Jeremy Clarkson as he attempts to manage a 1,000-acre farm in the English countryside. While it documents real agricultural processes, it is framed through Clarkson’s characteristic humor and his fish-out-of-water experience in farming life. Plus, the series is often praised by the agricultural community for drawing national attention to the real difficulties, tight profit margins, and physical demands of farming in the U.K.</p><p>Season 5 continues to follow Jeremy Clarkson as he manages Diddly Squat Farm amid a turbulent year for British agriculture. A new government budget causes widespread disruption across the farming industry, forcing Clarkson to rethink how the farm operates. In response, he attempts to modernize parts of the business, introducing more high-tech approaches while still dealing with daily practical challenges on the land.  </p><p><em><strong>Stream "Clarkson's Farm" season 5 on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H1F6SPGZ/" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 3</strong></em></p><h2 id="every-year-after-june-10">‘Every Year After’ (June 10)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/F5SpqQ8dNa8" allowfullscreen></iframe></div></div><p>Prime Video is <em>also </em>known for its penchant for emotional romantic dramas that feel tailor-made for summer viewing. The upcoming series “Every Year After” looks set to continue that trend, with longing playing a central role in its storytelling. Spanning several years, the story follows the characters’ relationship from their formative teenage summers into adulthood, naturally capturing the bittersweet experience of first love and what follows. Not to mention, it’s set in a beautiful Canadian lake town, so at least it’ll have the views.</p><p>Percy Fraser (Sadie Soverall) spends her summers in the lakeside town of Barry’s Bay, where she forms a close bond with brothers Sam (Matt Cornett) and Charlie Florek (Michael Bradway). Over time, her relationship with Sam deepens, but an unexpected fallout causes a painful separation between them. Years later, Percy returns to Barry’s Bay for a funeral, where she is forced to face Sam again and confront the unresolved history between them. </p><p><em><strong>Stream "Every Year After" on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXTM8G3W/" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 10</strong></em></p><h2 id="your-fault-london-june-17">‘Your Fault: London’ (June 17)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/A3ZbjkDxYUs" allowfullscreen></iframe></div></div><p>Speaking of romantic dramas, we also have the sequel “Your Fault: London,” the second instalment in the British take on Mercedes Ron’s best-selling Culpables trilogy. While the story was previously brought to the screen in a successful Spanish-language film series, this version reimagines it with a new cast and a London setting. Like its predecessor, it leans into a glossy, high-production style, with plenty of tension and complicated relationships at its core. If you like the forbidden love trope, you'll enjoy this movie.</p><p>Noah (Asha Banks) and Nick (Matthew Broome) find themselves trying to maintain their relationship as their lives begin to pull them in different directions. Noah moves to Oxford to continue her studies, where she meets Michael (Joel Nankervis), a fellow student who quickly becomes a close presence in her new life. Meanwhile, Nick gets absorbed in responsibilities within his family’s business, where he crosses paths with Sophia (Louisa Binder), an ambitious new colleague. However, these new connections quickly complicate their situation.</p><p><em><strong>Stream "Your Fault: London" on </strong></em><a href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 17</strong></em></p><h2 id="see-you-at-work-tomorrow-june-22">‘See You at Work Tomorrow’ (June 22)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yQDqyKaBudWzcUKH7Cfv5C" name="See You at Work Tomorrow" alt="Seo In-guk as Kang Si-woo in "See You at Work Tomorrow" coming soon to Prime Video" src="https://cdn.mos.cms.futurecdn.net/yQDqyKaBudWzcUKH7Cfv5C.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon MGM Studios)</span></figcaption></figure><p>Lastly, there’s the Korean romantic drama “See You at Work Tomorrow,” a live-action adaptation of a popular Kakao Webtoon. The series is described as a “slow-burn romance” that pairs the dry, cynical humor of office life with more emotional moments. It also follows burnout, professional exhaustion, and the small, gradual ways people begin to heal and connect. Although there’s no trailer yet, it already sounds like an easy, engaging watch to get invested in this month.</p><p>Cha Ji-yoon (Shin Min-a), a seven-year office worker experiencing professional stagnation, finds her routine is thrown off when she is reassigned to work under Kang Si-woo (Lee Jong-suk), a strict and emotionally distant department manager known for his rigid personality and reputation within the company. Over time, their professional boundaries begin to fade as their working relationship becomes increasingly complex due to shared challenges and growing familiarity within the workplace.</p><p><em><strong>Stream "See You at Work Tomorrow" on </strong></em><a href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from June 22</strong></em></p><h3 class="article-body__section" id="section-new-shows-on-prime-video-in-june-2026"><span>New shows on Prime Video in June 2026</span></h3><p><strong>June 3</strong></p><ul><li>The Legend of Vox Machina S4 (2026)</li><li>Clarkson's Farm season 5</li></ul><p><strong>June 10</strong></p><ul><li>Every Year After (2026)</li></ul><p><strong>June 22</strong></p><ul><li>See You at Work Tomorrow! (2026)</li><li>ACES: The ATP No. 1 Club (2026)</li></ul><p><strong>June 26</strong></p><ul><li>NWSL on Prime (2026)</li></ul><h3 class="article-body__section" id="section-new-movies-on-prime-video-in-june-2026"><span>New movies on Prime Video in June 2026</span></h3><p><strong>June 1</strong></p><ul><li>12 Angry Men (1957)</li><li>A Bridge Too Far (1977)</li><li>A Cinderella Story (2004)</li><li>A Man Called Otto (2023)</li><li>A Walk Among The Tombstones (2014)</li><li>Adventures Of Rocky And Bullwinkle (2000)</li><li>Barb Wire (1996)</li><li>Beethoven (1992)</li><li>Ben-Hur (2016)</li><li>Bill & Ted Face The Music (2020)</li><li>Bill & Ted's Bogus Journey (1991)</li><li>Bill & Ted's Excellent Adventure (1989)</li><li>Birds Like Us (2022)</li><li>Bloodsport (1988)</li><li>Blown Away (1994)</li><li>Brewster's Millions (1985)</li><li>Bring It On (2000)</li><li>Bull Durham (1988)</li><li>Career Opportunities (1991)</li><li>Crooklyn (1994)</li><li>Cyrano (2022)</li><li>Deliver Us From Eva (2003)</li><li>Doom: Annihilation (2019)</li><li>Double Impact (1991)</li><li>Dragonfly (2002)</li><li>End Of Watch (2012)</li><li>Escape Room (2019)</li><li>Four Weddings And A Funeral (2019)</li><li>Guns Akimbo (2020)</li><li>Hackers (1995)</li><li>Heartbreakers (2001)</li><li>Hellfighters (1968)</li><li>Hoosiers (1987)</li><li>How It Ends (2021)</li><li>Invasion Of The Body Snatchers (1956)</li><li>Larry Crowne (2011)</li><li>Legally Blonde (2001)</li><li>Legally Blonde 2: Red, White And Blonde (2003)</li><li>Lyle, Lyle, Crocodile (2022)</li><li>Mad Max (1980)</li><li>Mallrats (1995)</li><li>Masters of the Universe (1987)</li><li>Midnight Cowboy (1969)</li><li>Milk (2009)</li><li>Mississippi Burning (1988)</li><li>Out Of Time (2003)</li><li>Paths Of Glory (1957)</li><li>Platoon (1987)</li><li>Public Enemies (2009)</li><li>Red River (1948)</li><li>Rob Roy (1995)</li><li>Stargate (1994)</li><li>Stargate Origins: Catherine (2018)</li><li>The Apartment (1960)</li><li>The Big Country (1958)</li><li>The Birdcage (1996)</li><li>The Borrowers (1997)</li><li>The Debt (2011)</li><li>The Emoji Movie (2017)</li><li>The Jackal (1997)</li><li>The Man In The Iron Mask (1998)</li><li>The Night Of The Hunter (1955)</li><li>The Notebook (2004)</li><li>The Protege (2021)</li><li>The Secret Of My Success (1987)</li><li>Thoroughbreds (2018)</li><li>Trolls (2016)</li><li>West Side Story (1961)</li><li>Whitney Houston: I Wanna Dance With Somebody (2022)</li><li>Wimbledon (2004)</li><li>Xanadu (1980)</li></ul><p><strong>June 3</strong></p><ul><li>The Nut Job (2014)</li></ul><p><strong>June 5</strong></p><ul><li>Asterix: The Mansions Of The Gods (2017)</li><li>Asterix: The Secret Of The Magic Potion (2018)</li><li>Boonie Bears Guardian Code (2025)</li><li>Hitpig! (2024)</li><li>The Blackening (2023)</li><li>The Pout-Pout Fish (2026)</li><li>Wow: Message From Outer Space (2025)</li></ul><p><strong>June 6</strong></p><ul><li>Beetlejuice Beetlejuice (2024)</li></ul><p><strong>June 11</strong></p><ul><li>Are You There God? It's Me Margaret (2023)</li></ul><p><strong>June 12</strong></p><ul><li>Plane (2023)</li></ul><p><strong>June 16</strong></p><ul><li>Race (2016)</li></ul><p><strong>June 17</strong></p><ul><li>Your Fault: London (2026)</li></ul><p><strong>June 19</strong></p><ul><li>The Spongebob Movie: Search For Squarepants (2025)</li></ul><p><strong>June 23</strong></p><ul><li>Priscilla (2023)</li></ul><h3 class="article-body__section" id="section-live-sports"><span>Live sports</span></h3><p><strong>Yankees</strong></p><ul><li><strong>Wednesday, June 3</strong> – Cleveland Guardians at New York Yankees – 7:05 p.m.</li><li><strong>Tuesday, June 9</strong> – New York Yankees at Cleveland Guardians – 6:40 p.m.</li><li><strong>Wednesday, June 17</strong> – Chicago White Sox at New York Yankees – 7:05 p.m.</li><li><strong>Wednesday, June 24</strong> – New York Yankees at Detroit Tigers – 6:40 p.m.</li><li><strong>Tuesday, June 30 </strong>– Detroit Tigers at New York Yankees – 7:05 p.m.</li></ul><p><strong>WNBA</strong></p><ul><li><strong>Thursday, June 4</strong>: Atlanta Dream at Indiana Fever – 7 p.m. ET</li><li><strong>Thursday, June 4</strong>: Golden State Valkyries at Minnesota Lynx – 9 p.m. ET</li><li><strong>Thursday, June 11</strong>: Chicago Sky at Indiana Fever – 7 p.m. ET</li><li><strong>Thursday, June 11</strong>: Phoenix Mercury at Dallas Wings – 9 p.m. ET</li><li><strong>Thursday, June 18</strong>: Atlanta Dream at Indiana Fever – 7:30 p.m. ET</li><li><strong>Thursday, June 25</strong>: Los Angeles Sparks at Toronto Tempo – 7 p.m. ET</li><li><strong>Tuesday, June 30</strong>: WNBA Commissioner’s Cup Championship Presented by Coinbase</li></ul><p><strong>NASCAR</strong></p><ul><li><strong>Sunday, June 7, 2 p.m.</strong> – Firekeepers Casino 400 at Michigan International Speedway</li><li><strong>Sunday, June 14, 2 p.m.</strong> – NASCAR Cup Series Race at Pocono Raceway</li><li><strong>Sunday, June 21, 2:30 p.m.</strong> – Anduril 250 at Naval Base Coronado</li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OKJlmW"></div>                            </div>                            <script src="https://kwizly.com/embed/OKJlmW.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/prime-video/3-feel-good-movies-on-prime-video-you-probably-havent-seen-including-one-with-99-percent-on-rotten-tomatoes">3 feel-good movies on Prime Video you (probably) haven't seen</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/no-prime-membership-required-stream-these-5-great-movies-for-free-right-now">Stream these 5 great Prime Video movies for free right now</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-netflix-movies-in-may-you-probably-havent-watched-yet">3 best Netflix movies in May you (probably) haven’t watched yet</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" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 new to Prime Video thriller movies to watch this week — one of them is a wild action-comedy starring ‘Harry Potter’ (May 26-June 1) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Every week, I comb through the latest additions to Prime Video to pick out the newest thriller movies on the Amazon-owned streaming service. The genre is one of the most popular with subscribers, and as I’m a huge thriller fan myself, I’m always happy to highlight the new arrivals.</p><p>The week ahead looks solid for new thrillers on Prime Video. May 2026’s slate is all but over, the start of a new month means a fresh wave of library titles, and in June, that will include several worthwhile thriller options. Including a Liam Neeson neo-noir mystery, and a truly wild action-thriller that sees Daniel Radcliffe play a meek man who awakes with pistols bolted to his hands, and is forced to compete in an online death match. </p><p>If you want to bolster your Prime Video watchlist with some thrillers, then here are three movies to consider over the coming days.</p><h3 class="article-body__section" id="section-best-new-to-prime-video-thriller-movies-this-week"><span>Best new to Prime Video thriller movies this week</span></h3><h2 id="one-battle-after-another-2025-2">‘One Battle After Another’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/feOQFKv2Lw4" allowfullscreen></iframe></div></div><p>“One Battle After Another” is a movie you can’t ignore. It was this year’s awards season darling, scooping wins at every major show, including the coveted Best Picture at the 2026 Oscars. Sometimes, award winners can be divisive, but Paul Thomas Anderson’s action-thriller epic was not only a critical hit but a real crowd-pleaser as well. It couples masterful filmmaking with pure entertainment and career-best performances from its cast.</p><p>In “One Battle After Another,” Leonardo DiCaprio plays Bob Ferguson, a former revolutionary, now in hiding with his precocious daughter, Willa (Chase Infiniti). Living off the grid and deeply paranoid, Bob’s worst fear comes true when Willa goes missing, and his past deeds catch up with him. Scrambling to locate his daughter, he must also contend with a vengeful adversary, Colonel Lockjaw (Sean Penn). The movie also packs excellent turns from Benicio del Toro and Regina Hall. It’s funny, it’s thrilling, and it’s undoubtedly a must-watch. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FR5XYWH2/" target="_blank" rel="nofollow"><em><strong>"One Battle After Another" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="a-walk-among-the-tombstones-2014-3">‘A Walk Among the Tombstones’ (2014)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aTKBowDjMQg" allowfullscreen></iframe></div></div><p>Few actors in the 21st century have been as committed to the thriller genre as Liam Neeson. The Northern Irish actor has starred in more than a dozen action-thriller films, including 2014’s “A Walk Among the Tombstones.” Based on the novel by Lawrence Block, this one ranks among Neeson’s strongest efforts, giving the actor a meaty character to dig into, and its neo-noir sense of style helps it stand apart from his more cookie-cutter genre efforts.</p><p>Matt Scudder (Neeson) is a retired NYPD detective, now working as a private investigator, and attending Alcoholics Anonymous meetings to help battle his demons. When he’s approached by a wealthy drug dealer (Dan Stevens), he’s hired for a twisting case. The dealer’s wife was kidnapped, and despite the requested ransom being paid, she was still brutally murdered. He wants her killers found and brought to justice. As Scudder investigates the killing, he sinks into New York’s criminal underworld and also encounters Ray (David Harbour), a sadistic criminal.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B00QHMEGXC/" target="_blank" rel="nofollow"><em><strong>"A Walk Among the Tombstones" on Prime Video</strong></em></a><em><strong> from June 1</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eM76lO"></div>                            </div>                            <script src="https://kwizly.com/embed/eM76lO.js" async></script><h2 id="guns-akimbo-2020-2">‘Guns Akimbo’ (2020)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ZOFatKD0Vzo" allowfullscreen></iframe></div></div><p>Post “Harry Potter,” Daniel Radcliffe has had quite a fascinating career. Instead of leaping into another blockbuster franchise, he’s experimented with all sorts of quirky and oddball projects. These include “Guns Akimbo,” a gloriously silly and completely over-the-top action-thriller with a dark comedic streak. Its brash tone might not connect with everybody, but if you’re on board with its juvenile humor, there’s much to enjoy in this truly bonkers flick. </p><p>Set in a world where an online death match has become popular entertainment. Miles Lee Harris (Radcliffe) is an outspoken computer programmer who blasts viewers for taking pleasure in watching people fight to the death. This results in him awaking with two pistols bolted to his hands, and if that wasn’t bad enough, he’s forced to participate in the live-streamed fight club. His odds of survival appear particularly remote when it’s revealed that his opponent is one of the game’s top killers, Nix (Samara Weaving).  </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G5FRG4JS/" target="_blank" rel="nofollow"><em><strong>"Guns Akimbo" on Prime Video</strong></em></a><em><strong> from June 1</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-may-2026-what-to-stream-this-month">New on Prime Video in May 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-may-25-31">Prime Video top 10 movies — here’s the 3 worth watching</a></li><li><a href="https://www.tomsguide.com/news/how-to-get-prime-video-for-free">How to get Prime Video for free</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-watch-this-week-one-of-them-is-a-wild-action-comedy-starring-harry-potter-may-26-june-1</link>
                                                                            <description>
                            <![CDATA[ These are the latest Prime Video thriller movies to add to your watchlist, including a Liam Neeson flick, a wild action film with Daniel Radcliffe, and this year's Oscar winner for Best Picture. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4vosSEaVaVWSAZ2Ci7QeZc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 26 May 2026 13:07:55 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo ]]></media:description>                                                            <media:text><![CDATA[Prime Video logo ]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7EZZyGZEXsWAo6kmTF6dAL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Every week, I comb through the latest additions to Prime Video to pick out the newest thriller movies on the Amazon-owned streaming service. The genre is one of the most popular with subscribers, and as I’m a huge thriller fan myself, I’m always happy to highlight the new arrivals.</p><p>The week ahead looks solid for new thrillers on Prime Video. May 2026’s slate is all but over, the start of a new month means a fresh wave of library titles, and in June, that will include several worthwhile thriller options. Including a Liam Neeson neo-noir mystery, and a truly wild action-thriller that sees Daniel Radcliffe play a meek man who awakes with pistols bolted to his hands, and is forced to compete in an online death match. </p><p>If you want to bolster your Prime Video watchlist with some thrillers, then here are three movies to consider over the coming days.</p><h3 class="article-body__section" id="section-best-new-to-prime-video-thriller-movies-this-week"><span>Best new to Prime Video thriller movies this week</span></h3><h2 id="one-battle-after-another-2025-2">‘One Battle After Another’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/feOQFKv2Lw4" allowfullscreen></iframe></div></div><p>“One Battle After Another” is a movie you can’t ignore. It was this year’s awards season darling, scooping wins at every major show, including the coveted Best Picture at the 2026 Oscars. Sometimes, award winners can be divisive, but Paul Thomas Anderson’s action-thriller epic was not only a critical hit but a real crowd-pleaser as well. It couples masterful filmmaking with pure entertainment and career-best performances from its cast.</p><p>In “One Battle After Another,” Leonardo DiCaprio plays Bob Ferguson, a former revolutionary, now in hiding with his precocious daughter, Willa (Chase Infiniti). Living off the grid and deeply paranoid, Bob’s worst fear comes true when Willa goes missing, and his past deeds catch up with him. Scrambling to locate his daughter, he must also contend with a vengeful adversary, Colonel Lockjaw (Sean Penn). The movie also packs excellent turns from Benicio del Toro and Regina Hall. It’s funny, it’s thrilling, and it’s undoubtedly a must-watch. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FR5XYWH2/" target="_blank" rel="nofollow"><em><strong>"One Battle After Another" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="a-walk-among-the-tombstones-2014-3">‘A Walk Among the Tombstones’ (2014)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aTKBowDjMQg" allowfullscreen></iframe></div></div><p>Few actors in the 21st century have been as committed to the thriller genre as Liam Neeson. The Northern Irish actor has starred in more than a dozen action-thriller films, including 2014’s “A Walk Among the Tombstones.” Based on the novel by Lawrence Block, this one ranks among Neeson’s strongest efforts, giving the actor a meaty character to dig into, and its neo-noir sense of style helps it stand apart from his more cookie-cutter genre efforts.</p><p>Matt Scudder (Neeson) is a retired NYPD detective, now working as a private investigator, and attending Alcoholics Anonymous meetings to help battle his demons. When he’s approached by a wealthy drug dealer (Dan Stevens), he’s hired for a twisting case. The dealer’s wife was kidnapped, and despite the requested ransom being paid, she was still brutally murdered. He wants her killers found and brought to justice. As Scudder investigates the killing, he sinks into New York’s criminal underworld and also encounters Ray (David Harbour), a sadistic criminal.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B00QHMEGXC/" target="_blank" rel="nofollow"><em><strong>"A Walk Among the Tombstones" on Prime Video</strong></em></a><em><strong> from June 1</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eM76lO"></div>                            </div>                            <script src="https://kwizly.com/embed/eM76lO.js" async></script><h2 id="guns-akimbo-2020-2">‘Guns Akimbo’ (2020)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ZOFatKD0Vzo" allowfullscreen></iframe></div></div><p>Post “Harry Potter,” Daniel Radcliffe has had quite a fascinating career. Instead of leaping into another blockbuster franchise, he’s experimented with all sorts of quirky and oddball projects. These include “Guns Akimbo,” a gloriously silly and completely over-the-top action-thriller with a dark comedic streak. Its brash tone might not connect with everybody, but if you’re on board with its juvenile humor, there’s much to enjoy in this truly bonkers flick. </p><p>Set in a world where an online death match has become popular entertainment. Miles Lee Harris (Radcliffe) is an outspoken computer programmer who blasts viewers for taking pleasure in watching people fight to the death. This results in him awaking with two pistols bolted to his hands, and if that wasn’t bad enough, he’s forced to participate in the live-streamed fight club. His odds of survival appear particularly remote when it’s revealed that his opponent is one of the game’s top killers, Nix (Samara Weaving).  </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G5FRG4JS/" target="_blank" rel="nofollow"><em><strong>"Guns Akimbo" on Prime Video</strong></em></a><em><strong> from June 1</strong></em></p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-may-2026-what-to-stream-this-month">New on Prime Video in May 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-may-25-31">Prime Video top 10 movies — here’s the 3 worth watching</a></li><li><a href="https://www.tomsguide.com/news/how-to-get-prime-video-for-free">How to get Prime Video for free</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Prime Video top 10 movies — here’s the 3 worth watching this week (May 25-31) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Looking for something to watch on Prime Video this week? Then the top 10 most-watched list makes for a solid starting point. In this always-shifting ranking, you can see the movies that are drawing the most attention from your fellow Prime Video subscribers right now. </p><p>However, if I've learnt one lesson from tracking streaming service top 10 lists every single day, it's that a high ranking is no guarantee of quality. It's not uncommon for skippable films to land on the list. That's why I've combed through today's Prime Video top 10 to pick out three movies that I believe deserve a spot on your watchlist this week.  </p><p>These picks are based on the Prime Video top 10 as of Monday, May 25, 2026. And with that bit of housekeeping out of the way, here's the best of the current Prime Video top 10 movies list.</p><h3 class="article-body__section" id="section-best-prime-video-top-10-movies-to-stream-right-now"><span>Best Prime Video top 10 movies to stream right now</span></h3><h2 id="jack-ryan-ghost-war-2026">‘Jack Ryan: Ghost War’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/-4ZVFspRn3M" allowfullscreen></iframe></div></div><p>It’s no surprise to see “Jack Ryan: Ghost War” sitting atop the Prime Video most-watched list. This feature-length continuation of the popular Prime original action-thriller sees John Krasinski reprising the titular role, playing one of novelist Tom Clancy’s most iconic characters. The movie hasn’t enjoyed a stellar critical reception, but clearly that isn’t stopping fans from checking out Ryan’s latest global-trotting espionage adventure. </p><p>I’ll admit to being a little out of the loop when it comes to Jack Ryan. I've only seen an episode or two of the original show. However, the official plot summary reads, “Jack Ryan reunites with CIA operatives to navigate betrayal from an enemy who knows their moves and faces a past once thought settled.” Which certainly sounds like a Jack Ryan storyline to me. Alongside Krasinski, “Ghost War” stars Sienna Miller, Wendell Pierce and Michael Kelly. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Tom-Clancys-Jack-Ryan-Ghost/dp/B0GVB3C61B" target="_blank" rel="nofollow"><em><strong>"Jack Ryan: Ghost War" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="regretting-you-2025">'Regretting You' (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/qub8lZlVlho" allowfullscreen></iframe></div></div><p>Speaking of movies that weren’t well-received by critics, there’s “Regretting You.” This romantic drama, based on the best-selling Colleen Hoover novel, is a real guilty pleasure of mine. I’m fully aware it’s got some script issues, and it’s almost unbelievably melodramatic, but a likeable cast, including Allison Williams, Mckenna Grace and Dave Franco, was enough to keep me invested. And hey, everybody likes a little melodrama from time to time. </p><p>In “Regretting You,” a mother, Morgan (Williams), and daughter, Clara (Grace), have to navigate shifting family dynamics following a devastating car accident. But the real trauma comes afterwards, when the fallout of the crash reveals a shocking secret. While Clara tackles her deep grief, she is comforted by the local bad boy, Miller (Mason Thames). Meanwhile, Morgan finds solace of her own in "the one that got away", Jonah (Franco). </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/Regretting-You-Josh-Boone/dp/B0GRGPZC5F/" target="_blank" rel="nofollow"><em><strong>"Regretting You" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="one-battle-after-another-2025-3">‘One Battle After Another’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/kQUPdVxZNPk" allowfullscreen></iframe></div></div><p>Paul Thomas Anderson’s all-conquering “One Battle After Another” arrived on Prime Video over the weekend and has already rocketed into the top 10. This Oscar-dominating action-thriller scooped six Academy Awards, including Best Picture, and has been recognised by critics as not just one of the best movies of 2025, but of the entire decade. It’s got everything you could want: ratcheting tension, excellent filmmaking, and clever comedy.  </p><p>Leonardo DiCaprio plays Bob Ferguson, a former revolutionary in hiding with his daughter, Willa (Chase Infiniti). Living off the grid and wrapped in paranoia, Bob’s worst fear comes true when Willa goes missing, and his past deeds catch up with him. Scrambling to locate his daughter, he must also contend with a vengeful adversary, Colonel Lockjaw (Sean Penn). The movie also packs excellent turns from Benicio del Toro and Regina Hall.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FR5XYWH2/" target="_blank" rel="nofollow"><em><strong>"One Battle After Another" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X16d2e"></div>                            </div>                            <script src="https://kwizly.com/embed/X16d2e.js" async></script><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"Jack Ryan: Ghost War" (2026)</li><li>"Despicable Me 4" (2024)</li><li>"Regretting You" (2025)</li><li>"Bang" (2025)</li><li>"Mechanic: Resurrection" (2016)</li><li>"One Battle After Another" (2025)</li><li>"Major Payne" (1995)</li><li>"Battleship" (2012)</li><li>"Long Shot" (2019)</li><li>"The Equalizer" (2014)</li></ol><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/prime-video/new-on-prime-video-in-may-2026-what-to-stream-this-month">New on Prime Video in May 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-must-watch-90-minute-thriller-movies-on-prime-video-and-one-of-them-contains-a-twist-youll-never-see-coming">3 must-watch 90-minute thriller movies to stream on Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-feel-good-movies-on-prime-video-you-probably-havent-seen-including-one-with-99-percent-on-rotten-tomatoes">Feel-good movies on Prime Video you (probably) haven't seen</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/prime-video-top-10-movies-heres-the-3-worth-watching-this-week-may-25-31</link>
                                                                            <description>
                            <![CDATA[ Prime Video's top 10 movies list gives you a snapshot of the most popular films on the platform, and I've picked out the top 3 flicks. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6gYLZyzP3xJGb4f8Ca6CvZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jkNJbHLaY7hb8gngkjaw9B-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 25 May 2026 17:10:37 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.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/jkNJbHLaY7hb8gngkjaw9B-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on yellow blue background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on yellow blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on yellow blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jkNJbHLaY7hb8gngkjaw9B-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Looking for something to watch on Prime Video this week? Then the top 10 most-watched list makes for a solid starting point. In this always-shifting ranking, you can see the movies that are drawing the most attention from your fellow Prime Video subscribers right now. </p><p>However, if I've learnt one lesson from tracking streaming service top 10 lists every single day, it's that a high ranking is no guarantee of quality. It's not uncommon for skippable films to land on the list. That's why I've combed through today's Prime Video top 10 to pick out three movies that I believe deserve a spot on your watchlist this week.  </p><p>These picks are based on the Prime Video top 10 as of Monday, May 25, 2026. And with that bit of housekeeping out of the way, here's the best of the current Prime Video top 10 movies list.</p><h3 class="article-body__section" id="section-best-prime-video-top-10-movies-to-stream-right-now"><span>Best Prime Video top 10 movies to stream right now</span></h3><h2 id="jack-ryan-ghost-war-2026">‘Jack Ryan: Ghost War’ (2026)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/-4ZVFspRn3M" allowfullscreen></iframe></div></div><p>It’s no surprise to see “Jack Ryan: Ghost War” sitting atop the Prime Video most-watched list. This feature-length continuation of the popular Prime original action-thriller sees John Krasinski reprising the titular role, playing one of novelist Tom Clancy’s most iconic characters. The movie hasn’t enjoyed a stellar critical reception, but clearly that isn’t stopping fans from checking out Ryan’s latest global-trotting espionage adventure. </p><p>I’ll admit to being a little out of the loop when it comes to Jack Ryan. I've only seen an episode or two of the original show. However, the official plot summary reads, “Jack Ryan reunites with CIA operatives to navigate betrayal from an enemy who knows their moves and faces a past once thought settled.” Which certainly sounds like a Jack Ryan storyline to me. Alongside Krasinski, “Ghost War” stars Sienna Miller, Wendell Pierce and Michael Kelly. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Tom-Clancys-Jack-Ryan-Ghost/dp/B0GVB3C61B" target="_blank" rel="nofollow"><em><strong>"Jack Ryan: Ghost War" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="regretting-you-2025">'Regretting You' (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/qub8lZlVlho" allowfullscreen></iframe></div></div><p>Speaking of movies that weren’t well-received by critics, there’s “Regretting You.” This romantic drama, based on the best-selling Colleen Hoover novel, is a real guilty pleasure of mine. I’m fully aware it’s got some script issues, and it’s almost unbelievably melodramatic, but a likeable cast, including Allison Williams, Mckenna Grace and Dave Franco, was enough to keep me invested. And hey, everybody likes a little melodrama from time to time. </p><p>In “Regretting You,” a mother, Morgan (Williams), and daughter, Clara (Grace), have to navigate shifting family dynamics following a devastating car accident. But the real trauma comes afterwards, when the fallout of the crash reveals a shocking secret. While Clara tackles her deep grief, she is comforted by the local bad boy, Miller (Mason Thames). Meanwhile, Morgan finds solace of her own in "the one that got away", Jonah (Franco). </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/Regretting-You-Josh-Boone/dp/B0GRGPZC5F/" target="_blank" rel="nofollow"><em><strong>"Regretting You" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="one-battle-after-another-2025-3">‘One Battle After Another’ (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/kQUPdVxZNPk" allowfullscreen></iframe></div></div><p>Paul Thomas Anderson’s all-conquering “One Battle After Another” arrived on Prime Video over the weekend and has already rocketed into the top 10. This Oscar-dominating action-thriller scooped six Academy Awards, including Best Picture, and has been recognised by critics as not just one of the best movies of 2025, but of the entire decade. It’s got everything you could want: ratcheting tension, excellent filmmaking, and clever comedy.  </p><p>Leonardo DiCaprio plays Bob Ferguson, a former revolutionary in hiding with his daughter, Willa (Chase Infiniti). Living off the grid and wrapped in paranoia, Bob’s worst fear comes true when Willa goes missing, and his past deeds catch up with him. Scrambling to locate his daughter, he must also contend with a vengeful adversary, Colonel Lockjaw (Sean Penn). The movie also packs excellent turns from Benicio del Toro and Regina Hall.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FR5XYWH2/" target="_blank" rel="nofollow"><em><strong>"One Battle After Another" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X16d2e"></div>                            </div>                            <script src="https://kwizly.com/embed/X16d2e.js" async></script><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"Jack Ryan: Ghost War" (2026)</li><li>"Despicable Me 4" (2024)</li><li>"Regretting You" (2025)</li><li>"Bang" (2025)</li><li>"Mechanic: Resurrection" (2016)</li><li>"One Battle After Another" (2025)</li><li>"Major Payne" (1995)</li><li>"Battleship" (2012)</li><li>"Long Shot" (2019)</li><li>"The Equalizer" (2014)</li></ol><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/prime-video/new-on-prime-video-in-may-2026-what-to-stream-this-month">New on Prime Video in May 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-must-watch-90-minute-thriller-movies-on-prime-video-and-one-of-them-contains-a-twist-youll-never-see-coming">3 must-watch 90-minute thriller movies to stream on Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-feel-good-movies-on-prime-video-you-probably-havent-seen-including-one-with-99-percent-on-rotten-tomatoes">Feel-good movies on Prime Video you (probably) haven't seen</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best new to Prime Video shows to binge-watch this weekend (May 22-24) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Looking for something new to watch on <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a>? If your weekend plans include little more than settling on the sofa in front of <a href="https://www.tomsguide.com/tag/amazon">Amazon</a>'s <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>, but you don't want to waste any of your downtime finding your next show, I've got your back. </p><p>We've already sorted through all the best <a href="https://www.tomsguide.com/entertainment/streaming/from-dutton-ranch-to-jack-ryan-ghost-war-21-best-new-shows-and-movies-streaming-in-may-2026">new TV shows and movies </a>coming out in May, and below, I've rounded up a handful of recent Prime Video shows that you might want to binge-watch over the next couple of days. </p><p>Admittedly, Prime Video hasn't dropped any major new releases this week (you'll have to wait until next Wednesday for something completely fresh to drop), but we did get the final episode of "The Boys," plus we've thrown in two recently-added shows that you might not have watched just yet. Find out more about all three new to Prime Video TV shows below. </p><h3 class="article-body__section" id="section-best-prime-video-shows-to-binge-watch-this-weekend"><span>Best Prime Video shows to binge-watch this weekend</span></h3><h2 id="it-s-not-like-that">'It's Not Like That' </h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iQi6rtbcT94" allowfullscreen></iframe></div></div><p>Family drama "It's Not Like That" premiered globally on Prime Video last week (after originally airing on the Wonder Project channel back in January). It takes us to Atlanta and introduces us to pastor and widowed father, Malcolm (Scott Foley). He and his three children are still reeling from the loss of his wife (Tyner Rushing) and trying to find their way forward.</p><p>There's hope just across the street: Lori Soto ("Medical Police" star, Erinn Hayes), a recently divorced, long-time family friend and mother of two leans on Malcolm for support. Their faith and friendship help them through their respective challenges... but when their comfort sparks something more, both Malcolm and Lori isn't "it's not like that"... but is it?</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Its-Not-Like-That/dp/B0GW6W5F89/" target="_blank" rel="nofollow"><em><strong>"It's Not Like That" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="off-campus-2">'Off Campus'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wAozjf2frxw" allowfullscreen></iframe></div></div><p>"Heated Rivalry" fans, "<a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-romantic-drama-series-is-a-pleasant-and-steamy-surprise-and-its-made-for-binge-watching">Off Campus</a>" just might be your next binge-watch. This college drama/soap is based on the bestselling books by Elle Kennedy and revolves around the Briar University ice hockey team, their hookups, and relationships.</p><p>Each season will focus on a different couple, and this first one focuses on the "fake dating"/ "opposites attract" relationship between a quiet songwriter, Hannah Wells (Ella Bright), and the team's all-star center player, Garret Graham (Belmont Cameli). Garrett offers up his skills to help Hannah catch her <em>actual </em>crush's attention....</p><p><em><strong>Stream </strong></em><a href="https://www.primevideo.com/detail/0I4OWKAPLUWIO5013W3F3ZN952" target="_blank" rel="nofollow"><em><strong>"Off Campus" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-boys-2">'The Boys'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/XNQbH1SDPRk" allowfullscreen></iframe></div></div><p>"The Boys" came to a close on Wednesday, May 20, so if you've been waiting to binge the season (or indeed the show in full), you can now do exactly that on Prime Video. </p><p>In the fifth season, this irreverent superhero series saw the tyrannical Homelander (Antony Starr) having total control over America, confining his foes to "Freedom Camps." That left Billy Butcher (Karl Urban) and The Boys to try and mount some sort of resistance to his rule, facing down insurmountable odds as they set out to bring his reign to an end for good.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/The-Boys/dp/B0FGFW5FSR/" target="_blank" rel="nofollow"><em><strong>"The Boys" season 5 on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmArBX"></div>                            </div>                            <script src="https://kwizly.com/embed/XmArBX.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/prime-video/5-best-prime-video-movies-to-stream-now-before-they-leave-in-may-2026">5 best Prime Video movies to stream now before they leave in May 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-a-seriously-gripping-mystery-thriller-movie-and-it-takes-place-entirely-through-a-screen">Prime Video just added a seriously gripping screenlife mystery thriller movie </a></li><li><a href="https://www.tomsguide.com/entertainment/movies/james-bond-casting-is-underway-but-who-do-you-think-should-play-the-next-007">James Bond casting is underway — who do you think should play the next 007?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-shows-to-binge-watch-this-weekend-may-22-24</link>
                                                                            <description>
                            <![CDATA[ Planning to binge-watch something new this weekend? Here's our weekly guide to the best new to Prime Video series you should be streaming right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">q9K8BUB4D4nWALVNDUub56</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RvHiYSZStp5ddxKpjxjF7C-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 22 May 2026 13:09:56 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></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/RvHiYSZStp5ddxKpjxjF7C-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock; Prime Video]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a red-orange background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a red-orange background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a red-orange background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RvHiYSZStp5ddxKpjxjF7C-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Looking for something new to watch on <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a>? If your weekend plans include little more than settling on the sofa in front of <a href="https://www.tomsguide.com/tag/amazon">Amazon</a>'s <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a>, but you don't want to waste any of your downtime finding your next show, I've got your back. </p><p>We've already sorted through all the best <a href="https://www.tomsguide.com/entertainment/streaming/from-dutton-ranch-to-jack-ryan-ghost-war-21-best-new-shows-and-movies-streaming-in-may-2026">new TV shows and movies </a>coming out in May, and below, I've rounded up a handful of recent Prime Video shows that you might want to binge-watch over the next couple of days. </p><p>Admittedly, Prime Video hasn't dropped any major new releases this week (you'll have to wait until next Wednesday for something completely fresh to drop), but we did get the final episode of "The Boys," plus we've thrown in two recently-added shows that you might not have watched just yet. Find out more about all three new to Prime Video TV shows below. </p><h3 class="article-body__section" id="section-best-prime-video-shows-to-binge-watch-this-weekend"><span>Best Prime Video shows to binge-watch this weekend</span></h3><h2 id="it-s-not-like-that">'It's Not Like That' </h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iQi6rtbcT94" allowfullscreen></iframe></div></div><p>Family drama "It's Not Like That" premiered globally on Prime Video last week (after originally airing on the Wonder Project channel back in January). It takes us to Atlanta and introduces us to pastor and widowed father, Malcolm (Scott Foley). He and his three children are still reeling from the loss of his wife (Tyner Rushing) and trying to find their way forward.</p><p>There's hope just across the street: Lori Soto ("Medical Police" star, Erinn Hayes), a recently divorced, long-time family friend and mother of two leans on Malcolm for support. Their faith and friendship help them through their respective challenges... but when their comfort sparks something more, both Malcolm and Lori isn't "it's not like that"... but is it?</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/Its-Not-Like-That/dp/B0GW6W5F89/" target="_blank" rel="nofollow"><em><strong>"It's Not Like That" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="off-campus-2">'Off Campus'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wAozjf2frxw" allowfullscreen></iframe></div></div><p>"Heated Rivalry" fans, "<a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-romantic-drama-series-is-a-pleasant-and-steamy-surprise-and-its-made-for-binge-watching">Off Campus</a>" just might be your next binge-watch. This college drama/soap is based on the bestselling books by Elle Kennedy and revolves around the Briar University ice hockey team, their hookups, and relationships.</p><p>Each season will focus on a different couple, and this first one focuses on the "fake dating"/ "opposites attract" relationship between a quiet songwriter, Hannah Wells (Ella Bright), and the team's all-star center player, Garret Graham (Belmont Cameli). Garrett offers up his skills to help Hannah catch her <em>actual </em>crush's attention....</p><p><em><strong>Stream </strong></em><a href="https://www.primevideo.com/detail/0I4OWKAPLUWIO5013W3F3ZN952" target="_blank" rel="nofollow"><em><strong>"Off Campus" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-boys-2">'The Boys'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/XNQbH1SDPRk" allowfullscreen></iframe></div></div><p>"The Boys" came to a close on Wednesday, May 20, so if you've been waiting to binge the season (or indeed the show in full), you can now do exactly that on Prime Video. </p><p>In the fifth season, this irreverent superhero series saw the tyrannical Homelander (Antony Starr) having total control over America, confining his foes to "Freedom Camps." That left Billy Butcher (Karl Urban) and The Boys to try and mount some sort of resistance to his rule, facing down insurmountable odds as they set out to bring his reign to an end for good.</p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/The-Boys/dp/B0FGFW5FSR/" target="_blank" rel="nofollow"><em><strong>"The Boys" season 5 on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmArBX"></div>                            </div>                            <script src="https://kwizly.com/embed/XmArBX.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/prime-video/5-best-prime-video-movies-to-stream-now-before-they-leave-in-may-2026">5 best Prime Video movies to stream now before they leave in May 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-a-seriously-gripping-mystery-thriller-movie-and-it-takes-place-entirely-through-a-screen">Prime Video just added a seriously gripping screenlife mystery thriller movie </a></li><li><a href="https://www.tomsguide.com/entertainment/movies/james-bond-casting-is-underway-but-who-do-you-think-should-play-the-next-007">James Bond casting is underway — who do you think should play the next 007?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon, Argos and Currys are all holding bank holiday sales — 21 deals that are actually worth it ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Amazon, Currys and Argos are all holding sales this bank holiday weekend. There are dozens of deals to sort through, so if you want to save time and just get right to the good stuff, I'm here to give you a hand.</p><p>Temperatures are set to soar this weekend, so you'll need to make sure you're prepared. I highly recommend picking up a cooling device, and the <a href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Lightweight-FA050UKDV/dp/B0F5WXNDDT" target="_blank" rel="nofollow">Shark FlexBreeze HydroGo Cordless Fan is a great choice at £89</a>. We <a href="https://www.tomsguide.com/home/home-appliances/shark-flexbreeze-hydrogo-cooling-fan-review">tested it out last year</a> and called it "the fan of the summer" so it's not a deal you'll want to miss out on.</p><p>If you want to spend the weekend in your garden, <a href="https://www.argos.co.uk/list/shop-savings-on-garden-diy-and-decorating" target="_blank" rel="nofollow">Argos has up to 33% off everything garden, DIY and decorating</a>. And <a href="https://www.currys.co.uk/epic-deals" target="_blank" rel="nofollow">Currys' Epic Deals includes price drops on everything from hot tubs to 4K TVs</a>.</p><p>Keep scrolling to see the deals I think are the most worth it! For more, see our <a href="http://tomsguide.com/coupons/amazon.co.uk">Amazon promo codes</a> page.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.amazon.co.uk/deals" target="_blank" rel="nofollow"><strong>shop all deals at Amazon</strong></a></li><li><strong>Furniture & Decor: </strong><a href="https://www.argos.co.uk/list/shop-all-big-red-furniture-offers" target="_blank" rel="nofollow"><strong>up to 50% off</strong></a></li><li><strong>Garden/DIY: </strong><a href="https://www.argos.co.uk/list/shop-savings-on-garden-diy-and-decorating" target="_blank" rel="nofollow"><strong>up to 33% off</strong></a></li><li><strong>Iniu 10,000 mAh Portable Charger: </strong><a href="https://www.amazon.co.uk/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07PNL5STG" target="_blank" rel="nofollow"><strong>was £18 now £13</strong></a></li><li><strong>Skechers: </strong><a href="https://www.amazon.co.uk/stores/page/29902F1F-31A9-4A30-9217-D43EB75AA71D/" target="_blank" rel="nofollow"><strong>deals from £30</strong></a></li><li><strong>TV sale: </strong><a href="https://www.currys.co.uk/tv-and-audio/televisions/tvs" target="_blank" rel="nofollow"><strong>deals from £99</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-editor-s-choice"><span>Editor's Choice</span></h3><div class="product"><a data-dimension112="f22fdc9a-68e0-4d98-89e2-dc09b25d19cc" data-action="Deal Block" data-label="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension48="Furniture &amp; Decor: up to 50% off @ Argos" href="https://www.argos.co.uk/list/shop-all-big-red-furniture-offers" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1511px;"><p class="vanilla-image-block" style="padding-top:91.46%;"><img id="cSkKWHamLBoi5yNdY59hXC" name="argos home sofa" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cSkKWHamLBoi5yNdY59hXC.jpg" mos="" align="middle" fullscreen="" width="1511" height="1382" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Furniture & Decor: </strong><a href="https://www.argos.co.uk/list/shop-all-big-red-furniture-offers" target="_blank" rel="nofollow" data-dimension112="f22fdc9a-68e0-4d98-89e2-dc09b25d19cc" data-action="Deal Block" data-label="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension48="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension25=""><strong>up to 50% off @ Argos</strong></a><br>Argos is taking up to 50% off furniture in its latest sale. You'll find everything from mattresses to dining sets from big-name brands. Don't forget to use the discount codes <strong>"RED10", "RED20", "RED30" or "RED50" </strong>where applicable.<a class="view-deal button" href="https://www.argos.co.uk/list/shop-all-big-red-furniture-offers" target="_blank" rel="nofollow" data-dimension112="f22fdc9a-68e0-4d98-89e2-dc09b25d19cc" data-action="Deal Block" data-label="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension48="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="fb2e5dd9-dd67-4590-8790-7e0cb9c34b1c" data-action="Deal Block" data-label="BBQ sale: deals from £21 @ Currys" data-dimension48="BBQ sale: deals from £21 @ Currys" href="https://www.currys.co.uk/appliances/small-kitchen-appliances/grills" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="AaUbignfchFJK9yxtAdJd9" name="Weber" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AaUbignfchFJK9yxtAdJd9.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>BBQ sale: </strong><a href="https://www.currys.co.uk/appliances/small-kitchen-appliances/grills" target="_blank" rel="nofollow" data-dimension112="fb2e5dd9-dd67-4590-8790-7e0cb9c34b1c" data-action="Deal Block" data-label="BBQ sale: deals from £21 @ Currys" data-dimension48="BBQ sale: deals from £21 @ Currys" data-dimension25=""><strong>deals from £21 @ Currys</strong></a><br>Currys is offering some big savings on BBQs and grills right now. Brands on sale include Salter, Ninja, George Foreman and more. Prices start from just £21.<a class="view-deal button" href="https://www.currys.co.uk/appliances/small-kitchen-appliances/grills" target="_blank" rel="nofollow" data-dimension112="fb2e5dd9-dd67-4590-8790-7e0cb9c34b1c" data-action="Deal Block" data-label="BBQ sale: deals from £21 @ Currys" data-dimension48="BBQ sale: deals from £21 @ Currys" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="e6fe99cb-98d1-4a21-9221-f43a80face16" data-action="Deal Block" data-label="TV sale: deals from £109 @ Amazon" data-dimension48="TV sale: deals from £109 @ Amazon" href="https://www.amazon.co.uk/s?rh=n%3A560798%2Cn%3A560858%2Cn%3A560864&dc" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2679px;"><p class="vanilla-image-block" style="padding-top:71.37%;"><img id="nr9G3DcYkhFfcUmfEkiRsb" name="Insignia TV 2021 deal block.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nr9G3DcYkhFfcUmfEkiRsb.jpeg" mos="" align="middle" fullscreen="" width="2679" height="1912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>TV sale: </strong><a href="https://www.amazon.co.uk/s?rh=n%3A560798%2Cn%3A560858%2Cn%3A560864&dc" target="_blank" rel="nofollow" data-dimension112="e6fe99cb-98d1-4a21-9221-f43a80face16" data-action="Deal Block" data-label="TV sale: deals from £109 @ Amazon" data-dimension48="TV sale: deals from £109 @ Amazon" data-dimension25=""><strong>deals from £109 @ Amazon</strong></a><br>Amazon has smart TVs on sale for as low as £119. Keep in mind, the cheap TVs tend to be smaller, 1080p models (which are more suitable for a children's room or guest room). However, the sale also includes larger sets. These are among the cheapest TVs we've seen. Note that Currys and Argos are holding similar sales.<br><strong>Price check: </strong><a href="https://www.currys.co.uk/tv-and-audio/televisions/tvs" target="_blank" rel="nofollow"><strong>from £99 @ Currys</strong></a><strong> | </strong><a href="https://www.argos.co.uk/browse/technology/televisions-and-accessories/televisions/c:30106/opt/sort:price/" target="_blank" rel="nofollow"><strong>from £109 @ Argos</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/s?rh=n%3A560798%2Cn%3A560858%2Cn%3A560864&dc" target="_blank" rel="nofollow" data-dimension112="e6fe99cb-98d1-4a21-9221-f43a80face16" data-action="Deal Block" data-label="TV sale: deals from £109 @ Amazon" data-dimension48="TV sale: deals from £109 @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="c4cd5feb-8f0a-4e06-941a-cfd3148b6a37" data-action="Deal Block" data-label="Skechers: deals from £25 @ Amazon" data-dimension48="Skechers: deals from £25 @ Amazon" href="https://www.amazon.co.uk/stores/page/DEE5E5D3-5D22-4BF2-BACF-5E3F9351F478" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1448px;"><p class="vanilla-image-block" style="padding-top:46.96%;"><img id="f6dpeosLMw7GeHpANozvLN" name="61N5IAdLLdL._AC_SY695_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/f6dpeosLMw7GeHpANozvLN.jpg" mos="" align="middle" fullscreen="" width="1448" height="680" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Skechers: </strong><a href="https://www.amazon.co.uk/stores/page/DEE5E5D3-5D22-4BF2-BACF-5E3F9351F478" target="_blank" rel="nofollow" data-dimension112="c4cd5feb-8f0a-4e06-941a-cfd3148b6a37" data-action="Deal Block" data-label="Skechers: deals from £25 @ Amazon" data-dimension48="Skechers: deals from £25 @ Amazon" data-dimension25=""><strong>deals from £25 @ Amazon</strong></a><br>Skechers sneakers and apparel are on sale from £25 at Amazon. The sale includes some of the <a href="https://www.tomsguide.com/best-picks/best-skechers-shoes-in-year">best Skechers. </a>However, note that prices vary by your choice of size and colour.<a class="view-deal button" href="https://www.amazon.co.uk/stores/page/DEE5E5D3-5D22-4BF2-BACF-5E3F9351F478" target="_blank" rel="nofollow" data-dimension112="c4cd5feb-8f0a-4e06-941a-cfd3148b6a37" data-action="Deal Block" data-label="Skechers: deals from £25 @ Amazon" data-dimension48="Skechers: deals from £25 @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="d288ad2b-8cde-4f99-bfd9-00970563b4c3" data-action="Deal Block" data-label="Shark sale: up to 50% off @ Amazon" data-dimension48="Shark sale: up to 50% off @ Amazon" href="https://www.amazon.co.uk/stores/page/24A1BA9D-538C-450B-95D9-32EB722DA118" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:654px;"><p class="vanilla-image-block" style="padding-top:366.21%;"><img id="7yF9KRkiLEecwgPbKw5JR8" name="Shark Stratos" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7yF9KRkiLEecwgPbKw5JR8.jpg" mos="" align="middle" fullscreen="" width="654" height="2395" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Shark sale: </strong><a href="https://www.amazon.co.uk/stores/page/24A1BA9D-538C-450B-95D9-32EB722DA118" target="_blank" rel="nofollow" data-dimension112="d288ad2b-8cde-4f99-bfd9-00970563b4c3" data-action="Deal Block" data-label="Shark sale: up to 50% off @ Amazon" data-dimension48="Shark sale: up to 50% off @ Amazon" data-dimension25=""><strong>up to 50% off @ Amazon</strong></a><br>Amazon is taking up to 50% off shark vacuum cleaners, fans, air purifiers and more. This is a huge chance to save on top-rated appliances!<a class="view-deal button" href="https://www.amazon.co.uk/stores/page/24A1BA9D-538C-450B-95D9-32EB722DA118" target="_blank" rel="nofollow" data-dimension112="d288ad2b-8cde-4f99-bfd9-00970563b4c3" data-action="Deal Block" data-label="Shark sale: up to 50% off @ Amazon" data-dimension48="Shark sale: up to 50% off @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="e9ce42e9-8689-41ed-b3da-959719dc1626" data-action="Deal Block" data-label="Creami Scoop & Swirl" data-dimension48="Creami Scoop & Swirl" data-dimension25="£299" href="https://www.currys.co.uk/products/ninja-creami-scoop-and-swirl-nc701uk-13in1-ice-cream-and-soft-serve-maker-silver-10286341.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="u3UF3oL3YEqJZQbvC46zg5" name="Creami Scoop & Swirl" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/u3UF3oL3YEqJZQbvC46zg5.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.currys.co.uk/products/ninja-creami-scoop-and-swirl-nc701uk-13in1-ice-cream-and-soft-serve-maker-silver-10286341.html" target="_blank" rel="nofollow" data-dimension112="e9ce42e9-8689-41ed-b3da-959719dc1626" data-action="Deal Block" data-label="Creami Scoop & Swirl" data-dimension48="Creami Scoop & Swirl" data-dimension25="£299">Creami Scoop & Swirl: was £349 now £299</a></strong><br>The Ninja Creami Swirl is now on sale for a discount! It features 13 one-touch programs and a soft-serve handle that's designed to dispense up to 4 small cones from one container.<a class="view-deal button" href="https://www.currys.co.uk/products/ninja-creami-scoop-and-swirl-nc701uk-13in1-ice-cream-and-soft-serve-maker-silver-10286341.html" target="_blank" rel="nofollow" data-dimension112="e9ce42e9-8689-41ed-b3da-959719dc1626" data-action="Deal Block" data-label="Creami Scoop & Swirl" data-dimension48="Creami Scoop & Swirl" data-dimension25="£299">View Deal</a></p></div><h3 class="article-body__section" id="section-beat-the-heat"><span>Beat the heat</span></h3><div class="product"><a data-dimension112="fd7be8e1-8b4b-4cd4-b61c-56dc69c6d3ec" data-action="Deal Block" data-label="FlexBreeze HydroGo Misting Fan" data-dimension48="FlexBreeze HydroGo Misting Fan" data-dimension25="£89" href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Lightweight-FA050UKDV/dp/B0F5WXNDDT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1158px;"><p class="vanilla-image-block" style="padding-top:97.93%;"><img id="ZDssbQR5yCiu5gtaqtJeSk" name="Shark FlexBreeze HydroGo" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZDssbQR5yCiu5gtaqtJeSk.png" mos="" align="middle" fullscreen="" width="1158" height="1134" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Lightweight-FA050UKDV/dp/B0F5WXNDDT" target="_blank" rel="nofollow" data-dimension112="fd7be8e1-8b4b-4cd4-b61c-56dc69c6d3ec" data-action="Deal Block" data-label="FlexBreeze HydroGo Misting Fan" data-dimension48="FlexBreeze HydroGo Misting Fan" data-dimension25="£89">FlexBreeze HydroGo Misting Fan: was £129 now £89</a></strong><br>This innovative and portable cooling solution brings the breeze both indoors and outdoors. Plus, with cutting-edge misting technology, it creates a spa-like cooling effect that will see temperatures dropping and life in the sunshine improving. With rechargeable batteries, it can last up to 12 hours, keeping you cool and comfy.<a class="view-deal button" href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Lightweight-FA050UKDV/dp/B0F5WXNDDT" target="_blank" rel="nofollow" data-dimension112="fd7be8e1-8b4b-4cd4-b61c-56dc69c6d3ec" data-action="Deal Block" data-label="FlexBreeze HydroGo Misting Fan" data-dimension48="FlexBreeze HydroGo Misting Fan" data-dimension25="£89">View Deal</a></p></div><div class="product"><a data-dimension112="83eabeac-13d3-4a04-95c1-ef54cfedd05e" data-action="Deal Block" data-label="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension48="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension25="£199" href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Pedestal-FA300UK/dp/B0DTGXV537" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1275px;"><p class="vanilla-image-block" style="padding-top:100.47%;"><img id="stXqXTCWWJZsUMRNEZ8yS3" name="FlexBreeze Pro Mist Indoor Outdoor Pedestal & Table Fan With Water Tank" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/stXqXTCWWJZsUMRNEZ8yS3.jpg" mos="" align="middle" fullscreen="" width="1275" height="1281" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Pedestal-FA300UK/dp/B0DTGXV537" target="_blank" rel="nofollow" data-dimension112="83eabeac-13d3-4a04-95c1-ef54cfedd05e" data-action="Deal Block" data-label="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension48="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension25="£199">FlexBreeze Pro Mist Pedestal & Table Fan: was £249 now £199</a></strong><br>Shark's FlexBreeze Pro Mist is Shark's smartest cooling fan yet. It uses a mist spray to keep you cool in hot weather, and can be used both indoors or outdoors. It offers immense versatility, with a portable design (complete with carry handle and even a bag) and can also be converted to a freestanding fan. It's also rechargeable, and features a removable misting attachment. <a class="view-deal button" href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Pedestal-FA300UK/dp/B0DTGXV537" target="_blank" rel="nofollow" data-dimension112="83eabeac-13d3-4a04-95c1-ef54cfedd05e" data-action="Deal Block" data-label="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension48="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension25="£199">View Deal</a></p></div><h3 class="article-body__section" id="section-running-shoes"><span>Running Shoes</span></h3><div class="product"><a data-dimension112="4aa92449-89ce-4b59-bc85-dedc8182d21d" data-action="Deal Block" data-label="Gel-Excite 11 (Women's)" data-dimension48="Gel-Excite 11 (Women's)" data-dimension25="£64" href="https://www.asics.com/gb/en-gb/gel-excite-11/p/1012B861-500.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1163px;"><p class="vanilla-image-block" style="padding-top:58.73%;"><img id="ApA8TRKTowTCiYpEXd3LDK" name="gel excite" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ApA8TRKTowTCiYpEXd3LDK.jpg" mos="" align="middle" fullscreen="" width="1163" height="683" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.asics.com/gb/en-gb/gel-excite-11/p/1012B861-500.html" target="_blank" rel="nofollow" data-dimension112="4aa92449-89ce-4b59-bc85-dedc8182d21d" data-action="Deal Block" data-label="Gel-Excite 11 (Women's)" data-dimension48="Gel-Excite 11 (Women's)" data-dimension25="£64">Gel-Excite 11 (Women's): was £80 now £64</a></strong><br>Asics members can now get the Gel-Excite 11 for £64, and it's free to sign up. Designed for running and fitness, these shoes bring a higher stack and a super soft and comfortable feel underfoot.<a class="view-deal button" href="https://www.asics.com/gb/en-gb/gel-excite-11/p/1012B861-500.html" target="_blank" rel="nofollow" data-dimension112="4aa92449-89ce-4b59-bc85-dedc8182d21d" data-action="Deal Block" data-label="Gel-Excite 11 (Women's)" data-dimension48="Gel-Excite 11 (Women's)" data-dimension25="£64">View Deal</a></p></div><div class="product"><a data-dimension112="ec16cc8a-0a56-4ce2-a367-0e6a93dd6763" data-action="Deal Block" data-label="Clifton 10 Road Running Shoes (Men's)" data-dimension48="Clifton 10 Road Running Shoes (Men's)" data-dimension25="£97" href="https://www.hoka.com/en/gb/sale-men/clifton-10/1162030S.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1932px;"><p class="vanilla-image-block" style="padding-top:81.11%;"><img id="bbp297WbQjnWA2WZBXtYCE" name="Clifton 10" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bbp297WbQjnWA2WZBXtYCE.jpg" mos="" align="middle" fullscreen="" width="1932" height="1567" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.hoka.com/en/gb/sale-men/clifton-10/1162030S.html" target="_blank" rel="nofollow" data-dimension112="ec16cc8a-0a56-4ce2-a367-0e6a93dd6763" data-action="Deal Block" data-label="Clifton 10 Road Running Shoes (Men's)" data-dimension48="Clifton 10 Road Running Shoes (Men's)" data-dimension25="£97">Clifton 10 Road Running Shoes (Men's): was £140 now £97</a></strong><br>The Hoka Clifton 10 is a cushioned daily trainer that offers a smooth and comfortable ride. It’s perfect for beginners, and also a great option for experienced runners who need a comfy shoe to eat up the miles.<a class="view-deal button" href="https://www.hoka.com/en/gb/sale-men/clifton-10/1162030S.html" target="_blank" rel="nofollow" data-dimension112="ec16cc8a-0a56-4ce2-a367-0e6a93dd6763" data-action="Deal Block" data-label="Clifton 10 Road Running Shoes (Men's)" data-dimension48="Clifton 10 Road Running Shoes (Men's)" data-dimension25="£97">View Deal</a></p></div><div class="product"><a data-dimension112="ad25368a-8e4d-4095-b9a8-5e29de0f32b5" data-action="Deal Block" data-label="Adizero Adios Pro 4 Shoes" data-dimension48="Adizero Adios Pro 4 Shoes" data-dimension25="£176" href="https://www.adidas.co.uk/adizero-adios-pro-4-shoes/JR1241.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:784px;"><p class="vanilla-image-block" style="padding-top:46.05%;"><img id="LjPhyFdUSs8zKoqNKpaxwn" name="adizero 4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LjPhyFdUSs8zKoqNKpaxwn.png" mos="" align="middle" fullscreen="" width="784" height="361" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.adidas.co.uk/adizero-adios-pro-4-shoes/JR1241.html" target="_blank" rel="nofollow" data-dimension112="ad25368a-8e4d-4095-b9a8-5e29de0f32b5" data-action="Deal Block" data-label="Adizero Adios Pro 4 Shoes" data-dimension48="Adizero Adios Pro 4 Shoes" data-dimension25="£176">Adizero Adios Pro 4 Shoes: was £220 now £176</a></strong><br>The Adizero Adios Pro 4 is aimed at runners who want to go fast. The carbon-infused ENERGYRODS 2.0 act like stiff plates inside the shoe, helping the foot roll smoothly from heel to toe. The shoe also features a rocker point in the midsole to help make each stride more efficient.<a class="view-deal button" href="https://www.adidas.co.uk/adizero-adios-pro-4-shoes/JR1241.html" target="_blank" rel="nofollow" data-dimension112="ad25368a-8e4d-4095-b9a8-5e29de0f32b5" data-action="Deal Block" data-label="Adizero Adios Pro 4 Shoes" data-dimension48="Adizero Adios Pro 4 Shoes" data-dimension25="£176">View Deal</a></p></div><h3 class="article-body__section" id="section-patio-garden"><span>Patio & Garden</span></h3><div class="product"><a data-dimension112="a2e9f3d8-b286-4aab-8132-c4d241ba8eba" data-action="Deal Block" data-label="GloBulb Solar String Lights" data-dimension48="GloBulb Solar String Lights" data-dimension25="£14" href="https://www.currys.co.uk/products/smart-garden-globulb-solar-string-lights-warm-white-set-of-20-10296839.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="qJZnnJyxCffo93ZeWta8kn" name="GloBulb Solar String Lights" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qJZnnJyxCffo93ZeWta8kn.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.currys.co.uk/products/smart-garden-globulb-solar-string-lights-warm-white-set-of-20-10296839.html" target="_blank" rel="nofollow" data-dimension112="a2e9f3d8-b286-4aab-8132-c4d241ba8eba" data-action="Deal Block" data-label="GloBulb Solar String Lights" data-dimension48="GloBulb Solar String Lights" data-dimension25="£14">GloBulb Solar String Lights: was £34 now £14</a></strong><br>Harness the power of the sun to light your garden through the night! This set gets you a 10m string of 20 solar powered bulbs. The warm white light helps create the perfect cozy atmosphere.<a class="view-deal button" href="https://www.currys.co.uk/products/smart-garden-globulb-solar-string-lights-warm-white-set-of-20-10296839.html" target="_blank" rel="nofollow" data-dimension112="a2e9f3d8-b286-4aab-8132-c4d241ba8eba" data-action="Deal Block" data-label="GloBulb Solar String Lights" data-dimension48="GloBulb Solar String Lights" data-dimension25="£14">View Deal</a></p></div><div class="product"><a data-dimension112="0d08ed78-8b74-41e3-8f5d-9e8eebd361e4" data-action="Deal Block" data-label="Outdoor Garden Patio Balcony Furniture" data-dimension48="Outdoor Garden Patio Balcony Furniture" data-dimension25="£84" href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ySochRXbLb2e4uk8bmhL56" name="Capri 2 Seater Rattan Bistro Set Outdoor Garden Patio Balcony Furniture 3 Pcs" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ySochRXbLb2e4uk8bmhL56.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow" data-dimension112="0d08ed78-8b74-41e3-8f5d-9e8eebd361e4" data-action="Deal Block" data-label="Outdoor Garden Patio Balcony Furniture" data-dimension48="Outdoor Garden Patio Balcony Furniture" data-dimension25="£84">Outdoor Garden Patio Balcony Furniture: was £99 now £84</a></strong><br>This patio set transforms your outdoor space, adding seating and dining space for just £84. You get two chairs and a table that fold away when not in use.<a class="view-deal button" href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow" data-dimension112="0d08ed78-8b74-41e3-8f5d-9e8eebd361e4" data-action="Deal Block" data-label="Outdoor Garden Patio Balcony Furniture" data-dimension48="Outdoor Garden Patio Balcony Furniture" data-dimension25="£84">View Deal</a></p></div><div class="product"><a data-dimension112="a36adb78-3f2a-412f-b980-b0cc62e12a3e" data-action="Deal Block" data-label="EasiGlide 330 Corded Lawn Mower" data-dimension48="EasiGlide 330 Corded Lawn Mower" data-dimension25="£99" href="https://www.currys.co.uk/products/flymo-easiglide-330-corded-lawn-mower-orange-and-grey-10275999.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="NiDWqDVmAfiK6J9hcqRgZa" name="EasiGlide 330 Corded Lawn Mower" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NiDWqDVmAfiK6J9hcqRgZa.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.currys.co.uk/products/flymo-easiglide-330-corded-lawn-mower-orange-and-grey-10275999.html" target="_blank" rel="nofollow" data-dimension112="a36adb78-3f2a-412f-b980-b0cc62e12a3e" data-action="Deal Block" data-label="EasiGlide 330 Corded Lawn Mower" data-dimension48="EasiGlide 330 Corded Lawn Mower" data-dimension25="£99">EasiGlide 330 Corded Lawn Mower: was £169 now £99</a></strong><br>An easy and affordable way to keep your grass in check — this Flymo mower is now on sale for £104. Reviewers love this one, with shoppers at Currys writing that it "Glides over the grass very easily." It's also lightweight, coming in at 8.33 kg.<a class="view-deal button" href="https://www.currys.co.uk/products/flymo-easiglide-330-corded-lawn-mower-orange-and-grey-10275999.html" target="_blank" rel="nofollow" data-dimension112="a36adb78-3f2a-412f-b980-b0cc62e12a3e" data-action="Deal Block" data-label="EasiGlide 330 Corded Lawn Mower" data-dimension48="EasiGlide 330 Corded Lawn Mower" data-dimension25="£99">View Deal</a></p></div><h3 class="article-body__section" id="section-tech"><span>Tech</span></h3><div class="product"><a data-dimension112="0ac49a94-e278-4a66-9c09-f3aceb8ca275" data-action="Deal Block" data-label="Fire TV Stick HD" data-dimension48="Fire TV Stick HD" data-dimension25="£25" href="https://www.amazon.co.uk/fire-tv-stick-hd/dp/B0DJGCX6Q2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1108px;"><p class="vanilla-image-block" style="padding-top:93.23%;"><img id="KuGTVfs9qg2Ak2hUofVVAQ" name="Fire TV Stick HD" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KuGTVfs9qg2Ak2hUofVVAQ.jpg" mos="" align="middle" fullscreen="" width="1108" height="1033" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you have a 4K TV, I recommend picking up a 4K streaming stick — but this is a nice discount if you have a HD TV. The 2026 Fire TV Stick HD is easier to set up than before and reduces clutter: it connects and draws power from your TV, so no need to find a power outlet.<a class="view-deal button" href="https://www.amazon.co.uk/fire-tv-stick-hd/dp/B0DJGCX6Q2" target="_blank" rel="nofollow" data-dimension112="0ac49a94-e278-4a66-9c09-f3aceb8ca275" data-action="Deal Block" data-label="Fire TV Stick HD" data-dimension48="Fire TV Stick HD" data-dimension25="£25">View Deal</a></p></div><div class="product"><a data-dimension112="389c1fa5-b567-4fbc-90eb-1845b0ef955e" data-action="Deal Block" data-label="10,000 mAh Portable Charger" data-dimension48="10,000 mAh Portable Charger" data-dimension25="£13" href="https://www.amazon.co.uk/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07PNL5STG" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1001px;"><p class="vanilla-image-block" style="padding-top:124.28%;"><img id="U3LvvKhsQa44bvLRGDGPuf" name="iniu-portable-charger.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/U3LvvKhsQa44bvLRGDGPuf.jpg" mos="" align="middle" fullscreen="" width="1001" height="1244" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07PNL5STG" target="_blank" rel="nofollow" data-dimension112="389c1fa5-b567-4fbc-90eb-1845b0ef955e" data-action="Deal Block" data-label="10,000 mAh Portable Charger" data-dimension48="10,000 mAh Portable Charger" data-dimension25="£13">10,000 mAh Portable Charger: was £29 now £13</a></strong><br>It has since lost its spot to a newer model, but the INIU 10000mAh Portable Charger is a previous winner on our list of the <a href="https://www.tomsguide.com/best-picks/best-portable-chargers">best power banks</a>. It offers two USB-A ports, fast device charging and a sizable battery that can keep your smartphone powered all day long.<a class="view-deal button" href="https://www.amazon.co.uk/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07PNL5STG" target="_blank" rel="nofollow" data-dimension112="389c1fa5-b567-4fbc-90eb-1845b0ef955e" data-action="Deal Block" data-label="10,000 mAh Portable Charger" data-dimension48="10,000 mAh Portable Charger" data-dimension25="£13">View Deal</a></p></div><div class="product"><a data-dimension112="eb6901a4-2dba-4573-bcc7-513a2cc2779e" data-action="Deal Block" data-label="iO2 Electric Toothbrush" data-dimension48="iO2 Electric Toothbrush" data-dimension25="£39" href="https://www.currys.co.uk/products/oralb-io2-electric-toothbrush-travel-case-calm-pink-10276943.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="aUqEeFnKyW7gS7kW3gXw6N" name="iO2 Electric Toothbrush" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aUqEeFnKyW7gS7kW3gXw6N.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.currys.co.uk/products/oralb-io2-electric-toothbrush-travel-case-calm-pink-10276943.html" target="_blank" rel="nofollow" data-dimension112="eb6901a4-2dba-4573-bcc7-513a2cc2779e" data-action="Deal Block" data-label="iO2 Electric Toothbrush" data-dimension48="iO2 Electric Toothbrush" data-dimension25="£39">iO2 Electric Toothbrush: was £44 now £39</a></strong><br>This electric toothbrush from Oral-B is a great buy at any time of the year. The Oral-B iO2 has three cleaning modes and helps you protect your gums by warning you if you're using too much pressure. It also comes with a travel case.<br><strong>Price check: </strong><a href="https://www.amazon.co.uk/Oral-B-Electric-Toothbrush-Seasonal-Limited/dp/B0GD11MTDB" target="_blank" rel="nofollow"><strong>£39 @ Amazon</strong></a><a class="view-deal button" href="https://www.currys.co.uk/products/oralb-io2-electric-toothbrush-travel-case-calm-pink-10276943.html" target="_blank" rel="nofollow" data-dimension112="eb6901a4-2dba-4573-bcc7-513a2cc2779e" data-action="Deal Block" data-label="iO2 Electric Toothbrush" data-dimension48="iO2 Electric Toothbrush" data-dimension25="£39">View Deal</a></p></div><div class="product"><a data-dimension112="affc0752-d035-47fa-b1eb-f797077f9f33" data-action="Deal Block" data-label="Soundcore 3" data-dimension48="Soundcore 3" data-dimension25="£33" href="https://www.amazon.co.uk/Soundcore-Bluetooth-Diaphragm-Technology-Waterproof/dp/B08BCHKY52" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7gcodpoQrdpbyP43TcSY3f" name="Anker Soundcore 3 deal on white.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7gcodpoQrdpbyP43TcSY3f.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/anker-soundcore-3" data-dimension112="affc0752-d035-47fa-b1eb-f797077f9f33" data-action="Deal Block" data-label="Soundcore 3" data-dimension48="Soundcore 3" data-dimension25="£33">Anker Soundcore 3</a> is one of the <a href="https://www.tomsguide.com/best-picks/best-cheap-bluetooth-speakers">best cheap Bluetooth speakers</a> around. It delivers loud, well-balanced sound within an IPX7-rated design that can survive water and dust, as well as up to 24 hours of battery. The Soundcore 3's dual tweeter drivers, central mid/bass woofer and BassUp technology ensure you'll get powerful sound in any setting. Plus, SharePlay allows multiple Soundcore speakers to be synced for an even bigger sound.<a class="view-deal button" href="https://www.amazon.co.uk/Soundcore-Bluetooth-Diaphragm-Technology-Waterproof/dp/B08BCHKY52" target="_blank" rel="nofollow" data-dimension112="affc0752-d035-47fa-b1eb-f797077f9f33" data-action="Deal Block" data-label="Soundcore 3" data-dimension48="Soundcore 3" data-dimension25="£33">View Deal</a></p></div><div class="product"><a data-dimension112="8af055d1-2692-4df7-b6a7-2a30030f530c" data-action="Deal Block" data-label="AirPods 4" data-dimension48="AirPods 4" data-dimension25="£99" href="https://www.amazon.co.uk/Apple-Bluetooth-Headphones-Personalised-Effortless/dp/B0DGHWD7CT/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:120.00%;"><img id="kTKCG8gCBjg4vScr6CMgoN" name="AirPods 4 BG image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kTKCG8gCBjg4vScr6CMgoN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our AirPods 4 review we praised these earbuds for offering "pro-level features for less." This includes effective noise cancellation when you're on the go, as well as Conversational Awareness. So if someone starts talking to you you'll be able to hear them without touch the AirPods.<a class="view-deal button" href="https://www.amazon.co.uk/Apple-Bluetooth-Headphones-Personalised-Effortless/dp/B0DGHWD7CT/" target="_blank" rel="nofollow" data-dimension112="8af055d1-2692-4df7-b6a7-2a30030f530c" data-action="Deal Block" data-label="AirPods 4" data-dimension48="AirPods 4" data-dimension25="£99">View Deal</a></p></div><h3 class="article-body__section" id="section-tvs"><span>TVs</span></h3><div class="product"><a data-dimension112="6f21ee9a-404d-4f3a-9904-0348d375e125" data-action="Deal Block" data-label="55" U7QG Mini-LED TV" data-dimension48="55" U7QG Mini-LED TV" data-dimension25="£549" href="https://www.amazon.co.uk/Hisense-50U7QTUK-MiniLED-144Hz-Smart/dp/B0F7WJWY9H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="fuVkX53KX5S6YQZt8o7Bck" name="81LmlH2OGDL._SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fuVkX53KX5S6YQZt8o7Bck.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Hisense-50U7QTUK-MiniLED-144Hz-Smart/dp/B0F7WJWY9H" target="_blank" rel="nofollow" data-dimension112="6f21ee9a-404d-4f3a-9904-0348d375e125" data-action="Deal Block" data-label='55" U7QG Mini-LED TV' data-dimension48='55" U7QG Mini-LED TV' data-dimension25="£549">55" U7QG Mini-LED TV: was £699 now £549</a></strong><br>This Mini-LED TV offers major upgrades for streamers and gamers. Built on a 165Hz refresh rate with a Game Mode Ultra mode, the Hisense U7QG is designed to be the best seat in the house. Add to that one serious sound system in its 2.1.2-channel speaker, and you've got a powerhouse of a TV with tons of flair.<br><strong>Price check: </strong><a href="https://www.argos.co.uk/product/7650934" target="_blank" rel="nofollow"><strong>£540 @ Argos</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/Hisense-50U7QTUK-MiniLED-144Hz-Smart/dp/B0F7WJWY9H" target="_blank" rel="nofollow" data-dimension112="6f21ee9a-404d-4f3a-9904-0348d375e125" data-action="Deal Block" data-label="55" U7QG Mini-LED TV" data-dimension48="55" U7QG Mini-LED TV" data-dimension25="£549">View Deal</a></p></div><div class="product"><a data-dimension112="778101da-835f-4c67-8c9b-7067fa8886bf" data-action="Deal Block" data-label="42" C5 4K OLED TV" data-dimension48="42" C5 4K OLED TV" data-dimension25="$764" href="https://www.amazon.co.uk/LG-OLED65C55LA-65-Inch-Processor-Freeview/dp/B0F14943MR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:60.60%;"><img id="oBaPUFAAexE2Jge2Vinp73" name="91bxFjk187L._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oBaPUFAAexE2Jge2Vinp73.jpg" mos="" align="middle" fullscreen="" width="1500" height="909" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/LG-OLED65C55LA-65-Inch-Processor-Freeview/dp/B0F14943MR" target="_blank" rel="nofollow" data-dimension112="778101da-835f-4c67-8c9b-7067fa8886bf" data-action="Deal Block" data-label='42" C5 4K OLED TV' data-dimension48='42" C5 4K OLED TV' data-dimension25="$764">42" C5 4K OLED TV: was $1049 now $764</a></strong><br>The <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c5-oled-tv-review">LG C5 OLED</a> is built on an illustrious design that offers stellar brightness and color metrics. Self-emitting pixels allow it to spit out gorgeous contrast, and it offers a slew of features for gamers to enjoy their favorite experiences at breakneck speeds. We rank it as the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TV</a> you can buy right now.<a class="view-deal button" href="https://www.amazon.co.uk/LG-OLED65C55LA-65-Inch-Processor-Freeview/dp/B0F14943MR" target="_blank" rel="nofollow" data-dimension112="778101da-835f-4c67-8c9b-7067fa8886bf" data-action="Deal Block" data-label="42" C5 4K OLED TV" data-dimension48="42" C5 4K OLED TV" data-dimension25="$764">View Deal</a></p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/sales-events/amazon-argos-and-currys-are-all-holding-bank-holiday-sales-21-deals-that-are-actually-worth-it</link>
                                                                            <description>
                            <![CDATA[ These are the deals you should actually buy on running shoes, smart home upgrades, outdoor furniture and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NhYst6fTtx6tMqbfE25Fo9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NHwi7jVpjkkpMhQ5ioG4RD-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 21 May 2026 14:55:38 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sales Events]]></category>
                                                                                                <author><![CDATA[ millie.daviswilliams@futurenet.com (Millie Davis-Williams) ]]></author>                    <dc:creator><![CDATA[ Millie Davis-Williams ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/WU6pa7hKuxs5ScCoqcXYWA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Millie is a Deals Editor at Tom&#039;s Guide specializing in tech deals content. Based in London, Millie has spent a lifetime stubbornly refusing to pay full price on any possible purchase. She has years of searching for the best discounts on the latest and greatest phones, TVs and gadgets under her belt, and knows how to sort the best deals from the rest. Helping readers save on the products they want is her mission, whether it’s an Apple Watch or a new tablet.&lt;/p&gt;&lt;p&gt;Since working at Tom’s Guide, Millie has covered retail events like Prime Day, Black Friday and Cyber Monday extensively, meaning she knows the products readers are looking for and the best times of year to hit “purchase.”&lt;/p&gt;&lt;p&gt;When she’s not looking for discounts, Millie covers news and writes how-to articles about everything from phones, streaming devices, and headphones to apps and video games.&lt;/p&gt;&lt;p&gt;In her spare time, Millie enjoys reading, gaming on her Nintendo Switch and creating digital art. She’s also a fan of watching Disney movies and collecting plush (the latter having totally taken over her bedroom.)&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/NHwi7jVpjkkpMhQ5ioG4RD-1280-80.jpg">
                                                            <media:credit><![CDATA[Ninja / Hoka / Shark / Flymo / Amazon / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Ninja/Shark appliances, running shoes, lawn mower, Fire TV Stick]]></media:description>                                                            <media:text><![CDATA[Ninja/Shark appliances, running shoes, lawn mower, Fire TV Stick]]></media:text>
                                <media:title type="plain"><![CDATA[Ninja/Shark appliances, running shoes, lawn mower, Fire TV Stick]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NHwi7jVpjkkpMhQ5ioG4RD-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon, Currys and Argos are all holding sales this bank holiday weekend. There are dozens of deals to sort through, so if you want to save time and just get right to the good stuff, I'm here to give you a hand.</p><p>Temperatures are set to soar this weekend, so you'll need to make sure you're prepared. I highly recommend picking up a cooling device, and the <a href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Lightweight-FA050UKDV/dp/B0F5WXNDDT" target="_blank" rel="nofollow">Shark FlexBreeze HydroGo Cordless Fan is a great choice at £89</a>. We <a href="https://www.tomsguide.com/home/home-appliances/shark-flexbreeze-hydrogo-cooling-fan-review">tested it out last year</a> and called it "the fan of the summer" so it's not a deal you'll want to miss out on.</p><p>If you want to spend the weekend in your garden, <a href="https://www.argos.co.uk/list/shop-savings-on-garden-diy-and-decorating" target="_blank" rel="nofollow">Argos has up to 33% off everything garden, DIY and decorating</a>. And <a href="https://www.currys.co.uk/epic-deals" target="_blank" rel="nofollow">Currys' Epic Deals includes price drops on everything from hot tubs to 4K TVs</a>.</p><p>Keep scrolling to see the deals I think are the most worth it! For more, see our <a href="http://tomsguide.com/coupons/amazon.co.uk">Amazon promo codes</a> page.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.amazon.co.uk/deals" target="_blank" rel="nofollow"><strong>shop all deals at Amazon</strong></a></li><li><strong>Furniture & Decor: </strong><a href="https://www.argos.co.uk/list/shop-all-big-red-furniture-offers" target="_blank" rel="nofollow"><strong>up to 50% off</strong></a></li><li><strong>Garden/DIY: </strong><a href="https://www.argos.co.uk/list/shop-savings-on-garden-diy-and-decorating" target="_blank" rel="nofollow"><strong>up to 33% off</strong></a></li><li><strong>Iniu 10,000 mAh Portable Charger: </strong><a href="https://www.amazon.co.uk/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07PNL5STG" target="_blank" rel="nofollow"><strong>was £18 now £13</strong></a></li><li><strong>Skechers: </strong><a href="https://www.amazon.co.uk/stores/page/29902F1F-31A9-4A30-9217-D43EB75AA71D/" target="_blank" rel="nofollow"><strong>deals from £30</strong></a></li><li><strong>TV sale: </strong><a href="https://www.currys.co.uk/tv-and-audio/televisions/tvs" target="_blank" rel="nofollow"><strong>deals from £99</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-editor-s-choice"><span>Editor's Choice</span></h3><div class="product"><a data-dimension112="f22fdc9a-68e0-4d98-89e2-dc09b25d19cc" data-action="Deal Block" data-label="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension48="Furniture &amp; Decor: up to 50% off @ Argos" href="https://www.argos.co.uk/list/shop-all-big-red-furniture-offers" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1511px;"><p class="vanilla-image-block" style="padding-top:91.46%;"><img id="cSkKWHamLBoi5yNdY59hXC" name="argos home sofa" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cSkKWHamLBoi5yNdY59hXC.jpg" mos="" align="middle" fullscreen="" width="1511" height="1382" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Furniture & Decor: </strong><a href="https://www.argos.co.uk/list/shop-all-big-red-furniture-offers" target="_blank" rel="nofollow" data-dimension112="f22fdc9a-68e0-4d98-89e2-dc09b25d19cc" data-action="Deal Block" data-label="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension48="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension25=""><strong>up to 50% off @ Argos</strong></a><br>Argos is taking up to 50% off furniture in its latest sale. You'll find everything from mattresses to dining sets from big-name brands. Don't forget to use the discount codes <strong>"RED10", "RED20", "RED30" or "RED50" </strong>where applicable.<a class="view-deal button" href="https://www.argos.co.uk/list/shop-all-big-red-furniture-offers" target="_blank" rel="nofollow" data-dimension112="f22fdc9a-68e0-4d98-89e2-dc09b25d19cc" data-action="Deal Block" data-label="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension48="Furniture &amp; Decor: up to 50% off @ Argos" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="fb2e5dd9-dd67-4590-8790-7e0cb9c34b1c" data-action="Deal Block" data-label="BBQ sale: deals from £21 @ Currys" data-dimension48="BBQ sale: deals from £21 @ Currys" href="https://www.currys.co.uk/appliances/small-kitchen-appliances/grills" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="AaUbignfchFJK9yxtAdJd9" name="Weber" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AaUbignfchFJK9yxtAdJd9.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>BBQ sale: </strong><a href="https://www.currys.co.uk/appliances/small-kitchen-appliances/grills" target="_blank" rel="nofollow" data-dimension112="fb2e5dd9-dd67-4590-8790-7e0cb9c34b1c" data-action="Deal Block" data-label="BBQ sale: deals from £21 @ Currys" data-dimension48="BBQ sale: deals from £21 @ Currys" data-dimension25=""><strong>deals from £21 @ Currys</strong></a><br>Currys is offering some big savings on BBQs and grills right now. Brands on sale include Salter, Ninja, George Foreman and more. Prices start from just £21.<a class="view-deal button" href="https://www.currys.co.uk/appliances/small-kitchen-appliances/grills" target="_blank" rel="nofollow" data-dimension112="fb2e5dd9-dd67-4590-8790-7e0cb9c34b1c" data-action="Deal Block" data-label="BBQ sale: deals from £21 @ Currys" data-dimension48="BBQ sale: deals from £21 @ Currys" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="e6fe99cb-98d1-4a21-9221-f43a80face16" data-action="Deal Block" data-label="TV sale: deals from £109 @ Amazon" data-dimension48="TV sale: deals from £109 @ Amazon" href="https://www.amazon.co.uk/s?rh=n%3A560798%2Cn%3A560858%2Cn%3A560864&dc" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2679px;"><p class="vanilla-image-block" style="padding-top:71.37%;"><img id="nr9G3DcYkhFfcUmfEkiRsb" name="Insignia TV 2021 deal block.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nr9G3DcYkhFfcUmfEkiRsb.jpeg" mos="" align="middle" fullscreen="" width="2679" height="1912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>TV sale: </strong><a href="https://www.amazon.co.uk/s?rh=n%3A560798%2Cn%3A560858%2Cn%3A560864&dc" target="_blank" rel="nofollow" data-dimension112="e6fe99cb-98d1-4a21-9221-f43a80face16" data-action="Deal Block" data-label="TV sale: deals from £109 @ Amazon" data-dimension48="TV sale: deals from £109 @ Amazon" data-dimension25=""><strong>deals from £109 @ Amazon</strong></a><br>Amazon has smart TVs on sale for as low as £119. Keep in mind, the cheap TVs tend to be smaller, 1080p models (which are more suitable for a children's room or guest room). However, the sale also includes larger sets. These are among the cheapest TVs we've seen. Note that Currys and Argos are holding similar sales.<br><strong>Price check: </strong><a href="https://www.currys.co.uk/tv-and-audio/televisions/tvs" target="_blank" rel="nofollow"><strong>from £99 @ Currys</strong></a><strong> | </strong><a href="https://www.argos.co.uk/browse/technology/televisions-and-accessories/televisions/c:30106/opt/sort:price/" target="_blank" rel="nofollow"><strong>from £109 @ Argos</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/s?rh=n%3A560798%2Cn%3A560858%2Cn%3A560864&dc" target="_blank" rel="nofollow" data-dimension112="e6fe99cb-98d1-4a21-9221-f43a80face16" data-action="Deal Block" data-label="TV sale: deals from £109 @ Amazon" data-dimension48="TV sale: deals from £109 @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="c4cd5feb-8f0a-4e06-941a-cfd3148b6a37" data-action="Deal Block" data-label="Skechers: deals from £25 @ Amazon" data-dimension48="Skechers: deals from £25 @ Amazon" href="https://www.amazon.co.uk/stores/page/DEE5E5D3-5D22-4BF2-BACF-5E3F9351F478" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1448px;"><p class="vanilla-image-block" style="padding-top:46.96%;"><img id="f6dpeosLMw7GeHpANozvLN" name="61N5IAdLLdL._AC_SY695_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/f6dpeosLMw7GeHpANozvLN.jpg" mos="" align="middle" fullscreen="" width="1448" height="680" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Skechers: </strong><a href="https://www.amazon.co.uk/stores/page/DEE5E5D3-5D22-4BF2-BACF-5E3F9351F478" target="_blank" rel="nofollow" data-dimension112="c4cd5feb-8f0a-4e06-941a-cfd3148b6a37" data-action="Deal Block" data-label="Skechers: deals from £25 @ Amazon" data-dimension48="Skechers: deals from £25 @ Amazon" data-dimension25=""><strong>deals from £25 @ Amazon</strong></a><br>Skechers sneakers and apparel are on sale from £25 at Amazon. The sale includes some of the <a href="https://www.tomsguide.com/best-picks/best-skechers-shoes-in-year">best Skechers. </a>However, note that prices vary by your choice of size and colour.<a class="view-deal button" href="https://www.amazon.co.uk/stores/page/DEE5E5D3-5D22-4BF2-BACF-5E3F9351F478" target="_blank" rel="nofollow" data-dimension112="c4cd5feb-8f0a-4e06-941a-cfd3148b6a37" data-action="Deal Block" data-label="Skechers: deals from £25 @ Amazon" data-dimension48="Skechers: deals from £25 @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="d288ad2b-8cde-4f99-bfd9-00970563b4c3" data-action="Deal Block" data-label="Shark sale: up to 50% off @ Amazon" data-dimension48="Shark sale: up to 50% off @ Amazon" href="https://www.amazon.co.uk/stores/page/24A1BA9D-538C-450B-95D9-32EB722DA118" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:654px;"><p class="vanilla-image-block" style="padding-top:366.21%;"><img id="7yF9KRkiLEecwgPbKw5JR8" name="Shark Stratos" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7yF9KRkiLEecwgPbKw5JR8.jpg" mos="" align="middle" fullscreen="" width="654" height="2395" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Shark sale: </strong><a href="https://www.amazon.co.uk/stores/page/24A1BA9D-538C-450B-95D9-32EB722DA118" target="_blank" rel="nofollow" data-dimension112="d288ad2b-8cde-4f99-bfd9-00970563b4c3" data-action="Deal Block" data-label="Shark sale: up to 50% off @ Amazon" data-dimension48="Shark sale: up to 50% off @ Amazon" data-dimension25=""><strong>up to 50% off @ Amazon</strong></a><br>Amazon is taking up to 50% off shark vacuum cleaners, fans, air purifiers and more. This is a huge chance to save on top-rated appliances!<a class="view-deal button" href="https://www.amazon.co.uk/stores/page/24A1BA9D-538C-450B-95D9-32EB722DA118" target="_blank" rel="nofollow" data-dimension112="d288ad2b-8cde-4f99-bfd9-00970563b4c3" data-action="Deal Block" data-label="Shark sale: up to 50% off @ Amazon" data-dimension48="Shark sale: up to 50% off @ Amazon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="e9ce42e9-8689-41ed-b3da-959719dc1626" data-action="Deal Block" data-label="Creami Scoop & Swirl" data-dimension48="Creami Scoop & Swirl" data-dimension25="£299" href="https://www.currys.co.uk/products/ninja-creami-scoop-and-swirl-nc701uk-13in1-ice-cream-and-soft-serve-maker-silver-10286341.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="u3UF3oL3YEqJZQbvC46zg5" name="Creami Scoop & Swirl" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/u3UF3oL3YEqJZQbvC46zg5.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.currys.co.uk/products/ninja-creami-scoop-and-swirl-nc701uk-13in1-ice-cream-and-soft-serve-maker-silver-10286341.html" target="_blank" rel="nofollow" data-dimension112="e9ce42e9-8689-41ed-b3da-959719dc1626" data-action="Deal Block" data-label="Creami Scoop & Swirl" data-dimension48="Creami Scoop & Swirl" data-dimension25="£299">Creami Scoop & Swirl: was £349 now £299</a></strong><br>The Ninja Creami Swirl is now on sale for a discount! It features 13 one-touch programs and a soft-serve handle that's designed to dispense up to 4 small cones from one container.<a class="view-deal button" href="https://www.currys.co.uk/products/ninja-creami-scoop-and-swirl-nc701uk-13in1-ice-cream-and-soft-serve-maker-silver-10286341.html" target="_blank" rel="nofollow" data-dimension112="e9ce42e9-8689-41ed-b3da-959719dc1626" data-action="Deal Block" data-label="Creami Scoop & Swirl" data-dimension48="Creami Scoop & Swirl" data-dimension25="£299">View Deal</a></p></div><h3 class="article-body__section" id="section-beat-the-heat"><span>Beat the heat</span></h3><div class="product"><a data-dimension112="fd7be8e1-8b4b-4cd4-b61c-56dc69c6d3ec" data-action="Deal Block" data-label="FlexBreeze HydroGo Misting Fan" data-dimension48="FlexBreeze HydroGo Misting Fan" data-dimension25="£89" href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Lightweight-FA050UKDV/dp/B0F5WXNDDT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1158px;"><p class="vanilla-image-block" style="padding-top:97.93%;"><img id="ZDssbQR5yCiu5gtaqtJeSk" name="Shark FlexBreeze HydroGo" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZDssbQR5yCiu5gtaqtJeSk.png" mos="" align="middle" fullscreen="" width="1158" height="1134" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Lightweight-FA050UKDV/dp/B0F5WXNDDT" target="_blank" rel="nofollow" data-dimension112="fd7be8e1-8b4b-4cd4-b61c-56dc69c6d3ec" data-action="Deal Block" data-label="FlexBreeze HydroGo Misting Fan" data-dimension48="FlexBreeze HydroGo Misting Fan" data-dimension25="£89">FlexBreeze HydroGo Misting Fan: was £129 now £89</a></strong><br>This innovative and portable cooling solution brings the breeze both indoors and outdoors. Plus, with cutting-edge misting technology, it creates a spa-like cooling effect that will see temperatures dropping and life in the sunshine improving. With rechargeable batteries, it can last up to 12 hours, keeping you cool and comfy.<a class="view-deal button" href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Lightweight-FA050UKDV/dp/B0F5WXNDDT" target="_blank" rel="nofollow" data-dimension112="fd7be8e1-8b4b-4cd4-b61c-56dc69c6d3ec" data-action="Deal Block" data-label="FlexBreeze HydroGo Misting Fan" data-dimension48="FlexBreeze HydroGo Misting Fan" data-dimension25="£89">View Deal</a></p></div><div class="product"><a data-dimension112="83eabeac-13d3-4a04-95c1-ef54cfedd05e" data-action="Deal Block" data-label="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension48="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension25="£199" href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Pedestal-FA300UK/dp/B0DTGXV537" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1275px;"><p class="vanilla-image-block" style="padding-top:100.47%;"><img id="stXqXTCWWJZsUMRNEZ8yS3" name="FlexBreeze Pro Mist Indoor Outdoor Pedestal & Table Fan With Water Tank" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/stXqXTCWWJZsUMRNEZ8yS3.jpg" mos="" align="middle" fullscreen="" width="1275" height="1281" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Pedestal-FA300UK/dp/B0DTGXV537" target="_blank" rel="nofollow" data-dimension112="83eabeac-13d3-4a04-95c1-ef54cfedd05e" data-action="Deal Block" data-label="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension48="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension25="£199">FlexBreeze Pro Mist Pedestal & Table Fan: was £249 now £199</a></strong><br>Shark's FlexBreeze Pro Mist is Shark's smartest cooling fan yet. It uses a mist spray to keep you cool in hot weather, and can be used both indoors or outdoors. It offers immense versatility, with a portable design (complete with carry handle and even a bag) and can also be converted to a freestanding fan. It's also rechargeable, and features a removable misting attachment. <a class="view-deal button" href="https://www.amazon.co.uk/Shark-FlexBreeze-Cordless-Pedestal-FA300UK/dp/B0DTGXV537" target="_blank" rel="nofollow" data-dimension112="83eabeac-13d3-4a04-95c1-ef54cfedd05e" data-action="Deal Block" data-label="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension48="FlexBreeze Pro Mist Pedestal & Table Fan" data-dimension25="£199">View Deal</a></p></div><h3 class="article-body__section" id="section-running-shoes"><span>Running Shoes</span></h3><div class="product"><a data-dimension112="4aa92449-89ce-4b59-bc85-dedc8182d21d" data-action="Deal Block" data-label="Gel-Excite 11 (Women's)" data-dimension48="Gel-Excite 11 (Women's)" data-dimension25="£64" href="https://www.asics.com/gb/en-gb/gel-excite-11/p/1012B861-500.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1163px;"><p class="vanilla-image-block" style="padding-top:58.73%;"><img id="ApA8TRKTowTCiYpEXd3LDK" name="gel excite" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ApA8TRKTowTCiYpEXd3LDK.jpg" mos="" align="middle" fullscreen="" width="1163" height="683" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.asics.com/gb/en-gb/gel-excite-11/p/1012B861-500.html" target="_blank" rel="nofollow" data-dimension112="4aa92449-89ce-4b59-bc85-dedc8182d21d" data-action="Deal Block" data-label="Gel-Excite 11 (Women's)" data-dimension48="Gel-Excite 11 (Women's)" data-dimension25="£64">Gel-Excite 11 (Women's): was £80 now £64</a></strong><br>Asics members can now get the Gel-Excite 11 for £64, and it's free to sign up. Designed for running and fitness, these shoes bring a higher stack and a super soft and comfortable feel underfoot.<a class="view-deal button" href="https://www.asics.com/gb/en-gb/gel-excite-11/p/1012B861-500.html" target="_blank" rel="nofollow" data-dimension112="4aa92449-89ce-4b59-bc85-dedc8182d21d" data-action="Deal Block" data-label="Gel-Excite 11 (Women's)" data-dimension48="Gel-Excite 11 (Women's)" data-dimension25="£64">View Deal</a></p></div><div class="product"><a data-dimension112="ec16cc8a-0a56-4ce2-a367-0e6a93dd6763" data-action="Deal Block" data-label="Clifton 10 Road Running Shoes (Men's)" data-dimension48="Clifton 10 Road Running Shoes (Men's)" data-dimension25="£97" href="https://www.hoka.com/en/gb/sale-men/clifton-10/1162030S.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1932px;"><p class="vanilla-image-block" style="padding-top:81.11%;"><img id="bbp297WbQjnWA2WZBXtYCE" name="Clifton 10" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bbp297WbQjnWA2WZBXtYCE.jpg" mos="" align="middle" fullscreen="" width="1932" height="1567" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.hoka.com/en/gb/sale-men/clifton-10/1162030S.html" target="_blank" rel="nofollow" data-dimension112="ec16cc8a-0a56-4ce2-a367-0e6a93dd6763" data-action="Deal Block" data-label="Clifton 10 Road Running Shoes (Men's)" data-dimension48="Clifton 10 Road Running Shoes (Men's)" data-dimension25="£97">Clifton 10 Road Running Shoes (Men's): was £140 now £97</a></strong><br>The Hoka Clifton 10 is a cushioned daily trainer that offers a smooth and comfortable ride. It’s perfect for beginners, and also a great option for experienced runners who need a comfy shoe to eat up the miles.<a class="view-deal button" href="https://www.hoka.com/en/gb/sale-men/clifton-10/1162030S.html" target="_blank" rel="nofollow" data-dimension112="ec16cc8a-0a56-4ce2-a367-0e6a93dd6763" data-action="Deal Block" data-label="Clifton 10 Road Running Shoes (Men's)" data-dimension48="Clifton 10 Road Running Shoes (Men's)" data-dimension25="£97">View Deal</a></p></div><div class="product"><a data-dimension112="ad25368a-8e4d-4095-b9a8-5e29de0f32b5" data-action="Deal Block" data-label="Adizero Adios Pro 4 Shoes" data-dimension48="Adizero Adios Pro 4 Shoes" data-dimension25="£176" href="https://www.adidas.co.uk/adizero-adios-pro-4-shoes/JR1241.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:784px;"><p class="vanilla-image-block" style="padding-top:46.05%;"><img id="LjPhyFdUSs8zKoqNKpaxwn" name="adizero 4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LjPhyFdUSs8zKoqNKpaxwn.png" mos="" align="middle" fullscreen="" width="784" height="361" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.adidas.co.uk/adizero-adios-pro-4-shoes/JR1241.html" target="_blank" rel="nofollow" data-dimension112="ad25368a-8e4d-4095-b9a8-5e29de0f32b5" data-action="Deal Block" data-label="Adizero Adios Pro 4 Shoes" data-dimension48="Adizero Adios Pro 4 Shoes" data-dimension25="£176">Adizero Adios Pro 4 Shoes: was £220 now £176</a></strong><br>The Adizero Adios Pro 4 is aimed at runners who want to go fast. The carbon-infused ENERGYRODS 2.0 act like stiff plates inside the shoe, helping the foot roll smoothly from heel to toe. The shoe also features a rocker point in the midsole to help make each stride more efficient.<a class="view-deal button" href="https://www.adidas.co.uk/adizero-adios-pro-4-shoes/JR1241.html" target="_blank" rel="nofollow" data-dimension112="ad25368a-8e4d-4095-b9a8-5e29de0f32b5" data-action="Deal Block" data-label="Adizero Adios Pro 4 Shoes" data-dimension48="Adizero Adios Pro 4 Shoes" data-dimension25="£176">View Deal</a></p></div><h3 class="article-body__section" id="section-patio-garden"><span>Patio & Garden</span></h3><div class="product"><a data-dimension112="a2e9f3d8-b286-4aab-8132-c4d241ba8eba" data-action="Deal Block" data-label="GloBulb Solar String Lights" data-dimension48="GloBulb Solar String Lights" data-dimension25="£14" href="https://www.currys.co.uk/products/smart-garden-globulb-solar-string-lights-warm-white-set-of-20-10296839.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="qJZnnJyxCffo93ZeWta8kn" name="GloBulb Solar String Lights" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qJZnnJyxCffo93ZeWta8kn.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.currys.co.uk/products/smart-garden-globulb-solar-string-lights-warm-white-set-of-20-10296839.html" target="_blank" rel="nofollow" data-dimension112="a2e9f3d8-b286-4aab-8132-c4d241ba8eba" data-action="Deal Block" data-label="GloBulb Solar String Lights" data-dimension48="GloBulb Solar String Lights" data-dimension25="£14">GloBulb Solar String Lights: was £34 now £14</a></strong><br>Harness the power of the sun to light your garden through the night! This set gets you a 10m string of 20 solar powered bulbs. The warm white light helps create the perfect cozy atmosphere.<a class="view-deal button" href="https://www.currys.co.uk/products/smart-garden-globulb-solar-string-lights-warm-white-set-of-20-10296839.html" target="_blank" rel="nofollow" data-dimension112="a2e9f3d8-b286-4aab-8132-c4d241ba8eba" data-action="Deal Block" data-label="GloBulb Solar String Lights" data-dimension48="GloBulb Solar String Lights" data-dimension25="£14">View Deal</a></p></div><div class="product"><a data-dimension112="0d08ed78-8b74-41e3-8f5d-9e8eebd361e4" data-action="Deal Block" data-label="Outdoor Garden Patio Balcony Furniture" data-dimension48="Outdoor Garden Patio Balcony Furniture" data-dimension25="£84" href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ySochRXbLb2e4uk8bmhL56" name="Capri 2 Seater Rattan Bistro Set Outdoor Garden Patio Balcony Furniture 3 Pcs" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ySochRXbLb2e4uk8bmhL56.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow" data-dimension112="0d08ed78-8b74-41e3-8f5d-9e8eebd361e4" data-action="Deal Block" data-label="Outdoor Garden Patio Balcony Furniture" data-dimension48="Outdoor Garden Patio Balcony Furniture" data-dimension25="£84">Outdoor Garden Patio Balcony Furniture: was £99 now £84</a></strong><br>This patio set transforms your outdoor space, adding seating and dining space for just £84. You get two chairs and a table that fold away when not in use.<a class="view-deal button" href="https://www.amazon.co.uk/Garden-Vida-Outdoor-Balcony-Furniture/dp/B09VY7WJNT" target="_blank" rel="nofollow" data-dimension112="0d08ed78-8b74-41e3-8f5d-9e8eebd361e4" data-action="Deal Block" data-label="Outdoor Garden Patio Balcony Furniture" data-dimension48="Outdoor Garden Patio Balcony Furniture" data-dimension25="£84">View Deal</a></p></div><div class="product"><a data-dimension112="a36adb78-3f2a-412f-b980-b0cc62e12a3e" data-action="Deal Block" data-label="EasiGlide 330 Corded Lawn Mower" data-dimension48="EasiGlide 330 Corded Lawn Mower" data-dimension25="£99" href="https://www.currys.co.uk/products/flymo-easiglide-330-corded-lawn-mower-orange-and-grey-10275999.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="NiDWqDVmAfiK6J9hcqRgZa" name="EasiGlide 330 Corded Lawn Mower" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NiDWqDVmAfiK6J9hcqRgZa.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.currys.co.uk/products/flymo-easiglide-330-corded-lawn-mower-orange-and-grey-10275999.html" target="_blank" rel="nofollow" data-dimension112="a36adb78-3f2a-412f-b980-b0cc62e12a3e" data-action="Deal Block" data-label="EasiGlide 330 Corded Lawn Mower" data-dimension48="EasiGlide 330 Corded Lawn Mower" data-dimension25="£99">EasiGlide 330 Corded Lawn Mower: was £169 now £99</a></strong><br>An easy and affordable way to keep your grass in check — this Flymo mower is now on sale for £104. Reviewers love this one, with shoppers at Currys writing that it "Glides over the grass very easily." It's also lightweight, coming in at 8.33 kg.<a class="view-deal button" href="https://www.currys.co.uk/products/flymo-easiglide-330-corded-lawn-mower-orange-and-grey-10275999.html" target="_blank" rel="nofollow" data-dimension112="a36adb78-3f2a-412f-b980-b0cc62e12a3e" data-action="Deal Block" data-label="EasiGlide 330 Corded Lawn Mower" data-dimension48="EasiGlide 330 Corded Lawn Mower" data-dimension25="£99">View Deal</a></p></div><h3 class="article-body__section" id="section-tech"><span>Tech</span></h3><div class="product"><a data-dimension112="0ac49a94-e278-4a66-9c09-f3aceb8ca275" data-action="Deal Block" data-label="Fire TV Stick HD" data-dimension48="Fire TV Stick HD" data-dimension25="£25" href="https://www.amazon.co.uk/fire-tv-stick-hd/dp/B0DJGCX6Q2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1108px;"><p class="vanilla-image-block" style="padding-top:93.23%;"><img id="KuGTVfs9qg2Ak2hUofVVAQ" name="Fire TV Stick HD" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KuGTVfs9qg2Ak2hUofVVAQ.jpg" mos="" align="middle" fullscreen="" width="1108" height="1033" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you have a 4K TV, I recommend picking up a 4K streaming stick — but this is a nice discount if you have a HD TV. The 2026 Fire TV Stick HD is easier to set up than before and reduces clutter: it connects and draws power from your TV, so no need to find a power outlet.<a class="view-deal button" href="https://www.amazon.co.uk/fire-tv-stick-hd/dp/B0DJGCX6Q2" target="_blank" rel="nofollow" data-dimension112="0ac49a94-e278-4a66-9c09-f3aceb8ca275" data-action="Deal Block" data-label="Fire TV Stick HD" data-dimension48="Fire TV Stick HD" data-dimension25="£25">View Deal</a></p></div><div class="product"><a data-dimension112="389c1fa5-b567-4fbc-90eb-1845b0ef955e" data-action="Deal Block" data-label="10,000 mAh Portable Charger" data-dimension48="10,000 mAh Portable Charger" data-dimension25="£13" href="https://www.amazon.co.uk/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07PNL5STG" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1001px;"><p class="vanilla-image-block" style="padding-top:124.28%;"><img id="U3LvvKhsQa44bvLRGDGPuf" name="iniu-portable-charger.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/U3LvvKhsQa44bvLRGDGPuf.jpg" mos="" align="middle" fullscreen="" width="1001" height="1244" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07PNL5STG" target="_blank" rel="nofollow" data-dimension112="389c1fa5-b567-4fbc-90eb-1845b0ef955e" data-action="Deal Block" data-label="10,000 mAh Portable Charger" data-dimension48="10,000 mAh Portable Charger" data-dimension25="£13">10,000 mAh Portable Charger: was £29 now £13</a></strong><br>It has since lost its spot to a newer model, but the INIU 10000mAh Portable Charger is a previous winner on our list of the <a href="https://www.tomsguide.com/best-picks/best-portable-chargers">best power banks</a>. It offers two USB-A ports, fast device charging and a sizable battery that can keep your smartphone powered all day long.<a class="view-deal button" href="https://www.amazon.co.uk/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07PNL5STG" target="_blank" rel="nofollow" data-dimension112="389c1fa5-b567-4fbc-90eb-1845b0ef955e" data-action="Deal Block" data-label="10,000 mAh Portable Charger" data-dimension48="10,000 mAh Portable Charger" data-dimension25="£13">View Deal</a></p></div><div class="product"><a data-dimension112="eb6901a4-2dba-4573-bcc7-513a2cc2779e" data-action="Deal Block" data-label="iO2 Electric Toothbrush" data-dimension48="iO2 Electric Toothbrush" data-dimension25="£39" href="https://www.currys.co.uk/products/oralb-io2-electric-toothbrush-travel-case-calm-pink-10276943.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:88.70%;"><img id="aUqEeFnKyW7gS7kW3gXw6N" name="iO2 Electric Toothbrush" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aUqEeFnKyW7gS7kW3gXw6N.jpg" mos="" align="middle" fullscreen="" width="1000" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.currys.co.uk/products/oralb-io2-electric-toothbrush-travel-case-calm-pink-10276943.html" target="_blank" rel="nofollow" data-dimension112="eb6901a4-2dba-4573-bcc7-513a2cc2779e" data-action="Deal Block" data-label="iO2 Electric Toothbrush" data-dimension48="iO2 Electric Toothbrush" data-dimension25="£39">iO2 Electric Toothbrush: was £44 now £39</a></strong><br>This electric toothbrush from Oral-B is a great buy at any time of the year. The Oral-B iO2 has three cleaning modes and helps you protect your gums by warning you if you're using too much pressure. It also comes with a travel case.<br><strong>Price check: </strong><a href="https://www.amazon.co.uk/Oral-B-Electric-Toothbrush-Seasonal-Limited/dp/B0GD11MTDB" target="_blank" rel="nofollow"><strong>£39 @ Amazon</strong></a><a class="view-deal button" href="https://www.currys.co.uk/products/oralb-io2-electric-toothbrush-travel-case-calm-pink-10276943.html" target="_blank" rel="nofollow" data-dimension112="eb6901a4-2dba-4573-bcc7-513a2cc2779e" data-action="Deal Block" data-label="iO2 Electric Toothbrush" data-dimension48="iO2 Electric Toothbrush" data-dimension25="£39">View Deal</a></p></div><div class="product"><a data-dimension112="affc0752-d035-47fa-b1eb-f797077f9f33" data-action="Deal Block" data-label="Soundcore 3" data-dimension48="Soundcore 3" data-dimension25="£33" href="https://www.amazon.co.uk/Soundcore-Bluetooth-Diaphragm-Technology-Waterproof/dp/B08BCHKY52" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7gcodpoQrdpbyP43TcSY3f" name="Anker Soundcore 3 deal on white.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7gcodpoQrdpbyP43TcSY3f.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/anker-soundcore-3" data-dimension112="affc0752-d035-47fa-b1eb-f797077f9f33" data-action="Deal Block" data-label="Soundcore 3" data-dimension48="Soundcore 3" data-dimension25="£33">Anker Soundcore 3</a> is one of the <a href="https://www.tomsguide.com/best-picks/best-cheap-bluetooth-speakers">best cheap Bluetooth speakers</a> around. It delivers loud, well-balanced sound within an IPX7-rated design that can survive water and dust, as well as up to 24 hours of battery. The Soundcore 3's dual tweeter drivers, central mid/bass woofer and BassUp technology ensure you'll get powerful sound in any setting. Plus, SharePlay allows multiple Soundcore speakers to be synced for an even bigger sound.<a class="view-deal button" href="https://www.amazon.co.uk/Soundcore-Bluetooth-Diaphragm-Technology-Waterproof/dp/B08BCHKY52" target="_blank" rel="nofollow" data-dimension112="affc0752-d035-47fa-b1eb-f797077f9f33" data-action="Deal Block" data-label="Soundcore 3" data-dimension48="Soundcore 3" data-dimension25="£33">View Deal</a></p></div><div class="product"><a data-dimension112="8af055d1-2692-4df7-b6a7-2a30030f530c" data-action="Deal Block" data-label="AirPods 4" data-dimension48="AirPods 4" data-dimension25="£99" href="https://www.amazon.co.uk/Apple-Bluetooth-Headphones-Personalised-Effortless/dp/B0DGHWD7CT/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:120.00%;"><img id="kTKCG8gCBjg4vScr6CMgoN" name="AirPods 4 BG image.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kTKCG8gCBjg4vScr6CMgoN.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our AirPods 4 review we praised these earbuds for offering "pro-level features for less." This includes effective noise cancellation when you're on the go, as well as Conversational Awareness. So if someone starts talking to you you'll be able to hear them without touch the AirPods.<a class="view-deal button" href="https://www.amazon.co.uk/Apple-Bluetooth-Headphones-Personalised-Effortless/dp/B0DGHWD7CT/" target="_blank" rel="nofollow" data-dimension112="8af055d1-2692-4df7-b6a7-2a30030f530c" data-action="Deal Block" data-label="AirPods 4" data-dimension48="AirPods 4" data-dimension25="£99">View Deal</a></p></div><h3 class="article-body__section" id="section-tvs"><span>TVs</span></h3><div class="product"><a data-dimension112="6f21ee9a-404d-4f3a-9904-0348d375e125" data-action="Deal Block" data-label="55" U7QG Mini-LED TV" data-dimension48="55" U7QG Mini-LED TV" data-dimension25="£549" href="https://www.amazon.co.uk/Hisense-50U7QTUK-MiniLED-144Hz-Smart/dp/B0F7WJWY9H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="fuVkX53KX5S6YQZt8o7Bck" name="81LmlH2OGDL._SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fuVkX53KX5S6YQZt8o7Bck.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/Hisense-50U7QTUK-MiniLED-144Hz-Smart/dp/B0F7WJWY9H" target="_blank" rel="nofollow" data-dimension112="6f21ee9a-404d-4f3a-9904-0348d375e125" data-action="Deal Block" data-label='55" U7QG Mini-LED TV' data-dimension48='55" U7QG Mini-LED TV' data-dimension25="£549">55" U7QG Mini-LED TV: was £699 now £549</a></strong><br>This Mini-LED TV offers major upgrades for streamers and gamers. Built on a 165Hz refresh rate with a Game Mode Ultra mode, the Hisense U7QG is designed to be the best seat in the house. Add to that one serious sound system in its 2.1.2-channel speaker, and you've got a powerhouse of a TV with tons of flair.<br><strong>Price check: </strong><a href="https://www.argos.co.uk/product/7650934" target="_blank" rel="nofollow"><strong>£540 @ Argos</strong></a><a class="view-deal button" href="https://www.amazon.co.uk/Hisense-50U7QTUK-MiniLED-144Hz-Smart/dp/B0F7WJWY9H" target="_blank" rel="nofollow" data-dimension112="6f21ee9a-404d-4f3a-9904-0348d375e125" data-action="Deal Block" data-label="55" U7QG Mini-LED TV" data-dimension48="55" U7QG Mini-LED TV" data-dimension25="£549">View Deal</a></p></div><div class="product"><a data-dimension112="778101da-835f-4c67-8c9b-7067fa8886bf" data-action="Deal Block" data-label="42" C5 4K OLED TV" data-dimension48="42" C5 4K OLED TV" data-dimension25="$764" href="https://www.amazon.co.uk/LG-OLED65C55LA-65-Inch-Processor-Freeview/dp/B0F14943MR" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:60.60%;"><img id="oBaPUFAAexE2Jge2Vinp73" name="91bxFjk187L._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oBaPUFAAexE2Jge2Vinp73.jpg" mos="" align="middle" fullscreen="" width="1500" height="909" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.co.uk/LG-OLED65C55LA-65-Inch-Processor-Freeview/dp/B0F14943MR" target="_blank" rel="nofollow" data-dimension112="778101da-835f-4c67-8c9b-7067fa8886bf" data-action="Deal Block" data-label='42" C5 4K OLED TV' data-dimension48='42" C5 4K OLED TV' data-dimension25="$764">42" C5 4K OLED TV: was $1049 now $764</a></strong><br>The <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c5-oled-tv-review">LG C5 OLED</a> is built on an illustrious design that offers stellar brightness and color metrics. Self-emitting pixels allow it to spit out gorgeous contrast, and it offers a slew of features for gamers to enjoy their favorite experiences at breakneck speeds. We rank it as the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TV</a> you can buy right now.<a class="view-deal button" href="https://www.amazon.co.uk/LG-OLED65C55LA-65-Inch-Processor-Freeview/dp/B0F14943MR" target="_blank" rel="nofollow" data-dimension112="778101da-835f-4c67-8c9b-7067fa8886bf" data-action="Deal Block" data-label="42" C5 4K OLED TV" data-dimension48="42" C5 4K OLED TV" data-dimension25="$764">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 top new movies to stream this week on Netflix, Prime Video, HBO Max and more (May 19-25) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This week's slate of top new movies across <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> is particularly packed. In fact, pretty much all the major platforms are getting involved with Netflix, Prime Video, Hulu, Peacock and HBO Max offering new films. </p><p>In the premium streaming space, you buy (or rent) "The Super Mario Galaxy Movie." But if you don't want to cough up a PVOD fee, you can instead enjoy a new satirical comedy on Netflix, the return of Jack Ryan on Prime Video, or the entire "Kill Bill" saga in one seamless experience over on Peacock. And that's just the start of this week's new movie offerings. </p><p>With so many new streaming movies to cover, let's not waste time. Here are all the most noteworthy movies you can watch at home in the coming days. Plus, don't forget our guide to the <a href="">best new TV shows this week</a>. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="the-super-mario-galaxy-movie-pvod">'The Super Mario Galaxy 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/FdL2GorGdKc" allowfullscreen></iframe></div></div><p>“The Super Mario Galaxy Movie” blasts onto premium streaming this week. The sequel to the 2023 movie that brought Nintendo’s iconic plumber to the big screen is another sugar rush adventure, boasting rainbow-colored visuals, plenty of beloved gaming characters, and a plot as thin as paper. It’s a fun distraction, just don’t expect a story that's any more complex than the one you’d typically find in a Super Mario video game.</p><p>Now settled in the Mushroom Kingdom, Mario (Chris Pratt) and Luigi (Charlie Day) travel to the cosmos to help Princess Rosalina (Brie Larson). But much like the movie version of Princess Peach (Anya Taylor-Joy), she’s no damsel in distress, and is more than capable of fending off the villainous Bowser Jr. (Benny Safdie) with the help of her magical Lumas pals. Oh, and Jack Black returns as the bigger Bowser, and is again a real evil delight. </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GRL9HMKK/" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> from May 19</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYxA3O"></div>                            </div>                            <script src="https://kwizly.com/embed/XYxA3O.js" async></script><h2 id="lee-cronin-s-the-mummy-pvod">‘Lee Cronin’s The Mummy’ (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/XJ0uv-phsDk" allowfullscreen></iframe></div></div><p>The latest "Mummy" doesn’t star Tom Cruise or Brendan Fraser, but is instead a horror spin from Lee Cronin, director of “Evil Dead Rise.” It’s not so much an evolution of the franchise; instead, it’s a return to its roots. “Lee Cronin’s The Mummy” brings the series back to its Universal Monster roots (but Warner Bros is the distributor, so expect the film on HBO Max in the future). I’d love to say it’s also a return to form, but I didn’t care for this one. </p><p>The horror flick sees a journalist (Jack Reynor) stunned when his daughter is found eight years after going missing in Egypt. However, her homecoming turns dark when it becomes clear she’s been possessed by a sinister evil. Gore fans will love how bloody disgusting this movie gets, but it’s lacking in scares, and the bloated runtime is the real killer. Perhaps the return of Brendan Fraser's version of “The Mummy” will fare better in 2028.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GW94VLNH" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> from May 19</strong></em></p><h2 id="jack-ryan-ghost-war-prime-video">‘Jack Ryan: Ghost War’ (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/-4ZVFspRn3M" allowfullscreen></iframe></div></div><p>You can’t keep Jack Ryan down for long. The popular Prime Video series starring “The Office’s” John Krasinski as the titular CIA analyst-turned-superspy concluded after four seasons in 2023, but Ryan is back in this feature-length continuation of the franchise. The movie doesn’t premiere on Prime until Wednesday, but a few early reviews online suggest it’s basically more of the same, which I reckon most fans won’t mind. </p><p>Prime Video seems to be keeping the plot largely under wraps, and I’ll admit I haven't watched the original Jack Ryan series on Prime Video (I might have watched one episode on a plane several years ago). However, the logline reads, “Jack Ryan reunites with CIA operatives to navigate betrayal from an enemy who knows their moves and faces a past once thought settled.” Sure does sound like the plot of a Jack Ryan film to me!</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/Tom-Clancys-Jack-Ryan-Ghost/dp/B0GVB3C61B" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from May 20</strong></em></p><h2 id="arco-hulu">‘Arco’ (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/e4RrOe8IbI8" allowfullscreen></iframe></div></div><p>Nominated for a Critics' Choice Award, Golden Globe and Oscar, if you’re looking for an animated movie that's perfect for the whole family this week, my advice is to skip Mario and meet Arco instead. </p><p>This French movie is a little all-over-the-shop tonally, so it might not be suitable for very young audiences, but it’s got dazzling moments and a sweet story about finding family in unexpected places. Plus, the English-language dub packs the voices of Mark Ruffalo, Natalie Portman, Will Ferrell, Andy Samberg, America Ferrera, and Flea. Yes, the “Red Hot Chili Peppers" bassist.</p><p>Arco is a 10-year-old boy in a distant future where flight and time travel are possible. Frustrated that his parents deem him too young to fly, he steals his sister’s magical gear and accidentally gets stuck in the year 2075. Here, he meets a precocious young girl and her robot caretaker. The two set about on a quest to return Arco home and maybe even save the world. </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> from May 22</strong></em></p><h2 id="kill-bill-the-whole-bloody-affair-peacock">‘Kill Bill: The Whole Bloody Affair’ (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/-SzkFgEqB6Y" allowfullscreen></iframe></div></div><p>Director Quentin Tarantino has always said that he views “Kill Bill” as one single movie, rather than a two-parter, as it was originally released in 2003 and 2004. Now you can enjoy this martial arts masterpiece the way it was intended, thanks to “Kill Bill: The Whole Bloody Affair.” As you can probably surmise, this butt-numbingly long 253-minute action epic is “Kill Bill: Volume 1” and “Kill Bill: Volume 2” stitched together to become a single movie. And there’s also an animated short thrown in as a sweetener. </p><p>If you’ve not seen either “Kill Bill” movie yet, first of all, where have you been the last two decades, and second of all, “The Whole Bloody Affair” is the <em>perfect </em>excuse to catch up. The movie stars Uma Thurman as “The Bride,” a former assassin, betrayed by her once boss/lover and left for dead on the eve of her wedding day. Naturally, she swears bloody revenge on the eponymous Bill (David Carradine) and his gang of lethal killers. </p><p><em><strong>Watch on </strong></em><a href="https://www.peacocktv.com/watch/home" target="_blank" rel="nofollow"><em><strong>Peacock</strong></em></a><em><strong> from May 22</strong></em></p><h2 id="ladies-first-netflix">‘Ladies First’ (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/yeetI2DfbaE" allowfullscreen></iframe></div></div><p>Netflix’s new original comedy looks to bring together an exciting cast (Sacha Baron Cohen, Rosamund Pike, Richard E. Grant, Emily Mortimer and Charles Dance) while using its comedy to make an important point. It’s a movie that explores the power dynamics between men and women, and what would happen if the established societal norms were shifted.</p><p>Damien Sachs (Cohen) is living the good life. He has power, money, and a never-ending string of casual flings. But days before being named CEO at a leading ad agency, he awakes to his own personal nightmare: A parallel world where women call the shots. Locked in a corporate battle for control against the empowered Alex Fox (Pike), Damien has to get his head around this new world, and maybe he’ll learn a life lesson or two along the way.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81001524" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> from May 22</strong></em></p><h2 id="the-bride-hbo-max">‘The Bride!’ (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/IhgcUArO3Uo" allowfullscreen></iframe></div></div><p>If you’re the morbidly curious type, perhaps you’ll want to check out “The Bride!” this week on HBO Max. </p><p>My colleague, Malcolm McMillan, labeled it a frontrunner for the worst movie of 2026 earlier this year. I can’t fully agree with that assessment (it’s hard to see anything being worse in my books than “Return to Silent Hill”), but I can very much agree that it’s awful. It’s a mess of a movie that leaps between blaffingly silly scenes played with a curious seriousness and terrible attempts at dark comedy. Plus, it wastes a very talented cast list. </p><p>A new spin on Mary Shelley’s classic gothic novel, “The Bride!” sees a murdered woman (Jessie Buckley) brought back from the dead to serve as a companion to Frank (Christian Bale), a monster created by Dr. Frankenstein. In classic Bonnie and Clyde style, the two go on the lam, causing chaos everywhere they go, while the authorities hunt them down. </p><p><em><strong>Watch on </strong></em><a href="https://www.hbomax.com/movies/bride/b03ec8ba-0f53-4e50-b5a0-b83de4e44220" target="_blank" rel="nofollow"><em><strong>HBO Max</strong></em></a><em><strong> from May 22</strong></em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/5-new-netflix-movies-and-shows-you-need-to-stream-this-week-may-18-24-2026">5 new Netflix movies and shows you need to stream this week</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/best-prime-video-top-10-movies-here-are-the-3-worth-streaming-this-week-may-18-24">Prime Video top 10 movies — here are the 3 worth watching</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/7-top-new-shows-to-stream-this-week-the-boys-finale-rick-and-morty-and-more-may-18-24">7 top new shows to stream this week</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/movies/7-top-new-movies-to-stream-this-week-on-netflix-prime-video-hbo-max-and-more-may-19-25</link>
                                                                            <description>
                            <![CDATA[ It's set to be a very busy week for new movies across streaming services, with "Super Mario Galaxy Movie, "Jack Ryan" and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gSqzwLkmQnFxSEydCoguv</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Vszs9257HLfhCR5tVfYPDa-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 19 May 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Tue, 19 May 2026 12:32:14 +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/Vszs9257HLfhCR5tVfYPDa-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[John Krasinski in Jack Ryan Ghost War]]></media:description>                                                            <media:text><![CDATA[John Krasinski in Jack Ryan Ghost War]]></media:text>
                                <media:title type="plain"><![CDATA[John Krasinski in Jack Ryan Ghost War]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Vszs9257HLfhCR5tVfYPDa-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week's slate of top new movies across <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> is particularly packed. In fact, pretty much all the major platforms are getting involved with Netflix, Prime Video, Hulu, Peacock and HBO Max offering new films. </p><p>In the premium streaming space, you buy (or rent) "The Super Mario Galaxy Movie." But if you don't want to cough up a PVOD fee, you can instead enjoy a new satirical comedy on Netflix, the return of Jack Ryan on Prime Video, or the entire "Kill Bill" saga in one seamless experience over on Peacock. And that's just the start of this week's new movie offerings. </p><p>With so many new streaming movies to cover, let's not waste time. Here are all the most noteworthy movies you can watch at home in the coming days. Plus, don't forget our guide to the <a href="">best new TV shows this week</a>. </p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="the-super-mario-galaxy-movie-pvod">'The Super Mario Galaxy 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/FdL2GorGdKc" allowfullscreen></iframe></div></div><p>“The Super Mario Galaxy Movie” blasts onto premium streaming this week. The sequel to the 2023 movie that brought Nintendo’s iconic plumber to the big screen is another sugar rush adventure, boasting rainbow-colored visuals, plenty of beloved gaming characters, and a plot as thin as paper. It’s a fun distraction, just don’t expect a story that's any more complex than the one you’d typically find in a Super Mario video game.</p><p>Now settled in the Mushroom Kingdom, Mario (Chris Pratt) and Luigi (Charlie Day) travel to the cosmos to help Princess Rosalina (Brie Larson). But much like the movie version of Princess Peach (Anya Taylor-Joy), she’s no damsel in distress, and is more than capable of fending off the villainous Bowser Jr. (Benny Safdie) with the help of her magical Lumas pals. Oh, and Jack Black returns as the bigger Bowser, and is again a real evil delight. </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GRL9HMKK/" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> from May 19</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYxA3O"></div>                            </div>                            <script src="https://kwizly.com/embed/XYxA3O.js" async></script><h2 id="lee-cronin-s-the-mummy-pvod">‘Lee Cronin’s The Mummy’ (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/XJ0uv-phsDk" allowfullscreen></iframe></div></div><p>The latest "Mummy" doesn’t star Tom Cruise or Brendan Fraser, but is instead a horror spin from Lee Cronin, director of “Evil Dead Rise.” It’s not so much an evolution of the franchise; instead, it’s a return to its roots. “Lee Cronin’s The Mummy” brings the series back to its Universal Monster roots (but Warner Bros is the distributor, so expect the film on HBO Max in the future). I’d love to say it’s also a return to form, but I didn’t care for this one. </p><p>The horror flick sees a journalist (Jack Reynor) stunned when his daughter is found eight years after going missing in Egypt. However, her homecoming turns dark when it becomes clear she’s been possessed by a sinister evil. Gore fans will love how bloody disgusting this movie gets, but it’s lacking in scares, and the bloated runtime is the real killer. Perhaps the return of Brendan Fraser's version of “The Mummy” will fare better in 2028.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GW94VLNH" target="_blank" rel="nofollow"><em><strong>Prime Video (buy/rent)</strong></em></a><em><strong> from May 19</strong></em></p><h2 id="jack-ryan-ghost-war-prime-video">‘Jack Ryan: Ghost War’ (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/-4ZVFspRn3M" allowfullscreen></iframe></div></div><p>You can’t keep Jack Ryan down for long. The popular Prime Video series starring “The Office’s” John Krasinski as the titular CIA analyst-turned-superspy concluded after four seasons in 2023, but Ryan is back in this feature-length continuation of the franchise. The movie doesn’t premiere on Prime until Wednesday, but a few early reviews online suggest it’s basically more of the same, which I reckon most fans won’t mind. </p><p>Prime Video seems to be keeping the plot largely under wraps, and I’ll admit I haven't watched the original Jack Ryan series on Prime Video (I might have watched one episode on a plane several years ago). However, the logline reads, “Jack Ryan reunites with CIA operatives to navigate betrayal from an enemy who knows their moves and faces a past once thought settled.” Sure does sound like the plot of a Jack Ryan film to me!</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/Tom-Clancys-Jack-Ryan-Ghost/dp/B0GVB3C61B" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> from May 20</strong></em></p><h2 id="arco-hulu">‘Arco’ (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/e4RrOe8IbI8" allowfullscreen></iframe></div></div><p>Nominated for a Critics' Choice Award, Golden Globe and Oscar, if you’re looking for an animated movie that's perfect for the whole family this week, my advice is to skip Mario and meet Arco instead. </p><p>This French movie is a little all-over-the-shop tonally, so it might not be suitable for very young audiences, but it’s got dazzling moments and a sweet story about finding family in unexpected places. Plus, the English-language dub packs the voices of Mark Ruffalo, Natalie Portman, Will Ferrell, Andy Samberg, America Ferrera, and Flea. Yes, the “Red Hot Chili Peppers" bassist.</p><p>Arco is a 10-year-old boy in a distant future where flight and time travel are possible. Frustrated that his parents deem him too young to fly, he steals his sister’s magical gear and accidentally gets stuck in the year 2075. Here, he meets a precocious young girl and her robot caretaker. The two set about on a quest to return Arco home and maybe even save the world. </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> from May 22</strong></em></p><h2 id="kill-bill-the-whole-bloody-affair-peacock">‘Kill Bill: The Whole Bloody Affair’ (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/-SzkFgEqB6Y" allowfullscreen></iframe></div></div><p>Director Quentin Tarantino has always said that he views “Kill Bill” as one single movie, rather than a two-parter, as it was originally released in 2003 and 2004. Now you can enjoy this martial arts masterpiece the way it was intended, thanks to “Kill Bill: The Whole Bloody Affair.” As you can probably surmise, this butt-numbingly long 253-minute action epic is “Kill Bill: Volume 1” and “Kill Bill: Volume 2” stitched together to become a single movie. And there’s also an animated short thrown in as a sweetener. </p><p>If you’ve not seen either “Kill Bill” movie yet, first of all, where have you been the last two decades, and second of all, “The Whole Bloody Affair” is the <em>perfect </em>excuse to catch up. The movie stars Uma Thurman as “The Bride,” a former assassin, betrayed by her once boss/lover and left for dead on the eve of her wedding day. Naturally, she swears bloody revenge on the eponymous Bill (David Carradine) and his gang of lethal killers. </p><p><em><strong>Watch on </strong></em><a href="https://www.peacocktv.com/watch/home" target="_blank" rel="nofollow"><em><strong>Peacock</strong></em></a><em><strong> from May 22</strong></em></p><h2 id="ladies-first-netflix">‘Ladies First’ (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/yeetI2DfbaE" allowfullscreen></iframe></div></div><p>Netflix’s new original comedy looks to bring together an exciting cast (Sacha Baron Cohen, Rosamund Pike, Richard E. Grant, Emily Mortimer and Charles Dance) while using its comedy to make an important point. It’s a movie that explores the power dynamics between men and women, and what would happen if the established societal norms were shifted.</p><p>Damien Sachs (Cohen) is living the good life. He has power, money, and a never-ending string of casual flings. But days before being named CEO at a leading ad agency, he awakes to his own personal nightmare: A parallel world where women call the shots. Locked in a corporate battle for control against the empowered Alex Fox (Pike), Damien has to get his head around this new world, and maybe he’ll learn a life lesson or two along the way.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81001524" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> from May 22</strong></em></p><h2 id="the-bride-hbo-max">‘The Bride!’ (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/IhgcUArO3Uo" allowfullscreen></iframe></div></div><p>If you’re the morbidly curious type, perhaps you’ll want to check out “The Bride!” this week on HBO Max. </p><p>My colleague, Malcolm McMillan, labeled it a frontrunner for the worst movie of 2026 earlier this year. I can’t fully agree with that assessment (it’s hard to see anything being worse in my books than “Return to Silent Hill”), but I can very much agree that it’s awful. It’s a mess of a movie that leaps between blaffingly silly scenes played with a curious seriousness and terrible attempts at dark comedy. Plus, it wastes a very talented cast list. </p><p>A new spin on Mary Shelley’s classic gothic novel, “The Bride!” sees a murdered woman (Jessie Buckley) brought back from the dead to serve as a companion to Frank (Christian Bale), a monster created by Dr. Frankenstein. In classic Bonnie and Clyde style, the two go on the lam, causing chaos everywhere they go, while the authorities hunt them down. </p><p><em><strong>Watch on </strong></em><a href="https://www.hbomax.com/movies/bride/b03ec8ba-0f53-4e50-b5a0-b83de4e44220" target="_blank" rel="nofollow"><em><strong>HBO Max</strong></em></a><em><strong> from May 22</strong></em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/5-new-netflix-movies-and-shows-you-need-to-stream-this-week-may-18-24-2026">5 new Netflix movies and shows you need to stream this week</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/best-prime-video-top-10-movies-here-are-the-3-worth-streaming-this-week-may-18-24">Prime Video top 10 movies — here are the 3 worth watching</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/7-top-new-shows-to-stream-this-week-the-boys-finale-rick-and-morty-and-more-may-18-24">7 top new shows to stream this week</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best Prime Video top 10 movies — here are the 3 worth streaming this week (May 18-24) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Planning to unwind in front of <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> this week, but not sure which film you want to watch? Let me step in. Every week, we take a look at which movies are trending on <a href="https://www.tomsguide.com/tag/amazon">Amazon</a>'s <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> and narrow the Prime Video top 10 movies list down to just to three standout picks.</p><p>So, if you don't want to waste your time scrolling and want to skip straight to streaming, you've got a ready-made list of recommendations. You can find those three picks below, plus a rundown of everything that's currently in Prime Video's top 10 movies list. </p><p><em><strong>Note: this article is based on what's in the Prime Video U.S. top 10 as of Monday, May 18, 2026. </strong></em></p><h3 class="article-body__section" id="section-best-prime-video-top-10-movies-to-stream-right-now"><span>Best Prime Video top 10 movies to stream right now</span></h3><h2 id="regretting-you-2025-2">'Regretting You' (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/qub8lZlVlho" allowfullscreen></iframe></div></div><p>"Regretting You" is still at the top of Prime Video's movie chart, and if you're after romance, you might want to add it to your list. It comes recommended by our Senior Entertainment Editor, Rory Mellon, too. <a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-my-biggest-guilty-pleasure-movie-of-last-year-and-i-dont-regret-watching-it">When it</a><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-my-biggest-guilty-pleasure-movie-of-last-year-and-i-dont-regret-watching-it"> first landed on the streaming service, he said: </a>"I found myself getting swept up in the drama and intensity" (even if he conceded it has "major flaws").</p><p>If you're not familiar with the film, "Regretting You" is an adaptation of a Colleen Hoover novel. It introduces us to the Grant family — mother Morgan (Allison Williams), father Chris (Scott Eastwood), and daughter Clara (McKenna Grace) — plus Morgan’s sister, Jenny (Willa Fitzergerald), and her partner, Jonah (Dave Franco). After a car accident reveals a betrayal, the remaining members of the family are left trying to pick up the pieces and move on from their once-perfect life. And it's in that moment that Clara connects with a local bad boy, Miller Adams (Mason Thames). </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/Regretting-You-Josh-Boone/dp/B0GRGPZC5F/" target="_blank" rel="nofollow"><em><strong>"Regretting You" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-equalizer-2014">'The Equalizer' (2014)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/VjctHUEmutw" allowfullscreen></iframe></div></div><p>Prime Video's top 10 movies list is stuffed with action movies right now, and one of the best picks in the charts has to be "The Equalizer."</p><p>Antoine Fuqua's action thriller sees Denzel Washington taking on the role of ex-Marine Robert McCall. While McCall has dedicated himself to leading a quieter life, he meets a teenager (Chloë Grace Moretz) who's being trafficked by violent mobsters, and he simply cannot walk away from the situation. Thus, he comes out of retirement and returns to action, exacting vigilante justice on criminals that cross his path and helping those in need.</p><p>Oh, and if you enjoy "The Equalizer" and fancy a double feature, you could always follow it up with the sequel, which is <em>also </em>in the charts.</p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B00NXL9OBE/" target="_blank" rel="nofollow"><em><strong>"The Equalizer" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-running-man-2025">'The Running Man' (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/KD18ddeFuyM" allowfullscreen></iframe></div></div><p>If you're after even more action, you might want to check out Edgar Wright's take on "The Running Man," which is still in the top 10 weeks after the <a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-got-a-glen-powell-action-thriller-movie-that-could-be-the-shot-of-adrenaline-you-need-this-weekend">film first landed on Prime Video. </a></p><p>If you missed "The Running Man" last year and you're yet to stream it, this high-octane watch sees angry, down-on-his-luck everyman Ben Richards (Glen Powell) taking part in a deadly gameshow beloved by the population, just to try and win the cash he needs to buy some medicine for his sick daughter. His task? Go on for 30 days and avoid being taken out by the lethal "Hunters" who are out to get him for 30 days. Early on his run, Ben proves far more resilient than he first appeared, and he becomes a huge hit with the viewers at home... making him a threat to "The Network" and everything they've built in this dystopian near-future. </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FX1865W3/" target="_blank" rel="nofollow"><em><strong>"The Running Man" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODnk4e"></div>                            </div>                            <script src="https://kwizly.com/embed/ODnk4e.js" async></script><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"Regretting You" (2025)</li><li>"Despicable Me 4" (2024)</li><li>"Bang" (2025)</li><li>"The Equalizer" (2014)</li><li>"The Equalizer 2" (2018)</li><li>"Mechanic: Resurrection" (2016)</li><li>"Balls Up" (2026)</li><li>"The Running Man" (2025)</li><li>"Battleship" (2012)</li><li>"The Sandlot" (1993)</li></ol><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/prime-video/i-used-to-think-office-space-was-the-ultimate-workplace-movie-then-i-found-this-1997-hidden-gem-on-prime-video">I just found this hidden gem workplace movie on Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-must-watch-90-minute-thriller-movies-on-prime-video-and-one-of-them-contains-a-twist-youll-never-see-coming">3 must-watch 90-minute thriller movies to stream on Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-romantic-drama-series-is-a-pleasant-and-steamy-surprise-and-its-made-for-binge-watching">Prime Video's steamy new romantic drama is made for binge-watching</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/entertainment/prime-video/best-prime-video-top-10-movies-here-are-the-3-worth-streaming-this-week-may-18-24</link>
                                                                            <description>
                            <![CDATA[ Our weekly guide to the three best trending movies in Prime Video's top 10 movies list, including an intense action thriller with Denzel Washington. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nGmphsbwowyakxUTc9yiPD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 18 May 2026 09:56:33 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Prime Video]]></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/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg">
                                                            <media:credit><![CDATA[Prime Video; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Prime Video logo on a laser speed abstract background]]></media:description>                                                            <media:text><![CDATA[Prime Video logo on a laser speed abstract background]]></media:text>
                                <media:title type="plain"><![CDATA[Prime Video logo on a laser speed abstract background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wVka6ze5Yd9LKVrf7wLuca-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Planning to unwind in front of <a href="https://www.tomsguide.com/entertainment/streaming/prime-video">Prime Video</a> this week, but not sure which film you want to watch? Let me step in. Every week, we take a look at which movies are trending on <a href="https://www.tomsguide.com/tag/amazon">Amazon</a>'s <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> and narrow the Prime Video top 10 movies list down to just to three standout picks.</p><p>So, if you don't want to waste your time scrolling and want to skip straight to streaming, you've got a ready-made list of recommendations. You can find those three picks below, plus a rundown of everything that's currently in Prime Video's top 10 movies list. </p><p><em><strong>Note: this article is based on what's in the Prime Video U.S. top 10 as of Monday, May 18, 2026. </strong></em></p><h3 class="article-body__section" id="section-best-prime-video-top-10-movies-to-stream-right-now"><span>Best Prime Video top 10 movies to stream right now</span></h3><h2 id="regretting-you-2025-2">'Regretting You' (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/qub8lZlVlho" allowfullscreen></iframe></div></div><p>"Regretting You" is still at the top of Prime Video's movie chart, and if you're after romance, you might want to add it to your list. It comes recommended by our Senior Entertainment Editor, Rory Mellon, too. <a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-my-biggest-guilty-pleasure-movie-of-last-year-and-i-dont-regret-watching-it">When it</a><a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-added-my-biggest-guilty-pleasure-movie-of-last-year-and-i-dont-regret-watching-it"> first landed on the streaming service, he said: </a>"I found myself getting swept up in the drama and intensity" (even if he conceded it has "major flaws").</p><p>If you're not familiar with the film, "Regretting You" is an adaptation of a Colleen Hoover novel. It introduces us to the Grant family — mother Morgan (Allison Williams), father Chris (Scott Eastwood), and daughter Clara (McKenna Grace) — plus Morgan’s sister, Jenny (Willa Fitzergerald), and her partner, Jonah (Dave Franco). After a car accident reveals a betrayal, the remaining members of the family are left trying to pick up the pieces and move on from their once-perfect life. And it's in that moment that Clara connects with a local bad boy, Miller Adams (Mason Thames). </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/Regretting-You-Josh-Boone/dp/B0GRGPZC5F/" target="_blank" rel="nofollow"><em><strong>"Regretting You" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-equalizer-2014">'The Equalizer' (2014)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/VjctHUEmutw" allowfullscreen></iframe></div></div><p>Prime Video's top 10 movies list is stuffed with action movies right now, and one of the best picks in the charts has to be "The Equalizer."</p><p>Antoine Fuqua's action thriller sees Denzel Washington taking on the role of ex-Marine Robert McCall. While McCall has dedicated himself to leading a quieter life, he meets a teenager (Chloë Grace Moretz) who's being trafficked by violent mobsters, and he simply cannot walk away from the situation. Thus, he comes out of retirement and returns to action, exacting vigilante justice on criminals that cross his path and helping those in need.</p><p>Oh, and if you enjoy "The Equalizer" and fancy a double feature, you could always follow it up with the sequel, which is <em>also </em>in the charts.</p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B00NXL9OBE/" target="_blank" rel="nofollow"><em><strong>"The Equalizer" on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="the-running-man-2025">'The Running Man' (2025)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/KD18ddeFuyM" allowfullscreen></iframe></div></div><p>If you're after even more action, you might want to check out Edgar Wright's take on "The Running Man," which is still in the top 10 weeks after the <a href="https://www.tomsguide.com/entertainment/prime-video/prime-video-just-got-a-glen-powell-action-thriller-movie-that-could-be-the-shot-of-adrenaline-you-need-this-weekend">film first landed on Prime Video. </a></p><p>If you missed "The Running Man" last year and you're yet to stream it, this high-octane watch sees angry, down-on-his-luck everyman Ben Richards (Glen Powell) taking part in a deadly gameshow beloved by the population, just to try and win the cash he needs to buy some medicine for his sick daughter. His task? Go on for 30 days and avoid being taken out by the lethal "Hunters" who are out to get him for 30 days. Early on his run, Ben proves far more resilient than he first appeared, and he becomes a huge hit with the viewers at home... making him a threat to "The Network" and everything they've built in this dystopian near-future. </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B0FX1865W3/" target="_blank" rel="nofollow"><em><strong>"The Running Man" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODnk4e"></div>                            </div>                            <script src="https://kwizly.com/embed/ODnk4e.js" async></script><h3 class="article-body__section" id="section-prime-video-top-10-movies-right-now"><span>Prime Video top 10 movies right now</span></h3><ol start="1"><li>"Regretting You" (2025)</li><li>"Despicable Me 4" (2024)</li><li>"Bang" (2025)</li><li>"The Equalizer" (2014)</li><li>"The Equalizer 2" (2018)</li><li>"Mechanic: Resurrection" (2016)</li><li>"Balls Up" (2026)</li><li>"The Running Man" (2025)</li><li>"Battleship" (2012)</li><li>"The Sandlot" (1993)</li></ol><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/prime-video/i-used-to-think-office-space-was-the-ultimate-workplace-movie-then-i-found-this-1997-hidden-gem-on-prime-video">I just found this hidden gem workplace movie on Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-must-watch-90-minute-thriller-movies-on-prime-video-and-one-of-them-contains-a-twist-youll-never-see-coming">3 must-watch 90-minute thriller movies to stream on Prime Video</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-romantic-drama-series-is-a-pleasant-and-steamy-surprise-and-its-made-for-binge-watching">Prime Video's steamy new romantic drama is made for binge-watching</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I used ChatGPT to find video game deals on Amazon and scored 3 great games for under $120 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Video games are getting expensive fast. Between pricey current-gen consoles and new releases now costing as much as $80, gaming feels more like a luxury than ever.</p><p>I’ve stopped making impulse buys and started waiting for major sales instead — and honestly, it’s saved me a ton of money. Last year alone, I picked up games like Metal Gear Solid Delta: Snake Eater and Sonic Racing: CrossWorlds at steep discounts during Black Friday deals.</p><p>But I didn’t want to wait months for another sale event, so I asked <a href="https://www.tomsguide.com/ai/i-tested-gpt-5-5-instant-and-it-finally-stopped-overexplaining-everything">ChatGPT</a> to help me find the best physical game deals available right now.</p><p>The result? Three surprisingly great games for under $120 total on Amazon.</p><h2 id="nabbing-three-fairly-recent-bangers-for-cheap">Nabbing three fairly recent bangers for cheap</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:371px;"><p class="vanilla-image-block" style="padding-top:55.80%;"><img id="aqGgg4SVivRXXiUxfAEYRi" name="diablo-4-psn-tile.png" alt="Diablo 4 psn tile" src="https://cdn.mos.cms.futurecdn.net/aqGgg4SVivRXXiUxfAEYRi.png" mos="" align="middle" fullscreen="" width="371" height="207" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Blizzard)</span></figcaption></figure><p>This prompt gave ChatGPT all the information it needed to carry out my request: “I'm looking to buy a PS5, Xbox Series X|S, and Switch game, all together, on a budget of $120. Show me the 10 most highly rated games for each console that fit within that criteria. Make sure all the cheapest game deals you find are on Amazon.”</p><p>When the time came to deliver its results, the chatbot arrived with several categories for each console I mentioned to choose from: best overall budget pick, why that budget pick is a great buy, other games for each console that fall under my budget target and other highly rated games worth targeting on Amazon sales.</p><p>Most of ChatGPT’s standout Amazon gaming deals pointed out titles I already own, such as <em>Ratchet & Clank: Rift Apart</em>, <em>Psychonauts 2</em> and <em>Suikoden I & II HD Remastered</em>. But three games among ChatGPT’s Amazon gaming deal picks stood out to me for two reasons: the fact that I never played/bought them and the manageable prices attached to them.</p><p>The games I ended up choosing were:</p><ul><li>Dragon Quest VII Reimagined (PS5) — <a href="https://www.amazon.com/DRAGON-QUEST-VII-Reimagined-PlayStation-5/dp/B0FQW9Y385/ref=sr_1_1" target="_blank">$49.99</a> (down 17% from its list price of $59.99)</li><li>Diablo IV (Xbox Series X|S) — <a href="https://www.amazon.com/Diablo-IV-Xbox-X/dp/B0BPPRBTK2/ref=sr_1_1?crid=56IFSBLLWUQE&dib=eyJ2IjoiMSJ9.HeCbEASBfwBNL50O-tYkW23Rr2YbfHW7LdOv_BX_S_nAJxYpCbFELgh3ZQi24q46pluMPhyfZwUUbbtiXV-FDGRSVzYXxhCT_gC-RD7O9RalGpb35-9XICzeWgb4xPAuNsjTPXMMNs9wJrn-QS7EpWOGh370nR8s-1pnPxdRQOnYJECna5fs91gQ6RB7rhitY_coYug0BpX7bzg3tBk0oa1d7gwXXea0lyNyBbiQdIY.eyGochqOpRdiLjl9SXG9MYJ3o05eTjG2WFB51oS5ZgM&dib_tag=se&keywords=diablo%2Biv&qid=1778856428&sprefix=diablo%2Biv%2Caps%2C139&sr=8-1&th=1" target="_blank">$29.89</a> (down 57% from its list price of $69.99)</li><li>Super Mario RPG (Nintendo Switch) — <a href="https://www.amazon.com/Super-Mario-RPG-Nintendo-Switch-Version/dp/B0C8VKNJ1B/ref=sr_1_1" target="_blank">$34.38</a> (down 43% from its list price of $59.99)</li></ul><div class="product"><a data-dimension112="067c4741-8e1a-4d8f-9fe5-a974ccc9d607" data-action="Deal Block" data-label="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension48="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension25="$49.99" href="https://www.amazon.com/DRAGON-QUEST-VII-Reimagined-PlayStation-5/dp/B0FQW9Y385/ref=sr_1_1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:483px;"><p class="vanilla-image-block" style="padding-top:124.84%;"><img id="SMZZQujD7tG5BBvTMxNr8c" name="Screenshot 2026-05-15 165002" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SMZZQujD7tG5BBvTMxNr8c.png" mos="" align="middle" fullscreen="" width="483" height="603" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/DRAGON-QUEST-VII-Reimagined-PlayStation-5/dp/B0FQW9Y385/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="067c4741-8e1a-4d8f-9fe5-a974ccc9d607" data-action="Deal Block" data-label="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension48="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension25="$49.99">DRAGON QUEST VII Reimagined - PlayStation 5: was $59.99 now $49.99</a></strong><br>Dragon Quest VII Reimagined takes players on a colorful time-traveling adventure where restoring lost islands and solving mysteries in the past helps rebuild the present. Featuring a vibrant diorama-inspired art style, streamlined storytelling and improved turn-based combat with new vocational abilities, the remake modernizes the classic RPG while preserving its heartfelt charm.<a class="view-deal button" href="https://www.amazon.com/DRAGON-QUEST-VII-Reimagined-PlayStation-5/dp/B0FQW9Y385/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="067c4741-8e1a-4d8f-9fe5-a974ccc9d607" data-action="Deal Block" data-label="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension48="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension25="$49.99">View Deal</a></p></div><div class="product"><a data-dimension112="2555cf2d-3418-4cee-b1b8-f4d2e2058a5d" data-action="Deal Block" data-label="Diablo IV - Xbox Series X" data-dimension48="Diablo IV - Xbox Series X" data-dimension25="$29.99" href="https://www.amazon.com/Diablo-IV-Xbox-X/dp/B0BPPRBTK2/ref=sr_1_1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:795px;"><p class="vanilla-image-block" style="padding-top:119.50%;"><img id="s9dnBURdxN9q2nbGFBWGkJ" name="Screenshot 2026-05-15 165446" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/s9dnBURdxN9q2nbGFBWGkJ.png" mos="" align="middle" fullscreen="" width="795" height="950" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Diablo-IV-Xbox-X/dp/B0BPPRBTK2/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="2555cf2d-3418-4cee-b1b8-f4d2e2058a5d" data-action="Deal Block" data-label="Diablo IV - Xbox Series X" data-dimension48="Diablo IV - Xbox Series X" data-dimension25="$29.99">Diablo IV - Xbox Series X: was $69.99 now $29.99</a></strong><br>Diablo IV is a dark fantasy action RPG where players battle endless monsters, collect powerful loot and explore a massive online world filled with story-driven quests, co-op gameplay, PvP battles and ongoing seasonal content.<a class="view-deal button" href="https://www.amazon.com/Diablo-IV-Xbox-X/dp/B0BPPRBTK2/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="2555cf2d-3418-4cee-b1b8-f4d2e2058a5d" data-action="Deal Block" data-label="Diablo IV - Xbox Series X" data-dimension48="Diablo IV - Xbox Series X" data-dimension25="$29.99">View Deal</a></p></div><div class="product"><a data-dimension112="e250bc12-f107-469e-b67d-b64c99e9bb34" data-action="Deal Block" data-label="Super Mario RPG - Nintendo Switch (US Version)" data-dimension48="Super Mario RPG - Nintendo Switch (US Version)" data-dimension25="$34.99" href="https://www.amazon.com/Super-Mario-RPG-Nintendo-Switch-Version/dp/B0C8VKNJ1B/ref=sr_1_1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:618px;"><p class="vanilla-image-block" style="padding-top:143.53%;"><img id="KWh37kh6pYFKRocnVEt7m8" name="Super Mario" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KWh37kh6pYFKRocnVEt7m8.png" mos="" align="middle" fullscreen="" width="618" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Super-Mario-RPG-Nintendo-Switch-Version/dp/B0C8VKNJ1B/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="e250bc12-f107-469e-b67d-b64c99e9bb34" data-action="Deal Block" data-label="Super Mario RPG - Nintendo Switch (US Version)" data-dimension48="Super Mario RPG - Nintendo Switch (US Version)" data-dimension25="$34.99">Super Mario RPG - Nintendo Switch (US Version): was $59.99 now $34.99</a></strong><br>Super Mario RPG is a colorful RPG adventure where Mario teams up with Bowser, Peach and a quirky cast of allies to repair Star Road and stop the mischievous Smithy Gang.<a class="view-deal button" href="https://www.amazon.com/Super-Mario-RPG-Nintendo-Switch-Version/dp/B0C8VKNJ1B/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="e250bc12-f107-469e-b67d-b64c99e9bb34" data-action="Deal Block" data-label="Super Mario RPG - Nintendo Switch (US Version)" data-dimension48="Super Mario RPG - Nintendo Switch (US Version)" data-dimension25="$34.99">View Deal</a></p></div><p>All in all, I made out with all three games for under $120 by being greeted with a total of $114.26.</p><h2 id="other-amazon-gaming-deals-chatgpt-put-me-onto">Other Amazon gaming deals ChatGPT put me onto</h2><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="rp3SGtt2akqfSmMGLDQQCg" name="Battlefield 6" alt="Battlefield 6 screenshot" src="https://cdn.mos.cms.futurecdn.net/rp3SGtt2akqfSmMGLDQQCg.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: EA / Battlefield Studios)</span></figcaption></figure><p>ChatGPT’s loaded lineup of Amazon gaming deals also showcased a bunch of deals that are just too good to pass up if you haven’t jumped on them already. These are the six hookups that I’d take a peek at if I were you:</p><ul><li><em>Battlefield 6</em> (Xbox Series X) — <a href="https://www.amazon.com/Battlefield-6-Xbox-X/dp/B0FJHSBT3L/ref=sr_1_1?" target="_blank">$43.95</a> (down 37% from its list price of $69.99)</li><li><em>Cronos: The New Dawn</em> (PS5) — <a href="https://www.amazon.com/Cronos-PlayStation-5/dp/B0FKNMXH4V/ref=sr_1_1?" target="_blank">$28.41</a> (down 29% from its list price of $39.99)</li><li><em>DOOM: The Dark Ages</em> (Xbox Series X|S) — <a href="https://www.amazon.com/DOOM-Dark-Ages-Xbox-X/dp/B0DTRP1PC5/ref=sr_1_1" target="_blank">$33.99</a> (down 51% from its list price of $69.99)</li><li><em>Dragon Quest III HD-2D Remake</em> (Nintendo Switch) — <a href="https://www.amazon.com/DRAGON-QUEST-HD-2D-Remake-Nintendo-Switch/dp/B0D71SHR5B/ref=sr_1_1" target="_blank">$39.99</a> (down 33% from its list price of $59.99)</li><li><em>Sonic Racing: CrossWorlds</em> (Nintendo Switch 2) — <a href="https://www.amazon.com/Sonic-Racing-CrossWorlds-Amazon-Exclusive-PlayStation/dp/B0GGDJ9X51/ref=sr_1_1_sspa" target="_blank">$49.99</a> (down 29% from its list price of $69.99)</li><li><em>Split Fiction</em> (Xbox Series X|S Digital Code) — <a href="https://www.amazon.com/Split-Fiction-Standard-Steam-Online/dp/B0DV6TDDG1/ref=sr_1_1?" target="_blank">$34.99</a> (down 30% from its list price of $49.99)</li></ul><h2 id="final-thoughts">Final thoughts</h2><p>Saving as much money as possible whenever I’m in the mood to add some goated games to my blossoming collection has morphed into one of my favorite pastimes. </p><p>My three-pronged gaming console approach to keeping boredom at bay (the PS5, Xbox Series X and Switch) has held me down for years, thanks to the abundance of great (and cheap!) releases I’ve purchased for them all. </p><p>ChatGPT’s reliable assistance when it comes to finding great deals worked like a charm once again during my search for the best gaming deals on Amazon.</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-chatgpt-to-build-the-cheapest-possible-home-gym-from-walmart-heres-what-i-picked" target="_blank">I used ChatGPT to build the cheapest possible home gym from Walmart — here's what I picked</a></li><li><a href="https://www.tomsguide.com/sales-events/you-can-build-a-library-of-essential-ps5-games-for-the-cost-of-a-single-new-release-21-cant-miss-deals-from-usd5" target="_blank">You can build a library of essential PS5 games for the cost of a single new release — 21 can't-miss deals from $5</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/ive-been-buying-nintendo-switch-games-for-8-years-and-have-never-paid-full-price-7-secret-tips-i-use-to-save-on-video-games" target="_blank">I've been buying Nintendo Switch games for 8 years and have never paid full price: 7 secret tips I use to save on video games</a></li></ul><div data-widget-type="comparison" data-model-name="Apple iPhone 17e" class="hawk-root"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/i-used-chatgpt-to-find-video-game-deals-on-amazon-and-scored-3-great-games-for-under-usd120</link>
                                                                            <description>
                            <![CDATA[ I used ChatGPT to scour Amazon for the best video games deals it could find across the PS5, Xbox Series X|S and Switch and picked three games for under $120. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">B7z8bHVTBSN6cUrUSCRMNN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LDroNZhkpckEHetckkUheG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 18 May 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM.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/LDroNZhkpckEHetckkUheG-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Person Shopping Online]]></media:description>                                                            <media:text><![CDATA[Person Shopping Online]]></media:text>
                                <media:title type="plain"><![CDATA[Person Shopping Online]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LDroNZhkpckEHetckkUheG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Video games are getting expensive fast. Between pricey current-gen consoles and new releases now costing as much as $80, gaming feels more like a luxury than ever.</p><p>I’ve stopped making impulse buys and started waiting for major sales instead — and honestly, it’s saved me a ton of money. Last year alone, I picked up games like Metal Gear Solid Delta: Snake Eater and Sonic Racing: CrossWorlds at steep discounts during Black Friday deals.</p><p>But I didn’t want to wait months for another sale event, so I asked <a href="https://www.tomsguide.com/ai/i-tested-gpt-5-5-instant-and-it-finally-stopped-overexplaining-everything">ChatGPT</a> to help me find the best physical game deals available right now.</p><p>The result? Three surprisingly great games for under $120 total on Amazon.</p><h2 id="nabbing-three-fairly-recent-bangers-for-cheap">Nabbing three fairly recent bangers for cheap</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:371px;"><p class="vanilla-image-block" style="padding-top:55.80%;"><img id="aqGgg4SVivRXXiUxfAEYRi" name="diablo-4-psn-tile.png" alt="Diablo 4 psn tile" src="https://cdn.mos.cms.futurecdn.net/aqGgg4SVivRXXiUxfAEYRi.png" mos="" align="middle" fullscreen="" width="371" height="207" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Blizzard)</span></figcaption></figure><p>This prompt gave ChatGPT all the information it needed to carry out my request: “I'm looking to buy a PS5, Xbox Series X|S, and Switch game, all together, on a budget of $120. Show me the 10 most highly rated games for each console that fit within that criteria. Make sure all the cheapest game deals you find are on Amazon.”</p><p>When the time came to deliver its results, the chatbot arrived with several categories for each console I mentioned to choose from: best overall budget pick, why that budget pick is a great buy, other games for each console that fall under my budget target and other highly rated games worth targeting on Amazon sales.</p><p>Most of ChatGPT’s standout Amazon gaming deals pointed out titles I already own, such as <em>Ratchet & Clank: Rift Apart</em>, <em>Psychonauts 2</em> and <em>Suikoden I & II HD Remastered</em>. But three games among ChatGPT’s Amazon gaming deal picks stood out to me for two reasons: the fact that I never played/bought them and the manageable prices attached to them.</p><p>The games I ended up choosing were:</p><ul><li>Dragon Quest VII Reimagined (PS5) — <a href="https://www.amazon.com/DRAGON-QUEST-VII-Reimagined-PlayStation-5/dp/B0FQW9Y385/ref=sr_1_1" target="_blank">$49.99</a> (down 17% from its list price of $59.99)</li><li>Diablo IV (Xbox Series X|S) — <a href="https://www.amazon.com/Diablo-IV-Xbox-X/dp/B0BPPRBTK2/ref=sr_1_1?crid=56IFSBLLWUQE&dib=eyJ2IjoiMSJ9.HeCbEASBfwBNL50O-tYkW23Rr2YbfHW7LdOv_BX_S_nAJxYpCbFELgh3ZQi24q46pluMPhyfZwUUbbtiXV-FDGRSVzYXxhCT_gC-RD7O9RalGpb35-9XICzeWgb4xPAuNsjTPXMMNs9wJrn-QS7EpWOGh370nR8s-1pnPxdRQOnYJECna5fs91gQ6RB7rhitY_coYug0BpX7bzg3tBk0oa1d7gwXXea0lyNyBbiQdIY.eyGochqOpRdiLjl9SXG9MYJ3o05eTjG2WFB51oS5ZgM&dib_tag=se&keywords=diablo%2Biv&qid=1778856428&sprefix=diablo%2Biv%2Caps%2C139&sr=8-1&th=1" target="_blank">$29.89</a> (down 57% from its list price of $69.99)</li><li>Super Mario RPG (Nintendo Switch) — <a href="https://www.amazon.com/Super-Mario-RPG-Nintendo-Switch-Version/dp/B0C8VKNJ1B/ref=sr_1_1" target="_blank">$34.38</a> (down 43% from its list price of $59.99)</li></ul><div class="product"><a data-dimension112="067c4741-8e1a-4d8f-9fe5-a974ccc9d607" data-action="Deal Block" data-label="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension48="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension25="$49.99" href="https://www.amazon.com/DRAGON-QUEST-VII-Reimagined-PlayStation-5/dp/B0FQW9Y385/ref=sr_1_1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:483px;"><p class="vanilla-image-block" style="padding-top:124.84%;"><img id="SMZZQujD7tG5BBvTMxNr8c" name="Screenshot 2026-05-15 165002" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SMZZQujD7tG5BBvTMxNr8c.png" mos="" align="middle" fullscreen="" width="483" height="603" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/DRAGON-QUEST-VII-Reimagined-PlayStation-5/dp/B0FQW9Y385/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="067c4741-8e1a-4d8f-9fe5-a974ccc9d607" data-action="Deal Block" data-label="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension48="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension25="$49.99">DRAGON QUEST VII Reimagined - PlayStation 5: was $59.99 now $49.99</a></strong><br>Dragon Quest VII Reimagined takes players on a colorful time-traveling adventure where restoring lost islands and solving mysteries in the past helps rebuild the present. Featuring a vibrant diorama-inspired art style, streamlined storytelling and improved turn-based combat with new vocational abilities, the remake modernizes the classic RPG while preserving its heartfelt charm.<a class="view-deal button" href="https://www.amazon.com/DRAGON-QUEST-VII-Reimagined-PlayStation-5/dp/B0FQW9Y385/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="067c4741-8e1a-4d8f-9fe5-a974ccc9d607" data-action="Deal Block" data-label="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension48="DRAGON QUEST VII Reimagined - PlayStation 5" data-dimension25="$49.99">View Deal</a></p></div><div class="product"><a data-dimension112="2555cf2d-3418-4cee-b1b8-f4d2e2058a5d" data-action="Deal Block" data-label="Diablo IV - Xbox Series X" data-dimension48="Diablo IV - Xbox Series X" data-dimension25="$29.99" href="https://www.amazon.com/Diablo-IV-Xbox-X/dp/B0BPPRBTK2/ref=sr_1_1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:795px;"><p class="vanilla-image-block" style="padding-top:119.50%;"><img id="s9dnBURdxN9q2nbGFBWGkJ" name="Screenshot 2026-05-15 165446" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/s9dnBURdxN9q2nbGFBWGkJ.png" mos="" align="middle" fullscreen="" width="795" height="950" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Diablo-IV-Xbox-X/dp/B0BPPRBTK2/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="2555cf2d-3418-4cee-b1b8-f4d2e2058a5d" data-action="Deal Block" data-label="Diablo IV - Xbox Series X" data-dimension48="Diablo IV - Xbox Series X" data-dimension25="$29.99">Diablo IV - Xbox Series X: was $69.99 now $29.99</a></strong><br>Diablo IV is a dark fantasy action RPG where players battle endless monsters, collect powerful loot and explore a massive online world filled with story-driven quests, co-op gameplay, PvP battles and ongoing seasonal content.<a class="view-deal button" href="https://www.amazon.com/Diablo-IV-Xbox-X/dp/B0BPPRBTK2/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="2555cf2d-3418-4cee-b1b8-f4d2e2058a5d" data-action="Deal Block" data-label="Diablo IV - Xbox Series X" data-dimension48="Diablo IV - Xbox Series X" data-dimension25="$29.99">View Deal</a></p></div><div class="product"><a data-dimension112="e250bc12-f107-469e-b67d-b64c99e9bb34" data-action="Deal Block" data-label="Super Mario RPG - Nintendo Switch (US Version)" data-dimension48="Super Mario RPG - Nintendo Switch (US Version)" data-dimension25="$34.99" href="https://www.amazon.com/Super-Mario-RPG-Nintendo-Switch-Version/dp/B0C8VKNJ1B/ref=sr_1_1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:618px;"><p class="vanilla-image-block" style="padding-top:143.53%;"><img id="KWh37kh6pYFKRocnVEt7m8" name="Super Mario" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KWh37kh6pYFKRocnVEt7m8.png" mos="" align="middle" fullscreen="" width="618" height="887" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Super-Mario-RPG-Nintendo-Switch-Version/dp/B0C8VKNJ1B/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="e250bc12-f107-469e-b67d-b64c99e9bb34" data-action="Deal Block" data-label="Super Mario RPG - Nintendo Switch (US Version)" data-dimension48="Super Mario RPG - Nintendo Switch (US Version)" data-dimension25="$34.99">Super Mario RPG - Nintendo Switch (US Version): was $59.99 now $34.99</a></strong><br>Super Mario RPG is a colorful RPG adventure where Mario teams up with Bowser, Peach and a quirky cast of allies to repair Star Road and stop the mischievous Smithy Gang.<a class="view-deal button" href="https://www.amazon.com/Super-Mario-RPG-Nintendo-Switch-Version/dp/B0C8VKNJ1B/ref=sr_1_1" target="_blank" rel="nofollow" data-dimension112="e250bc12-f107-469e-b67d-b64c99e9bb34" data-action="Deal Block" data-label="Super Mario RPG - Nintendo Switch (US Version)" data-dimension48="Super Mario RPG - Nintendo Switch (US Version)" data-dimension25="$34.99">View Deal</a></p></div><p>All in all, I made out with all three games for under $120 by being greeted with a total of $114.26.</p><h2 id="other-amazon-gaming-deals-chatgpt-put-me-onto">Other Amazon gaming deals ChatGPT put me onto</h2><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="rp3SGtt2akqfSmMGLDQQCg" name="Battlefield 6" alt="Battlefield 6 screenshot" src="https://cdn.mos.cms.futurecdn.net/rp3SGtt2akqfSmMGLDQQCg.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: EA / Battlefield Studios)</span></figcaption></figure><p>ChatGPT’s loaded lineup of Amazon gaming deals also showcased a bunch of deals that are just too good to pass up if you haven’t jumped on them already. These are the six hookups that I’d take a peek at if I were you:</p><ul><li><em>Battlefield 6</em> (Xbox Series X) — <a href="https://www.amazon.com/Battlefield-6-Xbox-X/dp/B0FJHSBT3L/ref=sr_1_1?" target="_blank">$43.95</a> (down 37% from its list price of $69.99)</li><li><em>Cronos: The New Dawn</em> (PS5) — <a href="https://www.amazon.com/Cronos-PlayStation-5/dp/B0FKNMXH4V/ref=sr_1_1?" target="_blank">$28.41</a> (down 29% from its list price of $39.99)</li><li><em>DOOM: The Dark Ages</em> (Xbox Series X|S) — <a href="https://www.amazon.com/DOOM-Dark-Ages-Xbox-X/dp/B0DTRP1PC5/ref=sr_1_1" target="_blank">$33.99</a> (down 51% from its list price of $69.99)</li><li><em>Dragon Quest III HD-2D Remake</em> (Nintendo Switch) — <a href="https://www.amazon.com/DRAGON-QUEST-HD-2D-Remake-Nintendo-Switch/dp/B0D71SHR5B/ref=sr_1_1" target="_blank">$39.99</a> (down 33% from its list price of $59.99)</li><li><em>Sonic Racing: CrossWorlds</em> (Nintendo Switch 2) — <a href="https://www.amazon.com/Sonic-Racing-CrossWorlds-Amazon-Exclusive-PlayStation/dp/B0GGDJ9X51/ref=sr_1_1_sspa" target="_blank">$49.99</a> (down 29% from its list price of $69.99)</li><li><em>Split Fiction</em> (Xbox Series X|S Digital Code) — <a href="https://www.amazon.com/Split-Fiction-Standard-Steam-Online/dp/B0DV6TDDG1/ref=sr_1_1?" target="_blank">$34.99</a> (down 30% from its list price of $49.99)</li></ul><h2 id="final-thoughts">Final thoughts</h2><p>Saving as much money as possible whenever I’m in the mood to add some goated games to my blossoming collection has morphed into one of my favorite pastimes. </p><p>My three-pronged gaming console approach to keeping boredom at bay (the PS5, Xbox Series X and Switch) has held me down for years, thanks to the abundance of great (and cheap!) releases I’ve purchased for them all. </p><p>ChatGPT’s reliable assistance when it comes to finding great deals worked like a charm once again during my search for the best gaming deals on Amazon.</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-chatgpt-to-build-the-cheapest-possible-home-gym-from-walmart-heres-what-i-picked" target="_blank">I used ChatGPT to build the cheapest possible home gym from Walmart — here's what I picked</a></li><li><a href="https://www.tomsguide.com/sales-events/you-can-build-a-library-of-essential-ps5-games-for-the-cost-of-a-single-new-release-21-cant-miss-deals-from-usd5" target="_blank">You can build a library of essential PS5 games for the cost of a single new release — 21 can't-miss deals from $5</a></li><li><a href="https://www.tomsguide.com/gaming/nintendo/ive-been-buying-nintendo-switch-games-for-8-years-and-have-never-paid-full-price-7-secret-tips-i-use-to-save-on-video-games" target="_blank">I've been buying Nintendo Switch games for 8 years and have never paid full price: 7 secret tips I use to save on video games</a></li></ul><div data-widget-type="comparison" data-model-name="Apple iPhone 17e" class="hawk-root"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>